如果您启动此服务并随后终止应用程序,则系统会自动将应用程序重新启动到后台,以便在出现新事件时使用。在这种情况下,传递给应用程序委托的application:didFinishLaunchingWithOptions:方法的选项字典包含键UIApplicationLaunchOptionsLocationKey,以指示您的应用程序是由于位置事件而启动的。重新启动后,您仍然必须配置一个位置管理器对象并调用此方法以继续接收位置事件。当您重新启动位置服务时,当前事件会立即传递给您的委托。此外,在您启动位置服务之前,位置管理器对象的位置属性已填充了最新的位置对象。
所以我的理解是,如果您的应用程序终止(我假设如果您不从applicationWillTerminate调用stopMonitoringSignificantLocationChanges),则会在application:didFinishLaunchingWithOptions中使用UIApplicationLaunchOptionsLocationKey参数唤醒您。此时,您创建CLLocationManager,调用startMonitoringSignificantLocationChanges并进行limited time的后台位置处理。所以我对这一部分很满意。
上一段只是讨论了应用程序终止时会发生什么,并没有建议在应用程序挂起时应该做什么。didFinishLaunchingWithOptions 的文档说:
“应用程序在后台跟踪位置更新,被清除,现在已经重新启动。在这种情况下,字典包含一个键,指示应用程序由于新的位置事件而重新启动。”
这表明,只有在您被终止后,由于位置更改而启动应用程序时,您才会收到此调用。
然而,在 Location Awareness Programming Guide 中,Significant Change Service 的段落则有如下说法:
如果您保持此服务运行并且应用程序随后被暂停或终止,则服务将在新的位置数据到达时自动唤醒您的应用程序。在唤醒时,您的应用程序被放置在后台,并被赋予一小段时间来处理位置数据。由于您的应用程序在后台运行,因此它应该尽量少做工作,并避免任何可能阻止其在分配的时间到期之前返回的任务(例如查询网络)。否则,您的应用程序可能会被终止。
这表明如果您的应用程序已被暂停,您将通过位置数据被唤醒,但未说明如何唤醒您:
- 是否有UIApplicationDelegate回调通知我从挂起状态恢复到后台状态?
- 冻结时的位置管理器(在应用程序挂起时)是否开始接收locationManager:didUpdateToLocation:fromLocation回调?
- 我是否只需要在didUpdateToLocation消息中实现代码,检查应用程序状态并在后台模式下进行最小处理?
在撰写本文的过程中,我想我可能已经回答了自己的问题,但是由更有经验的人确认我的理解将是很好的。