didDetermineStateForRegion 和 didExitRegion 返回错误响应
Posted
技术标签:
【中文标题】didDetermineStateForRegion 和 didExitRegion 返回错误响应【英文标题】:didDetermineStateForRegion and didExitRegion returning false responses 【发布时间】:2016-03-09 20:54:33 【问题描述】:当用户进入信标区域和退出信标区域时,我会向用户显示本地通知。出口是最重要的,因为我告诉用户他们在那个位置停留了多长时间。我正在使用区域监控,因为它允许我跟踪信标,即使应用程序处于后台或暂停状态。我遇到了一个错误,我正在监视 3 个信标(这发生在 2 和 1 上,但频率较低)。我的手机会休眠,我会继续监视信标。然后,我的应用程序将由于其中一个信标的 didExitRegion 而唤醒,即使所有 3 个信标都与我的手机正面朝上坐在同一张桌子上。每次都是不同的信标,所以我已经控制了我们的信号强度。然后,一旦应用程序唤醒,它会重新发现信标并立即重新进入(因为它从一开始就没有离开信号)。我正在同时使用 android 设备检测信号,并且信标一直在广播,因此 iPhone 不应该丢失这些信号,尤其是没有足够长的时间将其视为退出。
我试图通过使用来解决这个问题
[self.locationManager requestStateForRegion:region];
但是,在这些情况下,这将返回状态 2,即 CLRegionStateOutside。
我应该如何解决这个问题?有没有人有过类似的经历。我应该能够在信标区域停留 1 分钟或 1 小时,并且只有在未检测到信标 30 秒时才能离开。
【问题讨论】:
【参考方案1】:需要检查的几件事:
验证这是否发生在多个 ios 设备上。 iOS 设备可能存在硬件问题,例如蓝牙 LE 接收较弱,或接收到更多无线电噪音。我自己从未见过这个,但我听说过其他人坚称他们在某些 iOS 设备上看到过。
检查 iOS 设备和 Android 设备接收到的信号级别,方法是使用定位等应用程序对信标进行测距,以获取 iOS 和 Android。两个设备上的信号电平应该相似。强信号的 RSSI 约为负值 -60 或更小。弱信号的 RSSI 约为 -100 或更多负值。如果您的信号较弱,则可能会导致间歇性检测丢失,因为无线电噪声有时会阻止数据包被正确接收。如果您可以配置信标以提高其发射器功率水平,请这样做。
在前台使用定位应用程序,调整信标的范围以检查信号水平并将其旋转到不同的角度。一些信标的天线方向图在一侧要弱得多。您可能会发现方向发出的信号要弱得多,而且弱信号也会导致信号丢失。
检查信标的规格或配置设置,了解信标的传输频率。配置为很少传输以节省电池的信标(例如每 5 秒一次)更有可能导致这种情况,因为它只需要连续丢失 6 个数据包(很少但可能)导致区域退出。
另一种可能性是,在您附近的蓝牙频率范围内周期性地存在异常数量的无线电噪声。这不太可能,但我以前见过。我住在一个拥有强大天线的美国海军设施对面的街道上,我在家里的数据包 CRC 错误率经常比在办公室里高得多。
【讨论】:
感谢您的详细解答! 6 个丢失的数据包是造成这种情况的原因。我通过让一部手机记录 RSSI 而另一部被监控来设置测试。 “错误退出”发生在我连续获得 6 个 -95 和更低(或 0)的 RSSI 时。具体来说,我得到了-96、0、-95、0、-96、0。这可以通过减少广告间隔来解决,还是有什么方法可以让这6个丢失的数据包更宽松? 这表明离开该区域的设备接收信号的强度不如测距设备。任何检测无论多么微弱都会保持区域内状态,因此由于我描述的原因之一,现有手机在 30 秒内肯定没有检测到任何东西。是的,增加广播速率和发射器功率都可能有所帮助,因为它提供了更多的数据包来检测并且信号更强。以上是关于didDetermineStateForRegion 和 didExitRegion 返回错误响应的主要内容,如果未能解决你的问题,请参考以下文章