【问题标题】:CLLocationManager False didExitRegionCLLocationManager False didExitRegion
【发布时间】:2018-01-25 18:57:29
【问题描述】:

使用 CLLocationManager

我正在定义区域并响应 didEnterRegion 和 didExitRegion。这很好用,因为当设备在区域之间移动时,我得到了 Enter 和 Exit 的回调。

问题是我在手机设备放在桌子上一动不动的情况下通宵运行了几次该应用程序。电话设备位于输入区域的中心。

在夜间,大约每小时一次,我得到一个 didExitRegion,然后在不到 15 秒内我得到一个 didEnterReqion。

我过滤这些幻像退出/进入对的解决方案是设置一个计时器,当我得到一个退出等待 15 秒,然后如果我在该计时器窗口内没有收到同一区域的 Enter,然后我处理退出.

如果应用程序在前台,这有效,但在后台失败。在后台模式下,我仍然会收到 didExitEvent,但我认为应用程序会在 15 秒窗口过去之前返回后台模式,我不会在手机返回前台模式之前触发该计时器。

我的区域半径是250M,精度模式是最近10米。我的设备虽然静止不动,但位于区域中心,但我仍然每小时得到一次这些幻像退出/进入对。

要么我需要找到一种方法来停止幻像退出/进入对,要么需要一种方法让计时器在应用返回后台模式之前保持完整的 15 秒运行。

有没有人有一个很好的解决方案来处理固定设备的随机退出/进入或进入/退出对?

还有,在后台模式下,定时器可以在应用唤醒事件时运行的最长时间是多少?

【问题讨论】:

  • 请发布您的代码

标签: ios timer cllocationmanager


【解决方案1】:

地理围栏不使用三角测量(这就是您提到的“准确模式”完全不相关的原因)。地理围栏依赖于“数字签名”——iPhone 检测到的一组 wifi 接入点和手机信号塔以及来自这些来源的信号强度。每当这个数字签名发生变化时,手机都可能被骗触发地理围栏事件。

但是,在报告事件之前,iOS 会运行三角测量(在大多数情况下没有 GPS) - 您可以使用生成的位置来检查您是否真的在地理围栏之外。如果定位精度相对于您的地理围栏尺寸太低,您可能会获得更好的读数 - requestLocation() 可以解决问题,因为它不会运行超过 10 秒。

顺便说一句,iOS 在检测到地理围栏事件后运行的三角测量序列很可能是您的手机在 didExit 后不久注册 didEnter 事件的原因。

在后台模式下设置计时器毫无意义,因为 iOS 在后台执行前 15 到 20 秒后会静默挂起后台任务。此行为是在 iOS 7 中引入的,并在 iOS 10 生命周期内强制执行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-01
    • 1970-01-01
    • 2014-11-15
    • 2011-05-08
    • 1970-01-01
    • 1970-01-01
    • 2019-01-15
    相关资源
    最近更新 更多