2014-01-18 54 views
3

当iBeacon(使用Kontakt Beacon)以背景模式进入区域时,我设法得到本地通知。同时我监视3个具有特定&唯一标识符(每个具有相同的UUID但唯一的主要和次要组合)的信标区域。在锁屏模式下,我的应用程序可以通知这些信标出现的时间,但我不知道为什么即使信标和我的应用程序仍然几乎彼此相邻,代表DidExitRegion仍然被调用,请查看我的日志。iBeacon每隔1分钟不断地进入和退出区域

2014年1月18日11:56:49.828 sunlandbeacon [1385:60B]输入无效模式

2014年1月18日11:56:49.848 sunlandbeacon [1385:60B] EnterBackgroundMode 与徽章0

2014年1月18日11:57:28.629 sunlandbeacon [1385:60B]退出信标范围

2014年1月18日11:57:29.305 sunlandbeacon [1385:60B]本地通知 与徽章会发生1

2014年1月18日11:57:29.307 sunlandbeacon [1385:60B]:58:15.173 sunlandbeacon与 flagvalue 1

2014年1月18日11输入区域1 [1385:60B]退出信标范围

2014年1月18日11:58:15.176 sunlandbeacon [1385:60B]退出信标范围

2014年1月18日11:58:15.178 sunlandbeacon [1385:60B]退出信标范围

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

11 2014年1月18日:58:15.886 sunlandbeacon [1385:60B]:58:16.175 sunlandbeacon与 flagvalue 1

2014年1月18日11输入区域1 [1385:60B]本地通知 会发生与徽章3

2014年1月18日11:58:16.184 sunlandbeacon [1385:60B]:59:02.784 sunlandbeacon与 flagvalue 2

2014年1月18日11输入区域2 [1385:60B]退出信标范围

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

2014年1月18日11:59:02.790 sunlandbeacon [1385:60B]退出信标范围

2014年1月18日11:59:03.491 sunlandbeacon [1385:60B]本地通知 与徽章4偏偏

2014年1月18日11:59:03.493 sunlandbeacon [1385:60B]与 flagvalue 1

2014年1月18日11输入区域1: 59:03.792 sunlandbeacon [1385:60b]本地通知 带徽章5

2014-01-18 11:59:03。796 sunlandbeacon [1385:60B]与 flagvalue 2

回答

10

的情况并不少见,请输入区域2 CoreLocation定期有“毛刺”,然后给你一个通知说你退出的范围,然后一秒钟后说你进入同一地区。

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

为了做到这一点,您需要保留两个表格,一个表格包含按地区键入的最新条目事件,另一个表格包含按地区键入的最新退出事件。

这里是代码的例子把在didEnterRegion回调方法,它使用一类级别的NSMutableDictionary称为_enteredTimes作为查找表来完成这个顶部:

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回调。

+0

谢谢你的快速回答并节省我的一天。这正是我需要的。 –

2

已知CoreLocation在监视区域和测距信标时通知相当不稳定。我们必须在我们的示例应用程序中实现类似的范围通知过滤器,源代码为https://github.com/BlueSenseNetworks/iOS

基本上,应用程序会保留一个循环缓冲区,并显示最新的10次事件,并根据类型大部分目击。

+0

谢谢,我没有足够的声望投票给你。我想知道为什么苹果文档根本没有提到这个故障 –

+1

这不是真的一个小问题,CoreLocation似乎只提供了一个裸机实现的iBeacon测距/监测,并且它遭受RSSI指标的不稳定。 BLE RSSI无意提供可靠的距离测量,即使蓝牙规格警告也不要将其用于此类:) –