1

想要:我希望能够在应用程序处于后台时(包括手机处于睡眠模式时)在收到推送通知(静音)时触发 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 会在短时间内收到推送通知,然后再也不会收到它们。

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

4

2 回答 2

0

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

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

[..]

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

于 2015-03-09T23:16:43.157 回答
0

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

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

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

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

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

于 2015-03-31T16:46:56.127 回答