后台问题中的 Apple 推送通知

Posted

技术标签:

【中文标题】后台问题中的 Apple 推送通知【英文标题】:Apple Push Notification in Background Issue 【发布时间】:2013-10-15 20:54:19 【问题描述】:

我正在使用 parse.com 作为我正在构建的测试应用程序的 APNs 提供程序。我已经确认推送通知正在工作,因为当应用程序处于前台时我已经能够成功接收警报。另外,我的 plist 中指定了 UIBackgroundModes 键的 remote-notification 值。

在我的应用程序中,我希望在收到推送通知时将用户的当前位置数据发送回我的应用程序特定的 parse.com 数据库。我实际上并不关心通知有效负载本身,因为通知只是获取一小部分信息的一种手段。该应用程序不断在后台收集数据并将其存储在持久性NSDictionary 中。

我已将位置发送代码放在application:didReceiveRemoteNotification: 方法中。如果我收到通知时我的应用程序在前台,则会调用该方法。如果我的应用在后台,则不会调用该方法。

我做错了吗? 当应用在后台并且用户没有与通知进行交互时,是否甚至可以在application:didReceiveRemoteNotification: 中执行 API 请求?**

编辑:即使我使用application:didReceiveRemoteNotification:fetchCompletionHandler:,问题仍然存在。

注意:我的充满位置数据的 NSDictionary 不为空。另外,我没有尝试在后台进行任何 UI 操作 - 只是尝试执行 API 请求。

【问题讨论】:

【参考方案1】:

检查以下内容:

通知负载包括“内容可用”
"alert":"",
"badge":"0",
"content-available":"1",
"sound":""

【讨论】:

成功了!我在 AppDelegate 中打开了 content-available 标志,但没有在我的 JSON APN 中推送该标志。谢谢,亚历克斯!这解决了问题。 哈,奇怪。它只工作了一次。会调查并回复你 没关系,让它工作!这只是从 parse 接收数据的延迟。 根据 ios 开发者库“content-available”是用于静默推送通知:“aps 字典也可以包含 content-available 属性。值为 1 的 content-available 属性允许远程通知充当“静默”通知。当静默通知到达时,iOS 会在后台唤醒您的应用,以便您可以从服务器获取新数据或进行后台信息处理。用户不会被告知新的或更改的由无提示通知产生的信息,但他们可以在下次打开您的应用时找到相关信息。”【参考方案2】:

documentation for UIApplicationDelegate -application:didReceiveRemoteNotification 很清楚这种方法:

如果推送通知到达时应用程序未运行,则该方法 启动应用程序并在 启动选项字典。应用不调用该方法处理 该推送通知。相反,您对 应用程序:willFinishLaunchingWithOptions:或 application:didFinishLaunchingWithOptions: 方法需要获取 推送通知负载数据并做出适当的响应。

您需要在这两种方法中处理通知,以便能够在您的应用处于后台和前台时做出响应。

【讨论】:

我想我理解not running 完全关闭,而不是inactivebackground 模式。如果我能正常工作,我会立即尝试并标记你的答案正确。 还是不行。我现在正尝试从application:didFinishLaunchingWithOptions:application:didReceiveRemoteNotification: 发送位置数据。如果应用程序在后台(例如,我按下主页按钮),则不会发送任何数据,除非我与通知交互。如果我通过单击通知与通知进行交互,则会输入application:didReceiveRemoteNotification: 方法。我究竟做错了什么?我是否从根本上误解了后台通知的工作方式? 我认为我的应用实际上处于suspended 状态,而不是background 状态。我认为这可能是导致问题的原因。 您是否在 info.plist 中设置了远程通知标志? 是的,我做到了。我也一直在使用新的application:didReceiveRemoteNotification:fetchCompletionHandler: 方法,它取代了另一个委托方法application:didReceiveRemoteNotification:。不过,没有骰子。【参考方案3】:

你可以试试用这个代替

application:didReceiveRemoteNotification

方法,因为您需要在后台模式下获取推送,因此,当应用程序处于后台模式时,这将有效。但是,您可能需要在应用程序处于前台时添加自定义通知或 UIAlertView 以显示您的消息。希望它有所帮助,现在还为时不晚。

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler


    NSLog(@"Remote Notification Received: %@", userInfo);

    UILocalNotification *notification = [[UILocalNotification alloc] init];
    notification.alertBody = @"message to be displayed";
    notification.applicationIconBadgeNumber = 1;


    [[UIApplication sharedApplication] presentLocalNotificationNow:notification];
    completionHandler(UIBackgroundFetchResultNewData);


【讨论】:

【参考方案4】:

Alex L 的回答几乎对我有用。

只要确保content-available 的值为1(数字),而不是字符串“1”:


  "alert":"",
  "content-available":1,
  "sound":""

badge 参数是可选的。

(将 Parse Server 用于 APN)

【讨论】:

以上是关于后台问题中的 Apple 推送通知的主要内容,如果未能解决你的问题,请参考以下文章

Apple 推送通知折叠键等效

Apple 推送通知 - 收货收据

即使在应用程序终止后也能获得 Apple 的远程推送通知

Apple 推送通知令牌

Mac OS 推送通知

延迟网络中的 iOS 推送通知