终止/暂停时重要更改位置API的行为?

Red*_*ing 109 core-location uiapplicationdelegate cllocationmanager ios

这是CLLocationManager文档中描述使用startMonitoringSignificantLocationChanges的应用程序行为的部分:

如果您启动此服务并且您的应用程序随后终止,则系统会在新事件到达时自动将应用程序重新启动到后台.在这种情况下,传递给应用程序的选项字典:didFinishLaunchingWithOptions:应用程序委托的方法包含密钥UIApplicationLaunchOptionsLocationKey,以指示您的应用程序是由于位置事件而启动的.重新启动后,您仍必须配置位置管理器对象并调用此方法以继续接收位置事件.重新启动位置服务时,会立即将当前事件传递给您的代理.此外,即使在启动位置服务之前,也会使用最新的位置对象填充位置管理器对象的位置属性.

所以我的理解是,如果你的应用程序终止(并假设你没有从applicationWillTerminate调用stopMonitoringSignificantLocationChanges),你将会被应用程序唤醒UIApplicationLaunchOptionsLocationKey参数:didFinishLaunchingWithOptions.此时,您将创建CLLocationManager,调用startMonitoringSignificantLocationChanges并在有限时间内执行后台位置处理.这一点我很好.

前一段只谈到应用程序终止时会发生什么,它不会建议您在应用程序暂停时执行的操作.didFinishLaunchingWithOptions的文档说:

该应用程序在后台跟踪位置更新,已被清除,现在已重新启动.在这种情况下,字典包含一个键,表示由于新的位置事件导致应用程序重新启动.

建议您在终止后启动应用程序(因为位置更改)时才会收到此呼叫.

但是," 位置感知规划指南"中关于重大变更服务的段落如下:

如果您使此服务保持运行并且您的应用程序随后被暂停或终止,则服务会在新位置数据到达时自动唤醒您的应用程序.在唤醒时,您的应用程序将被置于后台并给予少量时间来处理位置数据.由于您的应用程序位于后台,因此应该执行最少的工作并避免任何可能阻止其在分配的时间到期之前返回的任务(例如查询网络).如果没有,您的申请可能会被终止.

这表明如果您的应用已被暂停,您会被位置数据唤醒,但未提及您是如何被唤醒的:

在写这篇文章的过程中,我想我可能刚刚回答了我自己的问题,但是如果有更多知识渊博的人对我的理解得到证实,那就太棒了.

Red*_*ing 80

自从我提出这个问题以来,我做了一些测试(主要是在家庭和工作之间的火车上),并确认暂停应用程序的行为是我在问题结束时所怀疑的.

也就是说,您的被暂停的应用程序被唤醒,您没有收到应用程序代表的任何回调,而是通过现有的CLLocationManagerDelegate接收您的位置更新.您可以通过检查applicationState来检测您在后台运行,并针对您从挂起状态唤醒以进行位置处理的情况进行有限的工作.

[UIApplication sharedApplication].applicationState == UIApplicationStateBackground
Run Code Online (Sandbox Code Playgroud)

我通过位置测试工具得出了这个结论,欢迎您下载并试用.这是一个非常简单的应用程序,允许您通过用户界面打开重大更改和GPS更改API,并记录您收到的所有响应.

NB在上一个答案中的第六点是不正确的.冻结已挂起的应用程序在从挂起状态唤醒时会收到CLLocationManagerDelegate回调.

  • 不适用于ios7 http://stackoverflow.com/questions/18946881/background-location-services-not-working-in-ios-7 (2认同)

Aar*_*ron 25

我的理解如下(我正在编写依赖于此API的应用程序,但尚未完成此组件以便开始测试):

  1. 您的应用程序是第一次运行,您注册到startMonitoringSignificantLocationChanges,并提供回调函数.当您的应用程序正在运行时,它会在收到重大更改时调用该回调.
  2. 如果您的应用程序被置于后台,UIApplication将接收applicationWillResignActive,然后是applicationDidEnterBackground.
  3. 如果您的申请在后台暂停时被杀,您将不会收到通知; 但是,如果您的应用程序在运行时被终止(前景或背景知识),您将获得applicationWillTerminate的时刻.您无法从此功能请求额外的背景时间.
  4. 尽管在后台被杀,操作系统将重新启动您的应用程序.如果您的应用程序仅由操作系统启动以进行更改,您将调用应用程序didFinishLaunchingWithOptions:

    if ([launchOptions objectForKey:UIApplicationLaunchOptionsLocationKey])
    
    Run Code Online (Sandbox Code Playgroud)

    将帮助您确定是否从背景位置更改返回.

  5. 相反,如果您当前在后台运行,并且您的应用程序由用户手动重新启动,您将收到applicationWillEnterForeground,后跟applicationDidBecomeActive.
  6. 不管它是如何发生的,当你的应用程序重新启动(除非它仍然在后台作为后台任务的结果运行,并说任务已经开始监视的变化),你需要明确地告诉它startMonitoringSignificantLocationChanges再次因为回调是没有在"冷冻干燥"后更长时间附着.是的,一旦从暂停状态返回后重新附加某种位置处理程序,您只需要在didUpdateToLocation中实现代码.

这就是我现在正在进行的代码开发.正如我之前提到的,我还没准备好在设备上测试这个,所以我不知道我是否正确解释了所有内容,所以评论者请随时纠正我(尽管我已经对话题).

哦,如果运气不好,你发布了一个应用程序,做我想做的事情,我可能会哭:)

祝好运!