【发布时间】:2015-07-11 02:57:10
【问题描述】:
我花了几个月的时间开发基于 iBeacons 的应用程序,我真的很沮丧。
一般的想法是,当检测到信标时,会通知用户特定于该 iBeacon 的信息。
应用程序设计如下,所有 iBeacons 具有相同的 UUID,Major 确定建筑物(博物馆、商店……),Minor 确定特定产品(图片、鞋子……)。所以这个应用程序可能服务于多个客户端。
当应用程序启动时,我开始使用我们的 UUID 对区域进行监视和测距。当应用程序处于前台时,一切正常。但是在后台或挂起状态下,问题就开始了。在后台或挂起状态下不允许测距。
我知道当您进入或退出信标区域时,该应用程序将在后台启动大约 5 秒钟。您可以在这 5 秒内在后台进行测距,之后 iOS 将再次暂停您的应用。
我设法利用这里学到的技术在后台将测距延长了 3 分钟。我还通过 notifyEntryStateOnDisplay = YES; 得到一个额外的回调;
但这还不够,如果客户端进入一个应用程序处于后台或挂起状态的区域,他会收到通知。并且在额外的 3 分钟内,如果测距检测到另一个 iBeacon,他会收到通知,但是当 3 分钟后台任务到期时,如果没有触发区域退出,他将不会再收到任何通知。
在这样的场景中没有真正的解决方案吗?我认为这是一种非常常见的情况,我很惊讶没有办法处理它。
已编辑:我试图按照 David Young 在回复中的建议通过监控两个区域来找到问题的解决方案。为了获得更多的进入/退出区域的事件。
我添加了我实现的代码来尝试监控两个区域。
但是我做错了一些事情,并且 didRangeBeacons:InRegion: 回调每 10 毫秒触发一次,而预期是每秒一次。
在AppDelegate.m 上,我在didFinishLaunchingWithOptions: 内部执行以下操作
[self.locationManager startMonitoringForRegion:self.beaconRegion];
[self.locationManager stopRangingBeaconsInRegion:self.beaconRegion];
[self.locationManager startRangingBeaconsInRegion:self.beaconRegion];
[self.locationManager startMonitoringForRegion:self.beaconRegion2];
[self.locationManager stopRangingBeaconsInRegion:self.beaconRegion2];
[self.locationManager startRangingBeaconsInRegion:self.beaconRegion2];
然后,在didRangeBeacons:InRegion:
- (void) locationManager:(CLLocationManager *)manager didRangeBeacons:(NSArray *)beacons inRegion:(CLBeaconRegion *)region{
if(beacons.count > 0){
[self.locationManager stopRangingBeaconsInRegion:region];
for (CLBeacon *beacon in beacons){
NSLog(@"beacon detected major: %@ minor: %@", beacon.major,beacon.minor);
}
[self.locationManager startRangingBeaconsInRegion:region];
}
}
当我在模拟器上运行应用程序时,范围内的每个网络都有一个信标,该消息大约每 10 毫秒显示在控制台上。
我怀疑停止和重新开始测距打破了预期的回调流程,但是当只有一个区域在范围内时,回调按预期每秒发生。
【问题讨论】:
标签: ios core-location ibeacon