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 令牌时不行?