gpt4 book ai didi

swift - CKQueryNotification.recordID : unrecognized selector sent to instance

转载 作者:行者123 更新时间:2023-11-30 10:29:20 26 4
gpt4 key购买 nike

我正在尝试设置静默推送通知,以便使用 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?

最佳答案

我终于明白了。我正在使用 NSPersistentCloudKitContainer 跨设备同步数据。我的订阅正在观察对 NSPersistentCloudKitContainer 创建的记录所做的任何更改,因此每次进行更改时都会创建 CKDatabaseNotification,而不是 CKQueryNotification。由于我尝试处理 CKQueryNotification,我的应用程序不断崩溃,因为它找不到 recordID,因此出现错误消息。

为了解决这个问题,我最终在 iCloud 中创建了一个单独的记录(不是 NSPersistentCloudKitContainer 的一部分),并让我的 CKSubscription 观察该记录的任何更改。

关于swift - CKQueryNotification.recordID : unrecognized selector sent to instance,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59447979/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com