【发布时间】:2018-03-28 18:51:13
【问题描述】:
我在两个不同的设备上有两个 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 共享时,我会获取记录并订阅更改:
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 中)对与他人共享的记录执行更新。但是设备 B 不知道这一点,除非我再次手动获取记录。
但从另一方面来说,它的效果还不错。
如果我成功地更新了与我共享的记录(在设备 B 上),那么设备 A 会神奇地收到有关更改的通知,一切都很好。有什么区别?
如何订阅与我共享的记录的更改?
P.S 当我有能力的时候,我会为能帮助我的人启动 200 甚至更多的赏金。
iOS 11、Swift 4、Xcode 9
【问题讨论】:
-
我的理解是-“当所有者修改共享记录时,其他设备没有收到有关通知的更新,但其他方式运行良好”?
-
没错...现在就是这样
-
您是否在其他设备上注册了推送通知?
-
对于推送通知在两者上都注册了。一定是因为在两台设备上都编译了同一个应用程序......并且在一种情况下它可以工作
标签: ios swift push-notification cloudkit