当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区 flagvalue 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区 flagvalue 1
2014-01-18 11:58:16.175 sunlandbeacon [1385:60b]本地通知 发生在徽章3
2014-01-18 11:58:16.184 sunlandbeacon [1385:60b]输入地区2 flagvalue 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区 flagvalue 1
2014-01-18 11:59:03.792 sunlandbeacon [1385:60b]本地通知 发生在徽章5
2014-01-18 11:59:03.796 sunlandbeacon [1385:60b]输入地区2 flagvalue 2
答案 0 :(得分:10)
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回调中添加等效代码。
答案 1 :(得分:2)
已知CoreLocation在监视区域和测距信标时都会发出相当不稳定的通知。我们必须在示例应用中对范围通知实施类似的过滤器,源代码位于https://github.com/BlueSenseNetworks/iOS
基本上,应用程序会保留一个带有最新10个目击的循环缓冲区,并根据大多数目击的类型决定显示什么。