核心位置:在重大位置更改后,当 iPhone 打开时,如何唤醒我的应用程序



我正在尝试构建一个依赖于区域监控和重大位置更改的应用程序。我正在测试的特定场景是:

  1. 用户(使用我的应用)前往周围有区域的机场
  2. 由于区域破坏,我的应用程序已成功唤醒...进入。
  3. 他们像一个好小乘客一样关掉iPhone。
  4. 他们降落在某个遥远的城市
  5. 他们重新打开手机

我是否应该期望通过重大更改监控在后台获得新位置?一直坐飞机来测试这个太贵了,所以我通过关闭手机、行驶 5 英里左右并重新打开来进行测试。

剧透预警!打开手机时,我没有获得新位置。也许我需要开得更远,但 5 英里应该足够更换手机信号塔......即使自从手机关闭以来,这并不是真正的手机信号塔变化。

事实证明,在这种情况下,该应用程序以非常有趣的方式被唤醒。我在文档中找到了这一段 开始监控重要位置更改:

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

我加粗了我认为非常重要的部分。首先,当手机启动备份并且操作系统意识到它已经移动了很长的距离时,它不会调用 locationManager:didUpdateLocations:正如我所期望的那样,它在文档中说。它将在后台启动应用程序,调用应用程序:didFinishLaunchingWithOptions: AppDelegate 的方法。那里提供的 NSDictionary 将包含一个特殊键(在上面的文档中注明),告诉您它是由于位置更改而启动的。然后由您再次调用位置管理器:开始监视显著位置更改。

希望这对其他人有所帮助。我为自己制作了一个简单的小测试应用程序,在真空中进行测试,并验证它对我有用。

如果在连接到 Xcode 的调试器时运行应用程序,则可以模拟位置更改。 这似乎适用于模拟器或联机设备。

https://developer.apple.com/library/ios/recipes/xcode_help-debugger/articles/simulating_locations.html

最新更新