【问题标题】:Silent iCloud changed notifications not received in background后台未收到静默 iCloud 更改通知
【发布时间】:2018-03-30 08:10:43
【问题描述】:

我的应用使用公共 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,系统应该唤醒我的应用程序(请参阅docs)。然后应该为应用程序提供后台执行时间以下载与推送通知相关的任何数据,例如更改的记录集。这应该通过调用来完成

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

实际行为:
锁定屏幕上会显示一条警报,说“iCloud 已更改,滑动打开”。如果我刷这个警报并解锁设备,那么这个函数才会真正被调用。

我的问题:
我想使用来自 iCloud 的静默推送来更新我的应用程序的本地数据。那么,虽然我设置了shouldSendContentAvailable = true,但为什么在锁定屏幕上显示默认消息正文“iCloud changed”的警报?

【问题讨论】:

    标签: ios push-notification icloud silentpush silent-notification


    【解决方案1】:

    我的错,虽然不明显:

    我的 CloudKit 仪表板显示有我的订阅类型。但由于某种原因,仪表板没有显示任何订阅。因此,我使用

    获取所有现有订阅
    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”。

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

    【讨论】:

      猜你喜欢
      • 2019-01-10
      • 2018-07-25
      • 2021-05-01
      • 1970-01-01
      • 2017-11-18
      • 2021-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多