使用CLLocationManager
我正在定义区域并响应didEnterRegion和didExitRegion。这很好用,因为当设备在区域之间移动时,我得到Enter和Exit的回调。
问题是因为手机设备坐在桌子上而没有移动,我已经过夜几次运行应用程序。电话设备位于输入区域的中心。
在夜间,大约每小时一次,我得到一个didExitRegion,然后在不到15秒的时间内得到一个didEnterReqion。
我过滤这些幻像退出/输入对的解决方案是在我退出等待15秒时设置一个计时器,然后如果我没有在该计时器窗口内收到相同区域的Enter,那么我处理退出。
如果应用程序在前台,但在后台失败,则此方法有效。在后台模式下,我仍然可以获得didExitEvent,但我认为应用程序在15秒窗口过去之前将重新进入后台模式。在手机重新进入前台模式之前,我不会触发该计时器。
我所在区域的半径为250M,精度模式最接近10米。我的设备在静止不动时居于区域中,但我仍然可以每小时获得一次幻影退出/输入对。
我需要找到一种方法来停止幻像退出/输入对,或者需要一种方法让计时器在应用程序返回后台模式之前保持15秒运行。
有没有人有一个很好的解决方案来处理固定设备的随机退出/进入或进入/退出对?
在后台模式下,当应用程序唤醒事件时,计时器可以运行的最长时间是多少?
答案 0 :(得分:1)
Geofencing不使用三角测量(这就是为什么你提到的“准确模式”完全无关紧要)。 Geofencing依赖于“数字签名” - 您的iPhone检测到的一组wifi接入点和手机信号塔,以及来自这些信号源的信号强度。每当此数字签名发生变化时,手机可能会被愚弄为触发地理围栏事件。
然而,在报告事件之前,iOS会运行三角测量(在大多数情况下没有GPS) - 并且您可以使用生成的位置来检查您是否真的在地理围栏之外。如果相对于地理围栏的大小,位置精度太低,您可能会获得更好的读数 - requestLocation()将会有效,因为它不会运行超过10秒。
顺便说一下,在检测到地理围栏事件之后,iOS运行的三角测量序列很可能就是为什么你的手机在didExit之后不久就注册了didEnter事件。
在后台模式下布防计时器是没有意义的,因为iOS在后台执行的前15到20秒后默默暂停后台任务。此行为是在iOS 7中引入的,并在iOS 10生命周期内针对计时器强制执行。