【问题标题】:Do remote push notifications require to add UIBackgroundModes in Info.plist?远程推送通知是否需要在 Info.plist 中添加 UIBackgroundModes?
【发布时间】:2018-01-08 11:40:06
【问题描述】:

我已集成远程推送通知,但收到以下警告:

didReceiveRemoteNotification:fetchCompletionHandler:],但你还是 需要将“remote-notification”添加到您支持的列表中 UIBackgroundModes 在你的Info.plist.

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

【问题讨论】:

    标签: ios info-plist uibackgroundmode


    【解决方案1】:

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

    最简单的方法是通过项目设置。导航至Targets -> Your App -> Capabilities -> Background Modes 并检查Remote notifications。这将自动启用所需的设置。

    【讨论】:

    • 我已经检查了该字段,但仍然遇到同样的错误。
    • Anuj 在下面看到我的答案
    • 我不同意这个答案。如果您使用远程通知进行后台更新,您应该只启用后台模式 -> 远程通知。请参阅此处的文档Configuring a Background Update Notification
    • @jzeferino 感谢您的通知,我已经为我的回答添加了一些说明。请注意,最初的问题是关于 application(_:didReceiveRemoteNotification:fetchCompletionHandler:) 函数,该函数用于处理数据获取。
    • 这很好,但回答了您是否需要后台更新功能的问题,您当然需要。我发布了一个关于您是否需要仅为推送通知设置后台模式功能的答案(剧透,您不需要)。
    【解决方案2】:

    您还可以编辑所需的 info.plist(打开为 -> 源代码)并粘贴:

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

    【讨论】:

    • 现在在后台模式下检查远程通知时由 Xcode 自动添加
    • 不适合我:版本 11.4.1 (11E503a)
    【解决方案3】:

    事实上,您不需要将 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)
    

    这里的关键是,前一个(以及它所取代的已弃用的)仅在应用程序处于前台时运行。如果应用程序在前台或后台,后者将运行。请参阅 the spec 了解此特定金块:

    使用此方法为您的应用处理传入的远程通知。 与 application(_:didReceiveRemoteNotification:) 方法不同,它 仅当您的应用程序在前台运行时调用,系统 当您的应用在前台运行时调用此方法或 背景。

    因此,如果您需要推送通知,则决定是否需要在后台运行 - 只有在两者都需要时,您才应实施警告建议的方法。

    【讨论】:

      【解决方案4】:

      即使在功能中设置了远程通知后台模式后,它也发生在我身上。问题是我有三个目标,一个用于生产,一个用于 QA,一个用于分期。我必须在所有三个目标中设置远程通知并修复警告。

      【讨论】:

        【解决方案5】:

        Project navigator 中选择您的 .xcodeproj 文件,然后转到 Signing & Capabilies,然后从库中 (command + shift + l or Click (+ Capability)) 搜索Background Modes,然后拖拽将其放到 Signing & Capabilities 中,然后检查 远程通知后台处理。 另外(重要)通过点击+功能

        添加推送通知

        【讨论】:

          【解决方案6】:

          如果您在 Signing & Capabilities 中没有找到包含背景模式的列表,只需在项目的 Info.plist 中添加“必需的背景模式”即可。现在,您将在 Signing & Capabilities 选项卡下获得一个包含 远程通知 的列表,只需检查一下即可。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-01-08
            • 2019-01-28
            • 1970-01-01
            • 2018-07-23
            相关资源
            最近更新 更多