如何接收有关与我共享的logging中所做更改的cloudkit通知?
我在两个不同的设备上有两个icloud帐户( A和B )。 ( A )我把ckrecord分享给另一个( B ):
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)
当第二个设备( B )确实接受了cloudkit共享时,我获取logging并订阅更改:
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) }
现在从设备A我成功 (我确信,更改保存在iCloud)执行更新logging与他人共享。 但是设备B不知道,除非我再次手动获取logging。
但从另一方面来说,它运作得很好。
如果我在与我共享的logging(在设备B上 )上成功执行更新,则设备A会收到有关更改的通知,并且一切正常。 是什么造成了差异?
如何订阅与我共享的logging更改?
PS时,我将能够开始200或甚至更多的人谁将帮助我这个。
iOS 11,Swift 4,Xcode 9
这是我的清单,用于debugging订阅通知没有按预期的方式出现。 听起来你可能已经排除了其中的一些。
- 确保该应用程序已注册通知
- 确保在此应用的设备上启用通知
- 确保所有设备都使用相同的容器
- 在下一次应用程序启动时,使用
fetchAllSubscriptionsWithCompletionHandler
和NSLog每个子细节(特别是:subscriptionID,触发器选项,loggingtypes和谓词)读取所有订阅。 validation预期的潜艇是否存在。 validation每个子句的谓词是否符合预期(在这种情况下,比较两个设备上的谓词)。
在以下情况下,我浪费了一大堆时间来debugging“缺less”通知:
- 我本地构build的版本使用了TEST环境,TestFlight用户正在访问PROD环境。 debugging步骤2发现这一点。
- 当无意中重新使用订阅ID时,每个新的子都覆盖了前一个。 debugging步骤4最终揭示了这个问题
到目前为止,这四个debugging步骤帮助我理解了所有“丢失通知”问题。 一旦我明白了为什么notifs没有出现,这缩小了哪个代码块负责。