在睡眠模式下未接收推送通知

时间:2015-03-09 21:52:08

标签: ios apple-push-notifications background-process sleep-mode

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

假设: 推送通知唤醒在后台运行的应用程序(即使在睡眠状态下) https://discussions.apple.com/thread/3650066:提供建议新路由器的分辨率,但这仅适用于WiFi上的手机。我正在使用蜂窝连接。

尝试: 我已经验证我正在使用正确的委托方法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);
}

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

我已经确认通知正在运行,因为当应用处于前台或后台(非睡眠模式)时,我能够看到日志声明。

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

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

更新

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

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

提前致谢,我将监视线程,根据需要提供更多信息。

2 个答案:

答案 0 :(得分:0)

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

  

如果您的服务器在您的应用有新内容时向用户的设备发送推送通知,您可以要求系统在后台运行您的应用,以便它可以立即开始下载新内容。

     

[..]

     

要支持此后台模式,请在Xcode项目的“功能”选项卡的“后台模式”部分中启用“远程通知”选项。 (您还可以通过在应用程序的Info.plist文件中包含带有远程通知值的UIBackgroundModes键来启用此支持。)

答案 1 :(得分:0)

"假设:推送通知唤醒在后台运行的应用程序(即使在睡眠状态下)"。

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

如果手机通过直接主电源充电或通过USB连接到计算机间接充电,那么背景推送将在绝大多数时间内传送到应用程序。但是,断开手机与电源或USB的连接,即使手机的电池100%充电,也几乎不会将背景推送到应用程序。

你可以很容易地为自己测试这个,只需在手机正在充电时发送一些推送而不是手机充电。但是你必须考虑到后台推动开发构建和使用沙箱环境不要与生产构建和生产环境的后台推送相同,后台推送实际上更有可能在开发中传递给应用程序然后他们开始投入生产,因此使用生产版本和Apple的生产环境进行测试以查看实际结果至关重要。

注意推送传递有两个步骤,第一步是它需要传送到手机本身,第二步是手机拥有它,然后需要由操作系统传送到应用程序。在iOS7中,诸如Tifi on Wifi之类的东西使推动电话增加的机会增加了。使用iOS8,即使推送成功传送到手机,如果手机没有充电,操作系统也不会将其转发到后台应用程序。这意味着手机会收到通知并保留通知,有时持续几个小时,如果手机没有收费,它可能会转发给应用。