APNS:didReceiveRemoteNotification:fetchCompletionHandler 在应用程序处于后台时未运行(除非 xcode 正在调试)

Posted

技术标签:

【中文标题】APNS:didReceiveRemoteNotification:fetchCompletionHandler 在应用程序处于后台时未运行(除非 xcode 正在调试)【英文标题】:APNS: didReceiveRemoteNotification:fetchCompletionHandler did not run when app is in background (unless xcode is debugging) 【发布时间】:2015-11-20 05:12:12 【问题描述】:

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

我做了什么:

    启用的功能:远程通知、后台获取 我在 aps 负载中有“content-available = 1”。 我在 didReceiveRemoteNotification:fetchCompletionHandler 中使用了 NSLog(),因此如果触发了该方法,我可以在设备日志中清楚地看到

我想做什么:

我想在后台收到 APNS 时执行网络请求。我相信我可以使用 beginBackgroundTaskWithExpirationHandler 和其他东西很好地处理这部分。但是,经过调查,我发现问题是由于应用程序处于后台状态时没有运行 didReceiveRemoteNotification:fetchCompletionHandler 造成的。

问题:

didReceiveRemoteNotification:fetchCompletionHandler 可以在应用处于前台时触发。但它只有在 xcode 仍在调试应用程序时才会在后台触发。这意味着如果我拔掉电缆(调试会话结束),它就无法再触发了。如果我重新插入它,同样的事情。没有响应。

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

我尝试了“静音”推送通知的所有组合:声音 = ""、警报 = "" 等。但似乎没有任何效果。这里有专业人士的帮助吗?

谢谢。

【问题讨论】:

我遇到了同样的问题。你有想过这个吗? 【参考方案1】:

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

此外,您不需要在didReceiveRemoteNotification:fetchCompletionHandler 中使用后台任务,因为它已经在后台运行。只需确保在完成网络请求后调用适当的完成处理程序即可。

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


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

【讨论】:

感谢您的澄清。我检查了我的设置,后台应用刷新已全局打开,以及我的特定应用的设置。这越来越奇怪了.. 尝试了优先级,但效果不佳。但没关系,我发现了用于 voip 类型推送的 PushKit 可以满足我的要求。由于我的应用程序是 voip 应用程序,我想我会选择那个选项。无论如何,非常感谢:)

以上是关于APNS:didReceiveRemoteNotification:fetchCompletionHandler 在应用程序处于后台时未运行(除非 xcode 正在调试)的主要内容,如果未能解决你的问题,请参考以下文章

注销时取消订阅所有订阅#Quickblox APNS & APNS.VOIP

我可以在推送通知中使用官方 apns(或简易 apns)吗?

FCM/APNS 集成适用于新令牌,但在转换旧 APNS 令牌时不行?

QuickBlox 不发送 APNS

如何使用 APNs Auth Key 和标准 CLI 工具发送 APNs 推送消息?

从 APNS 收到的设备令牌的生命周期