微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

objective-c – iBeacon每1分钟不断进入和退出一个区域

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

2014-01-18 11:56:49.828 sunlandbeacon[1385:60b] Enter Inactive mode

2014-01-18 11:56:49.848 sunlandbeacon[1385:60b] EnterBackgroundMode
with Badge 0

2014-01-18 11:57:28.629 sunlandbeacon[1385:60b] Exit a beacon range

2014-01-18 11:57:29.305 sunlandbeacon[1385:60b] Local Notification
Happens with Badge 1

2014-01-18 11:57:29.307 sunlandbeacon[1385:60b] Enter Region 1 with
flagvalue 1

2014-01-18 11:58:15.173 sunlandbeacon[1385:60b] Exit a beacon range

2014-01-18 11:58:15.176 sunlandbeacon[1385:60b] Exit a beacon range

2014-01-18 11:58:15.178 sunlandbeacon[1385:60b] Exit a beacon range

2014-01-18 11:58:15.880 sunlandbeacon[1385:60b] Local Notification
Happens with Badge 2

2014-01-18 11:58:15.886 sunlandbeacon[1385:60b] Enter Region 1 with
flagvalue 1

2014-01-18 11:58:16.175 sunlandbeacon[1385:60b] Local Notification
Happens with Badge 3

2014-01-18 11:58:16.184 sunlandbeacon[1385:60b] Enter Region 2 with
flagvalue 2

2014-01-18 11:59:02.784 sunlandbeacon[1385:60b] Exit a beacon range

2014-01-18 11:59:02.787 sunlandbeacon[1385:60b] Exit a beacon range

2014-01-18 11:59:02.790 sunlandbeacon[1385:60b] Exit a beacon range

2014-01-18 11:59:03.491 sunlandbeacon[1385:60b] Local Notification
Happens with Badge 4

2014-01-18 11:59:03.493 sunlandbeacon[1385:60b] Enter Region 1 with
flagvalue 1

2014-01-18 11:59:03.792 sunlandbeacon[1385:60b] Local Notification
Happens with Badge 5

2014-01-18 11:59:03.796 sunlandbeacon[1385:60b] Enter Region 2 with
flagvalue 2

解决方法

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回调中输入等效代码.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐