Cloudkit выдает ошибку при попытке сохранить запись

Я пытаюсь просто сохранить запись в частной базе данных пользователей, но когда я запускаю privateDB.saveRecord(), я получаю сообщение об ошибке

Not Authenticated" (9/1002); "CloudKit access was denied by user settings"; Retry after 3.0 seconds>.

Эта учетная запись может входить в панель инструментов cloudkit, поэтому она является разработчиком приложения. Какие другие проблемы могут вызвать это? Любая помощь будет очень признательна, я застрял на этом так долго.

Вот мой код:

//variable instantiation
container = CKContainer.defaultContainer()
println(container.containerIdentifier)
publicDB = container.publicCloudDatabase
privateDB = container.privateCloudDatabase

//save record code
let passRecord = CKRecord(recordType: "Password")
passRecord.setValue("testytestPow", forKey: "title")
passRecord.setValue("password02", forKey: "value")
privateDB.saveRecord(passRecord, completionHandler: { (record, error) -> Void in
    if (error != nil) {
        println(error)
    } else {
        NSLog("Saved in cloudkit")
        self.fetchTodos()
    }
})

6 ответов

Решение

Я обнаружил, что вообще не могу подключиться к CloudKit, пока не перейду на диск iCloud; в моем случае я смог сделать это в симуляторе. Также вы не можете войти в iCloud на симуляторе, если у вас настроена двухфакторная аутентификация.

Произошло то же самое, потому что я пытался добавить много записей из MutableArray. Мне пришлось делать рекурсивные вызовы saveRecord, чтобы исправить эту проблему.

MyObject *obj = [arrayOfObjects ObjectAtIndex:index];
[self addRecord];

а затем в методе addRecord

- (void) addRecord {
    // if all objects added, exit recursive method
    if(index == [arrayOfObjects count]) {
        return;
    }

    MyObject *obj = [arrayOfObjects ObjectAtIndex:index];

    [publicDatabase saveRecord:rec completionHander:^(CKRecord *myRec, NSError *error) {
    if (!error) {
        index++
        [self addRecord];

    }
}

Я получал эту ошибку, пытаясь загрузить список записей в базу данных одновременно. Когда я сделал это по одному (ожидание ответа перед загрузкой следующего), проблема ушла.

Я получил эту ошибку, когда попытался создать пользовательский CKRecordZone и одновременно сохранить новый CKRecord. Я исправил проблему, поместив сохранение CKRecord в блок завершения метода CKModifyRecordZone.

У меня была такая же проблема с симулятором, пока я не сделал что-то вроде этого:

CKContainer.defaultContainer().accountStatusWithCompletionHandler { (accountStat, error) in
        if (accountStat == .Available) {
            print("iCloud is available")
            for wishlist in wl {
                let wlRecord = CKRecord(recordType: "WishList")
                wlRecord.setObject(wishlist.type, forKey: "type")
                wlRecord.setObject(wishlist.term_id, forKey: "term_id")

                publicDB.saveRecord(wlRecord) {
                    record, error in
                    if error != nil {
                        print(error?.localizedDescription)
                    } else {
                        print(record?.objectForKey("type") as! String + " recorded")
                    }
                }
            }
        }
        else {
            print("iCloud is not available")
        }
    }

Надеюсь, поможет.

Для меня я звонил "сохранить новые данные" и "получить данные" и "обновить полученные данные" в том же методе. После удаления "сохранить новые данные" все снова работает нормально.

Другие вопросы по тегам