我正在使用IBeacon构建一个简单的ios应用程序,我使用startMonitoringForRegion来检测信标。这是AppDelegte.m代码:
NSUUID *beaconUUID = [[NSUUID alloc] initWithUUIDString:@"0040C159-12F6-4FC3-9189-87C069FFE5CF"];
NSString *regionIdentifier = @"iBeacons region 1";
self.beaconRegion = [[CLBeaconRegion alloc] initWithProximityUUID: beaconUUID identifier: regionIdentifier ];
self.beaconRegion.notifyEntryStateOnDisplay = YES;
self.locationManager = [[CLLocationManager alloc]init];
self.locationManager.delegate = self;
self.locationManager.pausesLocationUpdatesAutomatically = NO;
[self.locationManager startMonitoringForRegion:self.beaconRegion];
[self.locationManager startRangingBeaconsInRegion:beaconRegion];
然后在didDetermineState回调:
- (void)locationManager:(CLLocationManager *)manager didDetermineState:(CLRegionState)state forRegion:(CLRegion *)region{
if (state == CLRegionStateInside) {
//Start Ranging
[manager startRangingBeaconsInRegion:(CLBeaconRegion*) region];
NSLog(@"didDetermineState -->enter region");
}
else{
//Stop Ranging
[manager stopRangingBeaconsInRegion:(CLBeaconRegion*) region];
NSLog(@"didDetermineState -->exit region");
}
}
当iBeacons相互远离时,这在前景,背景或应用关闭时工作正常。但是当iBeacons相互靠近时,我发现了一些问题。
在进行了多次测试之后,我得出结论,RangingBeaconsInRegion不会在后台工作或关闭app,只有监控工作。
当您进入或退出信标区域时,应用程序将在后台启动约5秒,并且它将获得对didDetermineState:forRegion:方法的回调。你可以在这五秒钟内完成后续操作,之后iOS会再次暂停你的应用程序。
当iBeacons彼此远离时,这是完美的。当iBeacons太靠近并且回调didDetermineState时,问题就出现了:在你进入下一个iBeacon区域之前没有要求退出iBeacon区域。
有没有办法强制手动退出区域?或者其他一些方法来解决这个问题?
谢谢!
答案 0 :(得分:4)
这是一个真正的问题。当信标有重叠传输而你的区域包含所有这些信息时,你就不会获得进入/退出事件,因为一个消失而另一个消失。
有很多方法可以解决这个问题,但没有一种方法可以解决这个问题。你可以:
您可以在此处阅读第一项技术的更详细讨论:http://developer.radiusnetworks.com/2014/11/13/extending-background-ranging-on-ios.html