Answers:
实际上,您不必仅使用远程通知就将UIBackgroundModes添加到.plist。
我知道我在拆分继承人(其他答案通常很好,也许是iOS 11的新东西),但问题是涉及需要后台更新的推送通知,而事实并非如此。
这里的区别在于,有两种不同的方法可以在AppDelegate上接受通知。
这不需要您使用UIBackgroundModes:
optional func userNotificationCenter(_ center: UNUserNotificationCenter,
willPresent notification: UNNotification,
withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void)
上面的内容取代了从iOS 11开始不推荐使用的内容:
optional func application(_ application: UIApplication,
didReceiveRemoteNotification userInfo: [AnyHashable : Any])
而这确实需要后台模式功能:
optional func application(_ application: UIApplication,
didReceiveRemoteNotification userInfo: [AnyHashable : Any],
fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void)
这里的关键是,前一个(以及已替换的不推荐使用的)仅在应用程序处于前台时运行。如果应用位于前台或后台,则后者将运行。请参阅有关此特定块的规范:
使用此方法可以为您的应用处理传入的远程通知。与application(_:didReceiveRemoteNotification :)方法不同,该方法仅在您的应用程序在前台运行时才调用,而在您的应用程序在前台或后台运行时,系统会调用此方法。
因此,如果您需要推送通知,请决定是否需要在后台运行-仅在同时需要两者的情况下,才应实施警告所建议的方法。
即使在功能中设置了远程通知后台模式后,我还是想到了。问题是我有三个目标,一个用于生产,一个用于质量检查,一个用于登台。我必须在所有三个目标中设置远程通知,并修复了警告。