通过 CKSubscription 观察 CKRecord 删除不起作用
Posted
技术标签:
【中文标题】通过 CKSubscription 观察 CKRecord 删除不起作用【英文标题】:Observe CKRecord deletion via CKSubscription does not work 【发布时间】:2014-09-13 09:56:58 【问题描述】:CKSubscription
文档说:当记录修改导致订阅触发时,服务器将推送通知发送到所有具有该订阅的设备除了进行原始更改的设备到记录。
假设我有两个设备:device 1
和 device 2
从不同的 iCloud 帐户登录。假设两个设备都订阅了某个记录类型的记录删除。
-
如果
device 1
创建了一条记录,然后device 1
将其删除,那么device 2
会收到通知 - 根据文档,但是..
如果device 1
创建了一条记录,然后device 2
将其删除,那么device 2
会收到通知 - 我不认为这是根据文档,它没有任何意义,device 2
已删除所以应该通知device 1
在设备 1 和设备 2 上设置订阅
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool
application.registerUserNotificationSettings(UIUserNotificationSettings(forTypes: .Alert, categories: nil))
application.registerForRemoteNotifications()
let defaultContainer = CKContainer.defaultContainer()
let publicDatabase = defaultContainer.publicCloudDatabase
publicDatabase.fetchAllSubscriptionsWithCompletionHandler(subscriptions, error in
if error == nil
if subscriptions.count == 0
let subscription = CKSubscription(recordType: "OU", predicate: NSPredicate(value: true), options: .FiresOnRecordDeletion)
subscription.notificationInfo = CKNotificationInfo()
subscription.notificationInfo.shouldBadge = false
subscription.notificationInfo.alertBody = "OU removed or upated"
publicDatabase.saveSubscription(subscription, completionHandler: subscription, error in
if error == nil
else
println("\(error.localizedDescription)")
)
else
println("\(error.localizedDescription)")
)
return true
在设备 1 上创建记录
@IBAction func addOU(sender: AnyObject)
var defaultContainer = CKContainer.defaultContainer()
var publicDatabase = defaultContainer.publicCloudDatabase
let r = CKRecord(recordType: "OU", recordID: CKRecordID(recordName: "aaaa"))
publicDatabase.saveRecord(r, completionHandler: r2, error in
if error == nil
else
println("\(error.localizedDescription)")
)
删除设备 2 上的记录
@IBAction func removeOU(sender: AnyObject)
var defaultContainer = CKContainer.defaultContainer()
var publicDatabase = defaultContainer.publicCloudDatabase
publicDatabase.deleteRecordWithID(CKRecordID(recordName: "aaaa"), completionHandler: recordID, error in
if error == nil
else
println("\(error.localizedDescription)")
)
【问题讨论】:
我已经发现了错误 rdar://18810914 【参考方案1】:我仍然认为 CKSubscription
的工作原理毫无意义,但作为临时修复,我建议先将 CKRecord
的 lastModifiedUserRecordID
更改为想要删除记录的用户,然后再删除记录。
要更改lastModifiedUserRecordID
,您必须获取它并且不做任何操作将其保存回来,然后可以删除:
@IBAction func removeOU(sender: AnyObject)
var defaultContainer = CKContainer.defaultContainer()
var publicDatabase = defaultContainer.publicCloudDatabase
publicDatabase.fetchRecordWithID(CKRecordID(recordName: "aaaa"), completionHandler: record, error in
if error == nil
publicDatabase.saveRecord(record, completionHandler: record2, error in
if error == nil
publicDatabase.deleteRecordWithID(CKRecordID(recordName: "aaaa"), completionHandler: recordID, error in
if error == nil
else
println("\(error.localizedDescription)")
)
else
println("\(error.localizedDescription)")
)
else
println("\(error.localizedDescription)")
)
【讨论】:
天哪... 是否报告了此错误?雷达? 遇到了熟悉的麻烦,您的解决方法帮助了我。在我的情况下是以下问题:设备 1 创建了一条记录并订阅了该记录被删除。设备 2 删除了记录。设备 1 未收到通知。 我也是 rdar://18810914 我已经报告了 3 个关于CKSubscription
的问题 :-(
这太疯狂了。让我花了 3 周时间对离线同步功能进行故障排除。以上是关于通过 CKSubscription 观察 CKRecord 删除不起作用的主要内容,如果未能解决你的问题,请参考以下文章