我花了几个月的时间开发了一个基于 iBeacons 的应用程序,但我非常沮丧。
总体思路是在检测到信标时,向用户提供与该 iBeacon 相关的信息。
该应用程序的设计如下:所有 iBeacons 具有相同的 UUID,Major 确定建筑物(博物馆、商店等),Minor 确定特定产品(图片、鞋子等)。因此,此应用程序可以为多个客户提供服务。
当应用程序启动时,我开始对具有我们的 UUID 的区域进行监控和范围测量。当应用程序处于前台时,一切都很完美。但在后台或挂起状态下,问题就开始了。在后台或挂起状态下不允许进行范围测量。
我知道当您进入或退出信标的区域时,应用程序将在后台运行约 5 秒钟。您可以在这五秒钟的时间内在后台进行范围测量,之后 iOS 将再次挂起您的应用程序。
我成功地使用此处学到的技术将范围测量延长到了 3 分钟。我还通过 notifyEntryStateOnDisplay = YES 获得了额外的回调;
但这还不够,如果客户在应用程序处于后台或挂起状态下进入区域,他将收到通知。在额外的 3 分钟内,如果范围测量检测到另一个 iBeacon,他将收到通知,但是当 3 分钟的后台任务过期时,如果没有触发区域退出,他将不会再次收到任何通知。
在这种情况下,难道没有真正的解决方案吗?我认为这是一个非常常见的场景,我很惊讶居然没有办法处理它。
编辑:我尝试通过监视两个区域来找到解决问题的方法,正如 David Young 在他的回答中建议的那样。以获取更多进入/退出区域的事件。
我添加了我实现的代码来尝试监视两个区域。
但是,我做错了什么,didRangeBeacons:InRegion: 回调每 10 毫秒触发一次,而预期的是每秒触发一次。
在 AppDelegate.m 中,我在 didFinishLaunchingWithOptions 中执行以下操作:
然后,在
当我在模拟器上运行应用并且每个网络都有信标在范围内时,消息会大约每10毫秒显示在控制台上。我怀疑停止和重新启动测距正在破坏预期的回调流程,但当只有一个区域在范围内时,回调按预期每秒发生一次。
总体思路是在检测到信标时,向用户提供与该 iBeacon 相关的信息。
该应用程序的设计如下:所有 iBeacons 具有相同的 UUID,Major 确定建筑物(博物馆、商店等),Minor 确定特定产品(图片、鞋子等)。因此,此应用程序可以为多个客户提供服务。
当应用程序启动时,我开始对具有我们的 UUID 的区域进行监控和范围测量。当应用程序处于前台时,一切都很完美。但在后台或挂起状态下,问题就开始了。在后台或挂起状态下不允许进行范围测量。
我知道当您进入或退出信标的区域时,应用程序将在后台运行约 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毫秒显示在控制台上。我怀疑停止和重新启动测距正在破坏预期的回调流程,但当只有一个区域在范围内时,回调按预期每秒发生一次。