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