iBeacon 每 1 分钟不断进出区域

Posted

技术标签:

【中文标题】iBeacon 每 1 分钟不断进出区域【英文标题】:iBeacon enter and exit region constantly every 1 minute 【发布时间】:2014-01-18 02:29:50 【问题描述】:

当 iBeacon(使用 Kontakt Beacon)以后台模式进入区域时,我设法获得了本地通知。同时,我使用特定且唯一的标识符监视 3 个信标区域(每个具有相同的 UUID,但具有唯一的主要和次要组合)。在锁屏模式下,我的应用程序可以在这些信标出现时发出通知,但我不知道为什么即使信标和我的应用程序都几乎彼此相邻,委托 DidExitRegion 仍然被调用,请查看我的日志。

2014-01-18 11:56:49.828 sunlandbeacon[1385:60b] 进入非活动模式

2014-01-18 11:56:49.848 sunlandbeacon[1385:60b] EnterBackgroundMode 带徽章 0

2014-01-18 11:57:28.629 sunlandbeacon[1385:60b] 退出信标范围

2014-01-18 11:57:29.305 sunlandbeacon[1385:60b] 本地通知 发生在徽章 1 上

2014-01-18 11:57:29.307 sunlandbeacon[1385:60b] 输入区域 1 标志值 1

2014-01-18 11:58:15.173 sunlandbeacon[1385:60b] 退出信标范围

2014-01-18 11:58:15.176 sunlandbeacon[1385:60b] 退出信标范围

2014-01-18 11:58:15.178 sunlandbeacon[1385:60b] 退出信标范围

2014-01-18 11:58:15.880 sunlandbeacon[1385:60b] 本地通知 发生在徽章 2 上

2014-01-18 11:58:15.886 sunlandbeacon[1385:60b] 输入区域 1 标志值 1

2014-01-18 11:58:16.175 sunlandbeacon[1385:60b] 本地通知 发生在徽章 3 上

2014-01-18 11:58:16.184 sunlandbeacon[1385:60b] 输入区域 2 标志值 2

2014-01-18 11:59:02.784 sunlandbeacon[1385:60b] 退出信标范围

2014-01-18 11:59:02.787 sunlandbeacon[1385:60b] 退出信标范围

2014-01-18 11:59:02.790 sunlandbeacon[1385:60b] 退出信标范围

2014-01-18 11:59:03.491 sunlandbeacon[1385:60b] 本地通知 发生在徽章 4 上

2014-01-18 11:59:03.493 sunlandbeacon[1385:60b] 输入区域 1 标志值 1

2014-01-18 11:59:03.792 sunlandbeacon[1385:60b] 本地通知 发生在徽章 5 上

2014-01-18 11:59:03.796 sunlandbeacon[1385:60b] 输入区域 2 标志值 2

【问题讨论】:

【参考方案1】:

CoreLocation 定期出现“故障”并向您发送通知说您已退出该区域并在一秒钟后说您进入同一区域的情况并不少见。

如果没有看到您的代码,很难确定这就是发生的事情,但如果是这样,您可以通过在退出和输入事件上添加软件过滤器来轻松解决此问题。如果在前几秒钟内同一区域发生了进入事件,您基本上会忽略退出事件。同样,如果同一区域的退出事件在前几秒内发生,则忽略进入事件。

为了做到这一点,您需要保留两张表,一张包含按区域键入的最新进入事件,另一张包含按区域键入的最新退出事件。

下面是放置在 didEnterRegion 回调方法顶部的代码示例,该方法使用名为 _enteredTimes 的类级 NSMutableDictionary 作为查找表来完成此操作:

NSDate *now = [[NSDate alloc] init];
CLBeaconRegion *beaconRegion = (CLBeaconRegion *) region;
NSString *regionKey = [NSString stringWithFormat: @"%@_%@_%@", beaconRegion.proximityUUID, beaconRegion.major, beaconRegion.minor];
NSDate *lastEntered = [_enteredTimes valueForKey:regionKey];
[_enteredTimes setValue: now forKey: regionKey]; 
if (lastEntered != Nil && [now timeIntervalSinceDate:lastEntered] < 10)  // last 10 secs
    // ignore this event
    return;

您必须将等效代码放入您的 didExitRegion 回调中。

【讨论】:

感谢您的快速回答并节省了我的时间。这正是我所需要的。【参考方案2】:

众所周知,CoreLocation 在监控区域和测距信标时都相当不稳定,并且会收到通知。我们必须在示例应用程序中实现与范围通知类似的过滤器,源代码位于https://github.com/BlueSenseNetworks/ios

基本上,该应用会保存一个包含最近 10 次目击事件的循环缓冲区,并根据大多数目击事件的类型决定要显示的内容。

【讨论】:

谢谢,我没有足够的声望给你投票。我想知道为什么 Apple 文档根本没有提到这个故障 这并不是真正的故障,CoreLocation 似乎只提供了 iBeacon 测距/监控的裸机实现,并且受到 RSSI 指标不稳定的影响。请记住,BLE RSSI 从来都不是为了提供可靠的距离测量,甚至蓝牙规范也警告不要将其用于此类:)

以上是关于iBeacon 每 1 分钟不断进出区域的主要内容,如果未能解决你的问题,请参考以下文章

您如何检测 iBeacon 发射器何时关闭?安卓

在信标区域内每 10 分钟更新一次应用程序

如何检查用户的设备是不是支持和授权 iBeacon 使用以及是不是开启了蓝牙?

Android IBeacon

Android 开发中 iBeacon的使用

Android 开发中 iBeacon的使用