如何接收有关与我共享的记录中所做更改的cloudkit通知?
我在两个不同的设备上有两个icloud帐户(A和B)。从其中一人(一个)我分享ckrecord到另一个(乙)是这样的:如何接收有关与我共享的记录中所做更改的cloudkit通知?
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)
当第二设备(乙)没有接受cloudkit份额我取的记录和认购的变化:
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)
}
从设备
现在我成功地(我知道这一点,改变保存在iCloud中)进行更新Ø与他人分享的记录。但设备B不知道这一点,除非我再次手动获取记录。
但从另一方面来说,它工作得很好。
如果我成功上则设备一个 mnagically得到一个变革,一切通知是罚款与我分享(器件乙)的记录进行更新。什么改变了?
如何订阅与我共享的记录更改?
P.S当我将能够开始200或甚至更多的人来帮助我这个人。
iOS的11,斯威夫特4时,Xcode 9
这是我在调试无法按预期出现订阅通知清单。听起来你可能已经排除了其中一些。
- 确保应用程序注册为通知
- 确保通知在设备上启用该应用
- 确保所有设备都使用相同的容器
- 在下一个应用程序启动时,读所有订阅使用
fetchAllSubscriptionsWithCompletionHandler
和NSLog每个子的详细信息(特别是:subscriptionID,触发选项,记录类型和谓词)。验证预期的潜艇是否存在。验证每个子句的谓词是否符合期望值(在这种情况下,比较两个设备上找到的谓词)。
我浪费了很多时间调试时“失踪”的通知:
- 我本地建立的版本用的是测试环境和TestFlight用户进行访问PROD环境。调试步骤2发现了这一点。
- 当无意中重新使用订阅ID时,每个新版本都覆盖了之前的版本。调试步骤4最终发现问题
到目前为止,这四个调试步骤帮助我理解了所有“缺少通知”问题。一旦我明白了为什么notifs没有出现,就缩小了哪个代码块的责任。
要提取订阅,您需要首先订阅更改...并且这种情况...它不工作...我订阅更改,但它仍然没有从记录的所有者那里收到通知(但是所有者从其他用户获得通知) –
当您在用户的计算机上调用FetchAllSubscriptions时,会找到多少个潜在客户?你有多少期望? – Thunk
获取所有订阅的原因是什么?他们可能会被提取用于数据库。我想我需要他们共享数据库,对吧?我会在一天内检查它...... –
我的理解是 - “当所有者修改共享记录时,其他设备没有获得有关通知的更新,但其他方式运行良好”? – manismku
......现在是这样的 –
您是否注册过其他设备上的推送通知?推送通知的 – manismku