我正在使用CLLocationManager在我的iOS应用中检测iBeacons。
我需要使用以下方法来检测我的设备是否已离开信标区域。
-(void)locationManager:(CLLocationManager*)manager didExitRegion:(CLRegion *)region
如何检测我的设备在我使用的三个iBeacons中超出范围的iBeacon区域?
我尝试了下面的代码,但我没有获得Major和Minor的值。
- (void)locationManager:(CLLocationManager*)manager didEnterRegion: (CLRegion *)region
{
CLBeaconRegion *beaconRegion = (CLBeaconRegion*) region;
NSLog(@"%@",beaconRegion.major);
NSLog(@"%@",beaconRegion.minor);
NSLog(@"%@",beaconRegion.proximityUUID);
NSString *str = [NSString stringWithFormat:@"Major:%@ Minor:%@",beaconRegion.major,beaconRegion.minor];
UILocalNotification *notification = [UILocalNotification new];
notification.alertBody = str;
[[UIApplication sharedApplication] presentLocalNotificationNow:notification];
}
答案 0 :(得分:0)
您可以检查RSSI的值,该值给出当前连接的信标的信号强度值。信号强度一直持续下降,如果在范围内有另一个信标,则设备可能连接到其他信标。
总之,您可以使用RSSI值检查信号强度。
答案 1 :(得分:0)
试试此代码
- (void)locationManager:(CLLocationManager *)manager
didRangeBeacons:(NSArray *)beacons
inRegion:(CLBeaconRegion *)region {
if (beacons.count) {
CLBeacon * beacon = beacons[2]; // If you want to detect the range of third beacon
switch (beacon.proximity) {
case CLProximityUnknown:
NSLog(@"Unknown");
break;
case CLProximityFar:
NSLog(@"Far");
break;
case CLProximityNear:
NSLog(@"Near");
break;
case CLProximityImmediate:
NSLog(@"Immediate");
default:
NSLog(@"No beacons found");
break;
}
}
}
如果它来自CLProximityUnknown,你会知道信标超出范围
答案 2 :(得分:0)
使用CoreLovation监控API无法判断受监控CLBeaconRegion
中的各个信标何时超出范围。当所有信标退出该区域时,您只能回复didExit
。您无法读取各个信标的主要和次要字段 - 您只能访问用于设置监控的区域对象,在您的情况下这些可能是零。
围绕这个的两种常见方式:
CLBeaconRegion
,每个只匹配一个信标。(填充主要和次要。)主要限制是您一次只能监控20个区域。 / LI>
[location?Manager startRangingBeacon sInRegion: region]
,然后每秒钟收到一次回调,并在该时间间隔内检测到所有信标,并填充所有标识符。我通常将这些存储在由信标标识符键入的NSDictionary
中,并在最后一次检测到信标时保持NSDate
。然后我会定期查找过去15秒内未见过的任何信标,我知道这些已经退出。第二种方法的缺点是,只有当应用程序位于前台时才会显示范围,并且只有在移动到后台后几秒钟才能显示范围。