在后台接收推送通知

时间:2013-01-31 00:09:36

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

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

4 个答案:

答案 0 :(得分:38)

仅当您将application:didReceiveRemoteNotification:键值content-available添加到通知有效内容中时,

1才会在后台调用。 如果是Urban Airship,您可以在Setting选项卡下发送Test Push。 推送通知的示例有效负载:

{
  "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

答案 1 :(得分:18)

来自APNS编程指南:

  

让我们回顾一下操作提供的可能情况   本地通知或应用程序的远程通知。

     

当应用程序未在运行时传递通知   前景。在这种情况下,系统会显示通知,   显示警报,标记图标,或者播放声音。

     

作为呈现通知的结果,用户点击动作按钮   警报或点击(或点击)应用程序图标。如果行动   点击按钮(在运行iOS的设备上),系统启动   应用程序和应用程序调用其委托   application:didFinishLaunchingWithOptions:方法(如果实现);它   传递通知有效载荷(用于远程通知)或   本地通知对象(用于本地通知)。

     

如果在运行iOS的设备上轻触应用程序图标,则应用程序   调用相同的方法,但不提供有关的信息   通知

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

答案 2 :(得分:6)

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

link in Apple和一些question

答案 3 :(得分:0)

方法 didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 参数launchOptions其中一个字典键是 UIApplicationLaunchOptionsRemoteNotificationKey ,其中包含按下的推送通知信息。< / p>

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

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