didEnterRegion执行顺序?

时间:2013-11-04 11:46:52

标签: ios objective-c cllocationmanager uilocalnotification region

所以我问了一个关于我的代码与didEnterRegion有关的问题,但也许我太具体了,因此我可以请某人用更通用的术语来区分方法调用,特别是当应用程序在后台时

我的理解是:

  1. App注册区域调用startMonitoringForRegion:
  2. 用户点击主页按钮或锁定设备,应用程序进入后台。
  3. 设备位置在操作系统级别进行监控,与应用程序分开,操作系统从不启动应用程序以确认用户当前位置。
  4. 当用户越过边界进入该区域时,操作系统会查找最初注册该区域的应用并启动该应用。
  5. 应用程序在后台启动,但是(但是没有调用didFinishLaunchingWithOptions:),设置了CLLocationManager委托,调用了didEnterRegion委托方法。
  6. 在我的情况下,这会立即显示UILocalNotification(如果正在使用另一个应用程序,则在主屏幕上显示横幅,如果手机处于休眠状态,则在锁定屏幕上显示)。
  7. 用户通过在锁定屏幕中滑动或点击横幅来操作通知,启动应用并调用appWillEnterForeground / appWillBecomeActive并且如果已实施则调用app delegate didRecieveLocalNotification:方法。
  8. 这是我的理解,这可能是错误的,因为如果应用程序在后台,我的UILocalNotification永远不会被触发。有人可以澄清哪些是错的吗?

1 个答案:

答案 0 :(得分:0)

经过进一步测试后,我得出的结论是,我的代码没有任何问题,实际上似乎是苹果实施的区域监控效果不佳。它似乎只比监控重要的位置变化略好,并且仍然依赖于wifi网络和蜂窝塔的变化。即使在英国的一个主要城市,我发现在没有触发的情况下,如果你被触发到1000英里到一英里宽的地区,那么就不会触发它。这解释了为什么每次通过Xcode测试并强制定位时它都能正常工作。

我到目前为止唯一的解决方法是计算每次更新用户位置时剩余的距离,并在小于区域radius / 2时手动调用didEnterRegion委托方法。当你进入边界超过10米时,这应该由苹果代码自动完成,但是由于上述原因我发现它是不可靠的。

然而,鉴于你无法使用更好的GPS准确度获得定期更新,而应用程序在后台,这只是一个问题,当应用程序在后台时,它根本不是一个真正的解决方案。 :O(