【问题标题】:Not receiving Push Notification in Sleep Mode睡眠模式下收不到推送通知
【发布时间】:2015-03-09 21:52:08
【问题描述】:

想要: 我希望能够在应用程序处于后台时(包括手机处于睡眠模式时)收到推送通知(静默)时触发 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 无线电也会关闭,这使得在没有端口转发的情况下无法连接到本地 ip。

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

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

【问题讨论】:

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


    【解决方案1】:

    “假设:推送通知唤醒正在后台运行的应用程序(即使在睡眠中)”。

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

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

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

    注意推送有两个步骤,第一个是需要自己发送到手机上,第二个是手机有后,然后需要由操作系统发送到应用程序。在 iOS7 中,开启 Wifi 等功能使得推送到手机的机会增加。然而,对于 iOS8,即使推送已成功发送到手机,如果手机未充电,操作系统也不会将其转发到后台应用程序。这意味着手机会收到通知并保持它,有时会持续几个小时,然后如果手机没有充电,它可能会将其转发到应用程序。

    【讨论】:

    • 当手机处于充电状态时,它的 CPU 不会休眠。当手机未充电且 CPU 处于睡眠状态时,蜂窝调制解调器会中断 CPU 以在收到推送数据包时将其唤醒,这是微软在 Pocket PC 时代采用的技巧。
    【解决方案2】:

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

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

    [..]

    要支持这种后台模式,请从 Xcode 项目的 Capabilities 选项卡的 Background mode 部分启用 Remote notifications 选项。 (您还可以通过在应用的 Info.plist 文件中包含带有远程通知值的 UIBackgroundModes 键来启用此支持。)

    【讨论】:

    • 嘿 KIDdAe,我已启用远程通知 > UIBackground 模式。感谢您尝试提供帮助:)。
    猜你喜欢
    • 1970-01-01
    • 2016-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多