无声iCloud更改了后台未收到的通知



我的应用程序使用公共iCloud数据库,该数据库通过推送通知进行同步
订阅iCloud通知使用以下notificationInfo:

let notificationInfo = CKNotificationInfo()
notificationInfo.alertBody = nil
notificationInfo.shouldSendContentAvailable = true  

测试设置使用2个iOS设备:

  • 第一台设备使用我的应用程序修改iCloud数据库
  • 第二台设备在前台或(屏幕关闭)后台模式下运行我的应用程序。这是在Xcode控制下完成的,这样我就可以设置断点。我的应用程序的系统设置/通知:允许通知,显示在通知中心&锁定屏幕

第一次测试:

第二个设备:在前台执行我的应用程序。

当第一台设备修改数据库时,中会收到通知

func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) 

这是意料之中的事。

第二次测试:

第二台设备:如上所述,但现在屏幕已关闭,即我的应用程序处于后台。

当第一个设备修改数据库时,会收到一个通知。

预期行为:
由于通知信息中将shouldSendContentAvailable设置为true,系统应该唤醒我的应用程序(请参阅文档)。然后,应用程序应该有后台执行时间下载与推送通知相关的任何数据,例如更改的记录集。这应该通过调用来完成

func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void)  

实际行为:
锁定屏幕上会显示一个警报,上面写着"iCloud已更改,滑动打开"。如果我滑动此警报并解锁设备,只有这样才能真正调用此功能。

我的问题:
我想使用iCloud的静默推送来更新我的应用程序的本地数据。那么,尽管我设置了shouldSendContentAvailable = true,为什么锁屏上会显示默认消息体为"iCloud changed"的警报呢?

我的错,虽然不明显:

我的CloudKit Dashboard显示有我的订阅类型。但由于某些原因,仪表板没有显示任何订阅。因此,我使用获取了所有现有订阅

private func getAllSubscriptionIDs(completion: @escaping (_ subscriptionIDs:[String]?, _ error: Error?) -> Void) {
let database = CKContainer.default().publicCloudDatabase
database.fetchAllSubscriptions { subscriptions, error in
guard error == nil else {
completion(nil, error)
return
}
guard let subscriptions = subscriptions else {
completion([], nil)
return
}
let subscriptionIDs = subscriptions.map{ $0.subscriptionID }
completion(subscriptionIDs, nil)
} // fetchAllSubscriptions
}  

我收回了5个现有的订阅,其中一个订阅有一个带有shouldSendContentAvailable = false的警报体"iCloud changed"。

显然,我在开发的早期确实使用了这些订阅,并且我没有删除它们,因为它们没有显示在仪表板中
删除它们解决了问题。

相关内容

  • 没有找到相关文章

最新更新