Ján*_*nos 8 apple-push-notifications ios ios8 cloudkit cksubscription
CKSubscriptiondoc说:当记录修改导致订阅触发时,服务器会向具有该订阅的所有设备发送推送通知,但对原始更改记录的设备除外.
让我们假设我有两个设备:device 1并device 2从不同的iCloud帐户登录.假设两个设备都订阅了某个记录类型的记录删除.
device 1创建一个记录,然后device 1删除它然后device 2得到通知 - 这是按照DOC,但..device 1创建一个记录然后device 2删除它然后device 2得到通知 - 我认为它不符合DOC,并且它不做任何感觉,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
}
Run Code Online (Sandbox Code Playgroud)
在设备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)")
}
})
}
Run Code Online (Sandbox Code Playgroud)
删除设备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)")
}
})
}
Run Code Online (Sandbox Code Playgroud)
我仍然认为,这是毫无意义的是如何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)")
}
})
}
Run Code Online (Sandbox Code Playgroud)