APNS:didReceiveRemoteNotification:当app在后台时,fetchCompletionHandler没有运行(除非xcode正在调试)

时间:2015-11-20 05:12:13

标签: ios apple-push-notifications

我在运行iOS 8.1的iPad 2中遇到有关APNS的问题。我在Google上搜索了几天,并尝试了我能找到的所有解决方案。但是我似乎无法解决这个问题。

我做了什么:

  1. 启用功能:远程通知,后台提取
  2. 我有" content-available = 1"在aps有效载荷中。
  3. 我在didReceiveRemoteNotification中使用了NSLog():fetchCompletionHandler所以我可以清楚地看到设备日志中是否触发了该方法
  4. 我想做什么:

    我想在后台收到APNS时执行网络请求。我相信我可以使用beginBackgroundTaskWithExpirationHandler和stuff来处理这部分。但是,在调查中我发现问题是由于didReceiveRemoteNotification:当app处于后台状态时,没有运行fetchCompletionHandler。

    问题:

    didReceiveRemoteNotification:当app在前台时,fetchCompletionHandler可以触发。但是,当xcode仍在调试app时,仅在后台触发。这意味着如果我拔掉电缆(调试会话结束),它就不能再触发了。如果我把它重新插回来也一样。没有回应。

    然而,与此同时,我仍然可以收到带有警报正文和声音的APNS(虽然该方法仍未触发),正如我在设备日志中看到的那样。

    我尝试了"沉默"的每一个组合。推送通知:声音="",警报=""等等但似乎没有任何效果。这里有专业人士的帮助吗?

    谢谢。

1 个答案:

答案 0 :(得分:1)

仔细检查后台应用程序刷新是否已打开。在旅途中将其关闭后,我遇到了一段时间。

此外,您不需要在didReceiveRemoteNotification:fetchCompletionHandler内部使用后台任务,因为它已在后台运行。只需确保在完成网络请求后调用相应的完成处理程序。

最后,didReceiveRemoteNotification:fetchCompletionHandler不会在常规(非静默)通知上调用,因为常规通知不会唤醒您的应用并执行代码。

编辑:要检查的另一个奇怪的模糊事物是通知帧数据中的优先级 - link to Apple Documentation - 命令F表示详细信息的“优先级”。当我这样做时,我构建通知的Ruby gem默认使用10,如果你只使用'content-available'而没有别的,那么这个假设是不允许的。事情忙于工作,我从来没有使用5的优先级来测试它,但它可能有所帮助。