事实证明,在这种情况下,应用程序以一种非常有趣的方式被唤醒。我在 startMonitoringSignificantLocationChanges 的文档中找到了这一段:
如果您启动此服务并且您的应用程序随后终止,则系统会在新事件到达时自动将应用程序重新启动到后台。在这种情况下,传递给应用程序委托的 locationManager:didUpdateLocations: 方法的选项字典包含键 UIApplicationLaunchOptionsLocationKey 以指示您的应用程序是由于位置事件而启动的。重新启动后,您仍然必须配置位置管理器对象并调用此方法以继续接收位置事件。当您重新启动位置服务时,当前事件会立即传递给您的委托。此外,即使在您启动位置服务之前,您的位置管理器对象的位置属性也会填充最新的位置对象。
我已经加粗了我认为非常重要的部分。首先,当手机重新启动并且操作系统意识到它已经移动了很长一段距离时,它不会像我所期望的那样调用 locationManager:didUpdateLocations: 并且它在文档中说。它将在后台调用 AppDelegate 的 application:didFinishLaunchingWithOptions: 方法启动应用程序。那里提供的 NSDictionary 将包含一个特殊键(在上面的文档中注明),告诉您它是由于位置更改而启动的。然后由您决定再次调用 locationManager:startMonitoringSignificantLocationChanges。
希望这对其他人有帮助。我为自己制作了一个简单的小测试器应用程序来在真空中进行测试并验证它对我有用。