¿Cómo recibir notificaciones de CloudKit sobre los cambios realizados en el registro compartido conmigo?
Tengo dos cuentas de icloud (A yB) en dos dispositivos diferentes. De uno de ellos (A) Comparto ckrecord a otro (B) Me gusta esto:
let controller = UICloudSharingController { controller, preparationCompletionHandler in
let share = CKShare(rootRecord: record)
share[CKShareTitleKey] = "title" as CKRecordValue
share[CKShareTypeKey] = "pl.blueworld.fieldservice" as CKRecordValue
share.publicPermission = .readWrite
let modifyOperation = CKModifyRecordsOperation(recordsToSave: [record, share], recordIDsToDelete: nil)
modifyOperation.savePolicy = .ifServerRecordUnchanged
modifyOperation.perRecordCompletionBlock = { record, error in
print(error?.localizedDescription ?? "")
}
modifyOperation.modifyRecordsCompletionBlock = { records, recordIds, error in
print(share.url)
preparationCompletionHandler(share, CloudAssistant.shared.container, error)
}
CloudAssistant.shared.container.privateCloudDatabase.add(modifyOperation)
}
controller.delegate = self
UIViewController.top()?.present(controller, animated: true)
Cuando segundo dispositivo (B) acepté el recurso compartido de CloudKit. Obtuve el registro y me suscribo a los cambios:
func application(_ application: UIApplication, userDidAcceptCloudKitShareWith cloudKitShareMetadata: CKShareMetadata) {
let acceptSharesOperation = CKAcceptSharesOperation(shareMetadatas: [cloudKitShareMetadata])
acceptSharesOperation.perShareCompletionBlock = { metadata, share, error in
if let error = error {
UIAlertController.show(withMessage: error.localizedDescription)
} else {
let operation = CKFetchRecordsOperation(recordIDs: [cloudKitShareMetadata.rootRecordID])
operation.perRecordCompletionBlock = { record, _, error in
if let error = error {
UIAlertController.show(withMessage: error.localizedDescription)
} else if let record = record {
CloudAssistant.shared.save(records: [record], recordIDsToDelete: [])
let options: CKQuerySubscriptionOptions = [.firesOnRecordCreation, .firesOnRecordUpdate, .firesOnRecordDeletion]
let territorySubscription = CKQuerySubscription(recordType: "Territory", predicate: NSPredicate(value: true), options: options)
let notificationInfo = CKNotificationInfo()
notificationInfo.shouldBadge = false
notificationInfo.shouldSendContentAvailable = true
territorySubscription.notificationInfo = notificationInfo
CloudAssistant.shared.sharedDatabase?.save(territorySubscription) { _, _ in }
}
}
CloudAssistant.shared.container.sharedCloudDatabase.add(operation)
}
}
acceptSharesOperation.qualityOfService = .userInteractive
CKContainer(identifier: cloudKitShareMetadata.containerIdentifier).add(acceptSharesOperation)
}
Ahora desde dispositivoA I con éxito (Estoy seguro de eso, los cambios se guardan en iCloud) realice una actualización en un registro compartido con otros. Pero dispositivoB no sabe sobre eso, a menos que busque el registro manualmente una vez más.
Pero desde el otro lado, funciona bastante bien.
Si realizo con éxito una actualización en un registro compartido conmigo (en el dispositivoB) luego dispositivoA Mágicamente recibe una notificación sobre el cambio y todo está bien. ¿Qué hace la diferencia?
¿Cómo suscribirse a los cambios en un registro compartido conmigo?
P.D., cuando pueda, comenzaré una partida de 200 o incluso más para alguien que me ayude con esto.
iOS 11, Swift 4, Xcode 9