iBeacon每1分钟不断进入和退出区域。

3

我已经成功实现了使用Kontakt Beacon的iBeacon进入区域时的本地通知。同时,我监视3个具有特定和独特标识符的信标区域(每个区域具有相同的UUID但唯一的Major和Minor组合)。在锁屏模式下,我的应用程序可以在这些信标存在时发出通知,但是我不知道为什么即使信标和我的应用程序都静止几乎紧挨着彼此,委托DidExitRegion仍然被调用,请查看我的日志。

2014年01月18日11时56分49.828秒sunlandbeacon[1385:60b]进入非活动模式。 2014年01月18日11时56分49.848秒sunlandbeacon[1385:60b]进入后台模式,标记为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。
2个回答

11

在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回调中放置等效的代码。


谢谢您的快速回答,救了我的一天。这正是我所需要的。 - Thuc-Tram Ngo

3

CoreLocation被认为在监控区域和扫描信标时的通知非常不稳定。我们不得不在示例应用程序中实现类似于扫描通知的过滤器,源代码位于https://github.com/BlueSenseNetworks/iOS

基本上,该应用程序保留了最新10个发现的循环缓冲区,并根据大多数发现的类型做出显示决策。


谢谢,我没有足够的声望来投票支持你。我想知道为什么苹果的文档根本没有提到这个故障。 - Thuc-Tram Ngo
2
这并不是真正的故障,CoreLocation似乎只提供了iBeacon范围/监控的裸金属实现,并且它受到RSSI指示器不稳定的影响。请记住,BLE RSSI从未旨在提供可靠的距离测量,即使蓝牙规范也警告不要将其用于此类用途 :) - Vladimir Petrov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接