fs_tigre
fs_tigre

Reputation: 10738

CKShare - Failed to modify some records error - CloudKit

I'm trying to share a record with other users in CloudKit but I keep getting an error. When I tap one of the items/records on the table I'm presented with the UICloudSharingController and I can see the iMessage app icon, but when I tap on it I get an error and the UICloudSharingController disappears, the funny thing is that even after the error I can still continue using the app.

Here is what I have.

Code

var items = [CKRecord]()
var itemName: String?

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    let item = items[indexPath.row]

    let share = CKShare(rootRecord: item)

    if let itemName = item.object(forKey: "name") as? String {
        self.itemName = item.object(forKey: "name") as? String
        share[CKShareTitleKey] = "Sharing \(itemName)" as CKRecordValue?
    } else {
        share[CKShareTitleKey] = "" as CKRecordValue?
        self.itemName = "item"
    }
    share[CKShareTypeKey] = "bundle.Identifier.Here" as CKRecordValue
    prepareToShare(share: share, record: item)
}


private func prepareToShare(share: CKShare, record: CKRecord){

    let sharingViewController = UICloudSharingController(preparationHandler: {(UICloudSharingController, handler: @escaping (CKShare?, CKContainer?, Error?) -> Void) in

        let modRecordsList = CKModifyRecordsOperation(recordsToSave: [record, share], recordIDsToDelete: nil)

        modRecordsList.modifyRecordsCompletionBlock = {
            (record, recordID, error) in

            handler(share, CKContainer.default(), error)
        }
        CKContainer.default().privateCloudDatabase.add(modRecordsList)
    })

    sharingViewController.delegate = self

    sharingViewController.availablePermissions = [.allowPrivate]
    self.navigationController?.present(sharingViewController, animated:true, completion:nil)
}



// Delegate Methods:
func cloudSharingControllerDidSaveShare(_ csc: UICloudSharingController) {
    print("saved successfully")
}
func cloudSharingController(_ csc: UICloudSharingController, failedToSaveShareWithError error: Error) {
    print("failed to save: \(error.localizedDescription)")// the error is generated in this method
}
func itemThumbnailData(for csc: UICloudSharingController) -> Data? {
    return nil //You can set a hero image in your share sheet. Nil uses the default.
}
func itemTitle(for csc: UICloudSharingController) -> String? {
    return self.itemName
}

ERROR

Failed to modify some records

Here is what I see...

enter image description here

Any idea what could be wrong?

EDIT:

By the way, the error is generated in the cloudSharingController failedToSaveShareWithError method.

Upvotes: 0

Views: 790

Answers (3)

qwerty-reloader
qwerty-reloader

Reputation: 201

Try to add this to your info.plist

<key>CKSharingSupported</key>
<true/>

Upvotes: 0

Brian M
Brian M

Reputation: 3932

Looks like you're trying to share in the default zone which isn't allowed. From the docs here

Sharing is only supported in zones with the CKRecordZoneCapabilitySharing capability. The default zone does not support sharing.

So you should set up a custom zone in your private database, and save your share and records there.

Upvotes: 1

Brian M
Brian M

Reputation: 3932

Possibly it is from the way you're trying to instantiate the UICloudSharingController? I cribbed my directly from the docs and it works:

let cloudSharingController = UICloudSharingController { [weak self] (controller, completion: @escaping (CKShare?, CKContainer?, Error?) -> Void) in
    guard let `self` = self else {
       return
    }
    self.share(rootRecord: rootRecord, completion: completion)
}

If that's not the problem it's something with either one or both of the records themselves. If you upload the record without trying to share it, does it work?

EDIT TO ADD:

What is the CKShareTypeKey? I don't use that in my app. Also I set my system fields differently:

share?[CKShare.SystemFieldKey.title] = "Something"

Upvotes: 1

Related Questions