1

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

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

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

剧透警告!当我打开手机时,我没有获得新的位置。也许我需要开得更远,但 5 英里应该足够更换手机信号塔了……尽管这并不是真正的手机信号塔更换,因为手机关机了。

4

2 回答 2

4

事实证明,在这种情况下,应用程序以一种非常有趣的方式被唤醒。我在 startMonitoringSignificantLocationChanges 的文档中找到了这一段:

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

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

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

于 2013-09-18T18:33:32.420 回答
0

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

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

于 2013-09-17T23:14:15.987 回答