iOS8.1.2 设备未插入时不调用 didReceiveRemoteNotification 方法

iOS8.1.2 didReceiveRemoteNotification method not called when device is not plugged in

在iOS版本是8.1.2,我发现了一个很奇怪的问题:
我实现了以下方法来处理 appDelegate

中的推送信息
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler

如果您的设备未插入,则不会调用此方法。

在发现 another answer 这个问题后,我确认这确实是 iOS 8.1.2 中的一个错误。 我很惊讶在互联网上没有太多关于它的东西。

但通过我的测试,与provision profile无关,使用Apple的TestFlight也不行。

如果你环顾四周,你会发现其他人认为这是 iOS 7.1 beta 中的错误,已在 7.1 发布版本中修复,但它可能与任何 beta、Testflight、特定的 8.1.2 版本等,就像您在回答中所说的那样。我很确定 this 是唯一正确的答案。顺便说一下,我有同样的问题,但是在 8.1.3 中,所以我想它也会重新出现在你身上。

删除应用程序后,重新启动 phone,然后安装应用程序,didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler: 可以正常调用(这解释了 "Use tesflight!"、"in 7.1.x it works!"、等),但如果你因为收到远程通知或没有及时调用完成处理程序而导致计算过多,系统将不再喜欢你并稍后在需要时开始调用该方法,通常为 0收到您的通知后 -30 分钟,或非常长(请参阅下面的更新)。对我来说,有时在第一次远程通知后就已经发生了。当然,除非设备已插入,否则它会更可靠。

一旦您重新连接(插入)设备,系统可能会调用您的方法,通常最多需要 15 分钟才会被调用,或者如果您在一小时后推送相同的通知,它可能会立即起作用但这也不确定。这真的很痛苦,但不要将其视为可以修复的东西,这就是 Apple 创建它的方式。

更新: 它最终会被调用。我在 18.13h 发送了一个远程通知,直到第二天 09.41h 才调用 didReceiveRemoteNotification:fetchCompletionHandler:。因此,就我而言,调用该方法需要 15.5 小时。 就我而言,其原因可能是我使用远程通知在后台启动和停止位置跟踪,这是很繁重的事情。