2

所以我问了一个关于我的代码与didEnterRegion有关的问题,但也许我是太具体了,因此我可以请求某人澄清方法调用的区域监视的更通用的术语的顺序,特别是当应用程序在后台。didEnterRegion执行顺序?

我的理解是:

  1. 应用注册区域调用startMonitoringForRegion:
  2. 用户点击主页按钮或锁定装置,应用程序进入后台。
  3. 设备位置在操作系统级别进行监视,与应用程序分开,操作系统从未启动应用程序以确认用户当前的位置。
  4. 当用户跨越边界进入该区域时,操作系统会查找哪个应用程序最初注册了该区域并启动该应用程序。
  5. 该应用程序在后台启动,但(didFinishLaunchingWithOptions:未被调用),CLLocationManager委托设置,它的didEnterRegion委托方法被调用。
  6. 在我的情况下,这会设置立即显示的UILocalNotification(例如,如果正在使用其他应用程序,则在主屏幕上显示标题,或者如果电话处于休眠状态,则显示在锁定屏幕上)。
  7. 用户通过在锁定屏幕中滑动或点击横幅来操作通知,启动应用程序并调用appWillEnterForeground/appWillBecomeActive,并在应用程序委托didRecieveLocalNotification:方法被调用后执行。

这是我的理解,这可能是错误的,因为如果应用程序在后台,我的UILocalNotification永远不会被触发。有人能澄清哪些位错了吗?

回答

0

经过进一步测试后,我得出结论认为我的代码没有问题,实际上它似乎是苹果区域监控实施效果差。它似乎只比监测重要的位置变化稍微好一些,而且仍然依赖于无线网络和蜂窝塔的变化。即使在英国的一个主要城市,我发现didEnterRegion没有被触发,直到你进入一英里宽的区域达1000米(如果触发的话)。这解释了为什么它每次测试Xcode和强制位置时都有效。

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

但是,由于您无法使用GPS的更高准确度获得定期更新,而应用程序处于后台,这只是应用程序在后台时的问题,它根本不是一个真正的解决方案。 :o(