【问题标题】:Receiving Push Notifications while in background在后台接收推送通知
【发布时间】:2013-01-14 23:48:59
【问题描述】:

我知道这在很多地方都有介绍,但我无法弄清楚。我使用 Urban Airship 进行推送通知。一切似乎都很好,除了当我的应用程序在后台时 - didReceiveRemoteNotification 没有被调用。它在前台工作 - 我能够正确处理消息。如果从通知中心点击消息,我可以从启动选项中获取消息。但是在后台时,它发送的消息 - iOS 显示警报 - didReceiveRemoteNotification 未被调用。当我点击我的应用程序图标(不是从通知中心内)时,应用程序进入前台,我不知道通知是否存在。有什么想法吗?

【问题讨论】:

    标签: ios xamarin.ios push-notification apple-push-notifications


    【解决方案1】:

    application:didReceiveRemoteNotification: 仅在您将值为1content-available 键添加到通知负载中时才会在后台调用。 如果是 Urban Airship,您可以在设置选项卡下发送测试推送。 推送通知的示例负载:

    {
      "aps": {
        "alert": "aaaa",
        "badge": "+1",
        "content-available": "1"
      },
      "device_tokens": [
        "86BA71E361B849E8312A7B943BA6B26A74AB436381CF3FEE3CD9EB436A12A292"
      ]
    }
    

    Apple 在他的文档中明确提到了......

    对于触发下载操作的推送通知, 通知的有效负载必须包含内容可用密钥及其 值设置为 1。当该键存在时,系统会唤醒应用程序 后台(或将其启动到后台)并调用应用程序 代表的 应用程序:didReceiveRemoteNotification:fetchCompletionHandler: 方法。您对该方法的实现应该下载 相关内容并将其集成到您的应用程序中。 https://developer.apple.com/library/content/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html

    【讨论】:

    • 另外,根据文档,“远程通知”选项需要在目标设置的功能下的后台模式下启用。
    • hmhm 我使用 Google Cloud Messaging,他们还实现了 content-available,在收到(单击通知时)输出告诉我 content-available 在 aps 对象之外。当然,它对我不起作用。 :( 苹果为什么这么难...
    • 此答案必须标记为正确答案。
    • 我也在使用相同的场景,但我使用的是 FCM。我也像你一样被困在我点击通知消息之前无法打开推送通知。您对如何使用 FCM 解决此问题有任何想法吗?
    • 以下链接可能会有所帮助。 firebase.google.com/docs/cloud-messaging/concept-options
    【解决方案2】:

    来自 APNS 编程指南:

    让我们回顾一下运营交付时可能出现的情况 应用程序的本地通知或远程通知。

    当应用程序未在 前景。在这种情况下,系统会显示通知, 显示警报,标记图标,也许播放声音。

    作为显示通知的结果,用户点击操作按钮 或点击(或单击)应用程序图标。如果动作 点击按钮(在运行 iOS 的设备上),系统启动 应用程序和应用程序调用其委托的 应用程序:didFinishLaunchingWithOptions:方法(如果实现);它 传入通知有效负载(用于远程通知)或 local-notification 对象(用于本地通知)。

    如果在运行 iOS 的设备上点击应用程序图标,应用程序 调用相同的方法,但没有提供关于 通知

    我相信最后一句话描述了您的情况,并解释了为什么您的应用程序没有收到有关通知的信息。

    【讨论】:

    • 是的 - 我错过了。好吧 - 这听起来确实是个缺点。我想有办法解决它 - 但 iOS 提供这个真的很简单。感谢您的洞察力。
    • 当点击应用程序图标时,还有其他方法可以获取推送通知的信息吗?我需要一个值,即在有效负载中。
    • @Eran ,你的意思是当应用程序在后台运行时,然后点击通知警报项,应用程序不会调用didReceiveRemoteNotification
    【解决方案3】:

    didReceiveRemoteNotification 仅在应用程序在前台或应用程序刚刚启动或从后台到前台购买时调用

    link in Apple 和一些question

    【讨论】:

      【解决方案4】:

      方法 didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 参数 launchOptions 字典键之一是 UIApplicationLaunchOptionsRemoteNotificationKey,它保存按下的推送通知信息。

      您可以在游览主根控制器初始化后推送收到的信息。我将它保存到某个属性,然后在视图初始化后将其推送。

      if (launchOptions) {
          if ([launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey]) {
              self.notificationToMakeAction = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-02
        相关资源
        最近更新 更多