6
votes

I am trying to simply save a record to a users private database but when I run privateDB.saveRecord() I get an error saying

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

This account is able to sign into the cloudkit dashboard so it is a developer for the application. What other issues might cause this? Any help would be really appreciated, I have been stuck on this for so long.

Here is my code:

//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

6 Answers

16
votes

I found I couldn't connect to CloudKit at all until I upgrade to iCloud drive; in my case I was able to do it in the simulator. Also you can't log in to iCloud on the simulator if you have 2-factor authentication set up, it seems.

2
votes

I was getting this error trying to upload a list of records to the database all at once. When I did it one at a time (waiting for the reply before uploading the next one) the problem went away.

2
votes

Had the same thing happening because I was trying to add many records from a MutableArray. I had to do recursive calls to the saveRecord in order to fix this issue.

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

and then in the addRecord method

- (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];

    }
}
1
votes

I got this error when I tried to create a custom CKRecordZone and save a new CKRecord simultaneously. I fixed the problem by putting the CKRecord save in the completion block of the CKModifyRecordZone method.

0
votes

For me I was calling "save New data" and "retrieve data" and "update retrieved data" in the same method. Once removed "save new data" all working ok again.

0
votes

I had the same problem with the simulator until I did something like this:

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")
        }
    }

Hope it helps.