远程推送通知是否需要在 Info.plist 中添加 UIBackground 模式?

我已经集成了远程推送通知,但是我收到了这个警告:

但你还是 需要添加“ remote-notification”到您支持的列表 Info.plist中的 UIBackgroundMode

我的 Xcode 版本是8.3.1。我真的很想把这个加到 Info.plist里。我也遵循了一些教程,但他们也没有提到这一点。我到底该怎么做?

76103 次浏览

是的,您应该启用后台模式/远程通知,使其能够使用远程通知进行后台更新。

最简单的方法是通过项目设置。导航到 目标-> 应用程式-> 能力-> 背景模式并检查 远程通知。这将自动启用所需的设置。

Background Modes dropdown list in Project Settings

您还可以编辑所需的 info.plist (Open As-> Source Code)并粘贴:

<dict>
<key>UIBackgroundModes</key>
<array>
<string>remote-notification</string>
</array>

甚至在功能中设置了远程通知后台模式之后,我也遇到了这种情况。问题是我有三个目标,一个用于生产,一个用于质量保证,一个用于准备阶段。我必须在所有三个目标中设置远程通知,这修复了警告。

事实上,仅仅为了使用远程通知,您不需要将 UIBackoundModes 添加到. plist 中。

我知道我有点吹毛求疵(另一个答案大部分是好的,也许是新的,因为 iOS 11) ,但问题是推送通知需要后台更新,他们没有。

这里的区别在于,有两种不同的方法可以接受 AppCommittee 上的通知;

这个模式并不要求你使用 UIBackground 模式:

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

以上内容取代了 iOS11系统中已经废弃的内容:

optional func application(_ application: UIApplication,
didReceiveRemoteNotification userInfo: [AnyHashable : Any])

这个需要背景模式能力:

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

这里的关键问题是,前一个应用程序(以及它取代的那个已废弃的应用程序)只有在应用程序出现在前台时才能运行。如果应用程序位于前台或后台,则后者将运行。请参阅 说明书了解这个具体的金块:

使用此方法处理应用程序的远程传入通知。 与 application (_: did ReceiveRemoteNotification:)方法不同,后者 只有当您的应用程序在前台运行时,系统才会调用 当应用程序在前台运行或者 背景。

因此,如果需要推送通知,那么决定是否需要在后台运行——只有在两者都需要的情况下,才需要实现警告所建议的方法。

项目导航员中选择. xcodeproj 文件,然后转到 签名及能力,再从库中选择 (command + shift + l或单击(+ 能力))搜索 背景模式后,将其拖放到 签署及能力,然后检查 远程通知后台处理。 另外(很重要)通过单击 < strong > + ability 添加 推送通知

如果在 签署及能力中找不到包含背景模式的列表,只需在项目的 Info.plist 中添加“ 需要的背景模式”即可。现在,您将在 签署及能力选项卡下获得一个包含 远程通知的列表,请检查它。