CLLocationManager False didExitRegion
CLLocationManager False didExitRegion
使用 CLLocationManager
我正在定义区域并响应 didEnterRegion 和 didExitRegion。这很好用,因为当设备在区域之间移动时,我得到了 Enter 和 Exit 的回调。
问题 是我 运行 应用程序过夜了几次 phone 设备坐在 table 而不是移动。 phone 设备位于输入区域的中心。
在晚上,大约每小时一次,我得到一个 didExitRegion,然后在不到 15 秒内我得到一个 didEnterReqion。
我过滤这些幻影 exit/enter 对的解决方案是设置一个计时器,当我离开时等待 15 秒,然后如果我在该计时器内没有收到同一区域的回车 window 然后我处理退出。
如果应用程序在前台运行,此方法有效,但在后台运行时失败。在后台模式下我仍然得到 didExitEvent 但我认为应用程序会在 15 秒 window 过去之前返回到后台模式,我不会触发该计时器直到 phone 返回到前景模式。
我的区域半径是250M,精度模式最近10米。我的设备静止不动时位于该区域的中心,但我仍然每小时获得一次这些幻影 Exit/Enter 对。
要么我需要找到一种方法来停止幻影 exit/enter 对,要么需要一种方法让计时器 运行 在应用程序返回后台模式之前保持整整 15 秒。
有人有好的解决方案来处理固定设备的随机 exit/enter 或 enter/exit 对吗?
此外,在后台模式下应用程序唤醒事件后,计时器可以 运行 的最长时间是多少?
地理围栏不使用三角测量(这就是为什么 "accuracy mode" 你提到的完全不相关)。地理围栏依赖于 "digital signature" - 您 iPhone 检测到的一组 wifi 接入点和手机信号塔,以及来自这些来源的信号强度。每当此数字签名发生变化时,phone 可能会被愚弄以触发地理围栏事件。
但是,在报告事件之前,iOS 运行 三角测量(在大多数情况下没有 GPS)- 以及结果位置可供您检查您是否真的在地理围栏之外。如果位置精度相对于地理围栏的大小而言太低,您可能会获得更好的读数 - requestLocation() 可以解决问题,因为它不会 运行 超过 10 秒。
顺便说一下,在检测到地理围栏事件后 iOS 运行 秒的三角测量很可能就是为什么 phone 在 didExit 后不久注册 didEnter 事件的原因。
在后台模式下设置计时器没有任何意义,因为 iOS 在后台执行的前 15 到 20 秒后静默暂停后台任务。此行为是在 iOS 7 中引入的,并在 iOS 10 生命周期内对计时器强制执行。
使用 CLLocationManager
我正在定义区域并响应 didEnterRegion 和 didExitRegion。这很好用,因为当设备在区域之间移动时,我得到了 Enter 和 Exit 的回调。
问题 是我 运行 应用程序过夜了几次 phone 设备坐在 table 而不是移动。 phone 设备位于输入区域的中心。
在晚上,大约每小时一次,我得到一个 didExitRegion,然后在不到 15 秒内我得到一个 didEnterReqion。
我过滤这些幻影 exit/enter 对的解决方案是设置一个计时器,当我离开时等待 15 秒,然后如果我在该计时器内没有收到同一区域的回车 window 然后我处理退出。
如果应用程序在前台运行,此方法有效,但在后台运行时失败。在后台模式下我仍然得到 didExitEvent 但我认为应用程序会在 15 秒 window 过去之前返回到后台模式,我不会触发该计时器直到 phone 返回到前景模式。
我的区域半径是250M,精度模式最近10米。我的设备静止不动时位于该区域的中心,但我仍然每小时获得一次这些幻影 Exit/Enter 对。
要么我需要找到一种方法来停止幻影 exit/enter 对,要么需要一种方法让计时器 运行 在应用程序返回后台模式之前保持整整 15 秒。
有人有好的解决方案来处理固定设备的随机 exit/enter 或 enter/exit 对吗?
此外,在后台模式下应用程序唤醒事件后,计时器可以 运行 的最长时间是多少?
地理围栏不使用三角测量(这就是为什么 "accuracy mode" 你提到的完全不相关)。地理围栏依赖于 "digital signature" - 您 iPhone 检测到的一组 wifi 接入点和手机信号塔,以及来自这些来源的信号强度。每当此数字签名发生变化时,phone 可能会被愚弄以触发地理围栏事件。
但是,在报告事件之前,iOS 运行 三角测量(在大多数情况下没有 GPS)- 以及结果位置可供您检查您是否真的在地理围栏之外。如果位置精度相对于地理围栏的大小而言太低,您可能会获得更好的读数 - requestLocation() 可以解决问题,因为它不会 运行 超过 10 秒。
顺便说一下,在检测到地理围栏事件后 iOS 运行 秒的三角测量很可能就是为什么 phone 在 didExit 后不久注册 didEnter 事件的原因。
在后台模式下设置计时器没有任何意义,因为 iOS 在后台执行的前 15 到 20 秒后静默暂停后台任务。此行为是在 iOS 7 中引入的,并在 iOS 10 生命周期内对计时器强制执行。