当应用程序在后台运行时,didReceiveRemoteNotification仅在设备连接到MacBook时才能工作

时间:2019-04-15 03:23:42

标签: ios swift xcode push-notification appdelegate

我正在将设备连接到计算机的情况下测试background app refresh。该代码正常运行,并且在didReceiveRemoteNotification中,该函数完成,直到调用完成处理程序:

completionHandler(UIBackgroundFetchResult.newData)

但是,当我断开设备与计算机的连接并尝试执行相同的操作时,后台应用程序刷新将无法正常工作,并且didReceiveRemoteNotification中的代码在应用程序进入前台之前不会运行。

在这两种情况下(无论是否连接到计算机),都将在后台模式下使用该应用程序进行测试。即未终止且不在前台。

我在settings -> general -> background app refresh中确保已为我的应用程序全局启用了该功能。

当连接到计算机且未连接的设备与后台应用程序刷新完全相同的构建的行为不同时,很难进行故障排除。我的代码如下:

func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {

    if userInfo["message_id"] as? String != nil {
        MessageHelper().saveServerMessageToLocalDatabase(self.privateContext, serverMessage: userInfo as! [String : AnyObject] completion: { (message: Message?) in
            if message != nil {
                do {
                    try self.privateContext.save()
                    completionHandler(UIBackgroundFetchResult.newData)
                } catch {
                    print("error saving context")
                    completionHandler(UIBackgroundFetchResult.newData)
                }
            } else {
                completionHandler(UIBackgroundFetchResult.newData)
            }
        })
    } else {
        completionHandler(UIBackgroundFetchResult.newData)
    }
}

1 个答案:

答案 0 :(得分:0)

如果您使用的是静默通知,

应用程序在后台运行时,无提示通知有某些限制。请参阅下面的Apple文档。

enter image description here

请在此处查看完整的文档:Pushing Updates to Your App Silently

当设备连接到Mac时,所有这些都不适用。连接后,该应用将收到所有通知。

此外,请确保回调不会转到以下方法。

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

希望有帮助。