如果UIBackgroundModes中定义的远程通知和新推送通知到来,iOS是否会在重启后启动应用程序?

Ole*_*rov 4 reboot push-notification apple-push-notifications ios

我有一个iOS7应用程序注册后台模式远程通知:

<key>UIBackgroundModes</key>
<array>
    <string>remote-notification</string>
</array>
Run Code Online (Sandbox Code Playgroud)

它在重新启动之前工作正常,应用程序在后台获取此事件:

-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
Run Code Online (Sandbox Code Playgroud)

但它看起来像重启后我不再得到这个事件,直到我手动启动应用程序.

所以,问题是:我可以让iOS7在我的应用程序收到静态推送通知后重启后运行我的应用程序吗?我的推送通知没有"alert"字段,只有"contentAvailable" - 这可能是一个原因吗?我已经看到像whatsapp这样的应用程序能够在重新启动后立即接收并显示推送通知,因此它看起来至少可以用于"警报"类型的通知.

我知道我可以使用重要的位置监控在重启后的某个时刻重新启动应用程序,但我想避免一直在工具栏上显示位置图标.后台获取模式可以帮助吗?有没有统计数据,重启后应用程序的后台获取模式会有多快?

Nan*_*dha 10

不,它不会起作用.因为您重启设备时应用程序将处于" 未运行"状态.

根据apple doc,新的多任务API(提取和远程通知)仅在应用程序处于挂起/后台/前台状态时才有效.如果应用程序处于后台/前台状态,application:didReceiveRemoteNotification:fetchCompletionHandler则会触发.如果应用处于暂停状态,-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions则会触发.在您的情况下,应用程序处于" 未运行"状态,因为它application:didReceiveRemoteNotification:fetchCompletionHandler永远不会被触发.

有关应用程序状态的更多信息,请参阅apple doc.

  • 你的原因......"因为你的应用程序将处于非runnin状态"是不正确的.这一切都取决于a)背景提取(在您的应用程序的代码配置设置中)和b)依赖于最终用户未从设置 - >常规 - >后台应用程序刷新中禁用"后台应用程序刷新"这一事实的组合.如果两者都已实现,则应用程序将从NOT RUNNING状态进入SUSPENDED MODE或BACKGROUND STATE,具体取决于您选择的更新类型(例如,位置,VOIP,音频等) (2认同)