在睡眠模式下收不到推送通知

Not receiving Push Notification in Sleep Mode

想要: 我希望能够在应用程序处于后台时(包括 phone 处于睡眠模式时)在收到推送通知(静默)时触发 http 请求。

假设: 推送通知唤醒后台 运行 的应用程序(即使在睡眠中) https://discussions.apple.com/thread/3650066 :提供建议新路由器的解决方案,但这仅适用于使用 WiFi 的 phone。我正在使用蜂窝连接。

尝试: 我已验证我使用的是正确的委托方法 didRecieveRemoteNotification

-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler{
    NSLog(@"Remote Notification Recieved From:\t%@", userInfo[@"requestorSessionId"]);
    [_agentService handleAgentLocationRequest:userInfo];
    completionHandler(UIBackgroundFetchResultNewData);
}

我试图记录收到的任何推送通知,但如果 phone 处于睡眠模式,这些通知不会显示。 (通过 iOS 控制台 http://lemonjar.com/iosconsole/ 读取日志)

我已确认通知有效,因为当应用程序处于前台或后台(非睡眠模式)时,我能够看到日志语句。

我已将声音播放添加为推送通知负载的一部分,并且在收到通知(睡眠模式)时我能够听到声音播放,但我的应用程序从未发出要处理的通知。

我还在项目功能下的 UIBackground 模式中启用了远程通知。

更新

意识到我正在通过本地网络进行测试,当 phone 进入休眠状态时,WiFi 无线电也会关闭,这使得在没有端口转发的情况下无法连接到本地 ips。

即使有了这个新发现。我仍然遇到特定 iPhones 的问题,在这种情况下 iPhone 6 将在短时间内收到推送通知,然后再也不会收到它们。

在此先感谢,我将监控线程以根据需要提供更多信息。

根据 Apple documentation,您必须在 .plist 中指定特定的 UIBackgroundModes 才能使用静默通知。

If your server sends push notifications to a user’s device when new content is available for your app, you can ask the system to run your app in the background so that it can begin downloading the new content right away.

[..]

To support this background mode, enable the Remote notifications option from the Background modes section of the Capabilities tab in your Xcode project. (You can also enable this support by including the UIBackgroundModes key with the remote-notification value in your app’s Info.plist file.)

"Assumption: Push Notifications wake up application that is running in the background(Even while in sleep)".

iOS7 曾经是这种情况,但 iOS8 已经改变了。后台推送现在只会在特定情况下传送到应用程序。 Apple 没有明确说明这些情况到底是什么,但根据我的广泛实验,它基本上归结为 phone 是否正在充电。还有一些其他变量在起作用(例如网络类型、设备类型、启用 wifi),但主要的主要因素是推送到达时设备是否正在充电。

如果 phone 通过直接主电源充电或通过 USB 连接到计算机间接充电,则后台推送将在绝大多数时间传送到应用程序。但是断开 phone 与电源或 USB 的连接,即使 phone 的电池电量为 100%,后台推送也几乎永远不会传送到应用程序。

您可以很容易地自己测试这一点,只需在 phone 充电时和不充电时发送一些推送即可。但是您必须考虑到开发构建和使用沙箱环境的后台推送与生产构建和生产环境的后台推送行为不同,后台推送实际上更有可能交付给开发中的应用程序然后它们就会投入生产,因此使用生产构建和 Apple 的生产环境进行测试以查看实际结果至关重要。

注意推送有两个步骤,第一步是它需要被传送到 phone 本身,第二个是一旦 phone 有了它,它就需要被传送通过 OS 到应用程序。在 iOS7 中,诸如开启 Wifi 之类的事情使得推送到达 phone 的机会增加了。然而,对于 iOS8,即使推送已成功传送到 phone,如果 phone 未收费,OS 也不会将其转发到后台应用程序.这意味着 phone 收到通知并保留它,有时会保留几个小时,然后如果 phone 未充电,它可能会将其转发给应用程序。