所以我问了一个关于我与didEnterRegion相关的代码的问题,但也许我太具体了,因此我可以请某人用更通用的术语来阐明方法调用的顺序以进行区域监视,尤其是在后台运行应用程序时。

我的理解是:

  • 应用程序注册调用startMonitoringForRegion的区域:
  • 用户点击主页按钮或锁定设备,应用程序将进入后台。
  • 在操作系统级别上监视设备位置,与应用程序分开,操作系统从不启动应用程序以确认用户当前位置。
  • 当用户越过边界进入区域时,操作系统将查找最初注册该区域的应用程序并启动该应用程序。
  • 该应用程序在后台启动(但未调用didFinishLaunchingWithOptions:),设置了CLLocationManager委托,并调用了didEnterRegion委托方法。
  • 在我的情况下,这将设置一个UILocalNotification并立即显示(如果正在使用其他应用程序,则横幅显示在主屏幕上;如果手机处于休眠状态,则显示在锁定屏幕上)。
  • 用户通过在锁定屏幕上滑动或点击横幅来操作通知,启动应用程序并调用appWillEnterForeground / appWillBecomeActive,并调用应用程序委托didRecieveLocalNotification:方法(如果已实现)。

  • 这是我的理解,这可能是错误的,因为如果应用程序在后台运行,则不会触发我的UILocalNotification。有人可以弄清楚哪些位错了吗?

    最佳答案

    经过进一步的测试,我得出的结论是我的代码没有任何问题,实际上这似乎是苹果公司对区域监视的实施效果不佳。它似乎仅比监视重大位置变化好一点,并且仍然依赖于wifi网络和基站的变化。即使在英国一个主要城市内,我也发现EnterEnterRegion不会被触发,直到您到达一英里宽的区域(直到1000米)为止(如果触发的话)。这解释了为什么在通过Xcode测试并强制定位时每次都能工作。

    到目前为止,我所能解决的唯一问题是计算每次更新用户位置时剩余的距离,并在小于区域radius / 2时手动调用didEnterRegion委托方法。当您进入边界10m以上时,应该由Apples代码自动完成此操作,但是由于上述原因,我发现这样做并不可靠。

    但是,由于在后台运行该应用程序时无法使用GPS精度更高的定期更新,而这仅是在后台运行时才存在的问题,它根本不是解决方案。 :o(

    关于ios - didEnterRegion执行顺序?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19767083/

    10-12 19:57