我正在尝试设置静默推送通知以使用 CloudKit 在设备之间传播本地通知,但我无法理解为什么每次收到远程通知时我的应用程序都会崩溃。
在我尝试处理收到的通知之前,一切正常。尝试访问 didReceiveRemoteNotification 中的 CKQueryNotification 对象的 recordID 时发生崩溃。
我正在应用程序 didFinishLaunchingWithOptions 中注册远程通知。这是其余的代码:
在 didRegisterForRemoteNotification 中,我正在为记录类型 CD_Task 创建一个 CKSubscription。
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
let subscription = CKQuerySubscription(recordType: "CD_Task", predicate: NSPredicate(format: "TRUEPREDICATE"), options: .firesOnRecordCreation)
let info = CKSubscription.NotificationInfo()
subscription.notificationInfo = info
CKContainer.default().privateCloudDatabase.save(subscription, completionHandler: { subscription, error in
if error == nil {
// Subscription saved successfully
} else {
// Error occurred, handle it
}
})
}
在 DidReceiveRemoteNotification 内部,我将一个 CKQueryNotification 对象传递给一个函数来处理从 iCloud 接收到的远程通知:
func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
if let ckqn = CKQueryNotification(fromRemoteNotificationDictionary: userInfo as! [String:NSObject]) {
self.iCloudHandleNotification(ckqn)
}
}
最后,这里是 iCloudHandleNotification 函数代码:
func iCloudHandleNotification(_ ckqn: CKQueryNotification) {
switch ckqn.queryNotificationReason {
case .recordCreated:
// This is where it crashes.. when I try to access ckqn.recordID
CKContainer.default().privateCloudDatabase.fetch(withRecordID: ckqn.recordID!) { (record, error) in
if let record = record {
// Handle creating local notif for record
} else if let error = error {
print("Unable to retrieve record: \(error)")
}
}
default:
break
}
}
编辑:
经过调查,似乎我得到的是 CKDatabaseNotification 而不是 CKQueryNotification——我应该如何指定我想要一个 CKQueryNotification?