这是CLLocationManager文档中使用startMonitoringSignificantLocationChanges描述应用程序行为的部分:
如果您启动此服务并且您的应用程序随后终止,则系统会在新事件到达时自动将应用程序重新启动到后台。在这种情况下,传递给 application:didFinishLaunchingWithOptions: 应用程序委托方法的选项字典包含键 UIApplicationLaunchOptionsLocationKey 以指示您的应用程序是由于位置事件而启动的。重新启动后,您仍然必须配置位置管理器对象并调用此方法以继续接收位置事件。当您重新启动位置服务时,当前事件会立即传递给您的委托。此外,即使在您启动位置服务之前,您的位置管理器对象的位置属性也会填充最新的位置对象。
所以我的理解是,如果您的应用程序终止(并且我假设您不从applicationWillTerminate调用stopMonitoringSignificantLocationChanges ),您将被application:didFinishLaunchingWithOptions的UIApplicationLaunchOptionsLocationKey参数唤醒。此时,您创建CLLocationManager,调用startMonitoringSignificantLocationChanges并在有限的时间内进行后台位置处理。所以我对这一点很好。
上一段只讨论了应用程序终止时会发生什么,并没有建议您在应用程序暂停时做什么。didFinishLaunchingWithOptions的文档说:
该应用程序在后台跟踪位置更新,已被清除,现在已重新启动。在这种情况下,字典包含一个键,表明应用程序由于新的位置事件而重新启动。
建议您仅在您被终止后启动应用程序(由于位置更改)时才会收到此呼叫。
然而,位置感知编程指南中关于重大变化服务的段落有以下说法:
如果您保持此服务运行并且您的应用程序随后被暂停或终止,则该服务会在新的位置数据到达时自动唤醒您的应用程序。在唤醒时,您的应用程序将进入后台并给予少量时间来处理位置数据。因为您的应用程序在后台,所以它应该做最少的工作并避免任何可能阻止它在分配的时间到期之前返回的任务(例如查询网络)。如果没有,您的申请可能会被终止。
这表明如果您的应用程序已暂停,您会被位置数据唤醒,但没有提及您是如何被唤醒的:
- UIApplicationDelegate是否收到一个回调,告诉我我正在从挂起状态恢复到后台状态?
- 位置管理器(在应用程序暂停时被冻干)是否开始接收locationManager:didUpdateToLocation:fromLocation回调?
- 我是否只需要在我的didUpdateToLocation消息中实现代码来检查应用程序状态并在后台模式下进行最少的处理?
在写这篇文章的过程中,我想我可能刚刚回答了我自己的问题,但如果我对这个问题的理解得到更有知识的人的证实,那就太好了。