我的应用程序使用一个使用推送通知同步的公共 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 的静默推送来更新我的应用程序的本地数据。那么为什么在锁定屏幕上显示默认消息正文“iCloud changed”的警报,尽管我设置了shouldSendContentAvailable = true
?