如何检测哪个iBeacon超出范围?

时间:2017-02-28 06:20:28

标签: ios xcode cllocationmanager ibeacon

我正在使用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];
}

3 个答案:

答案 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>
  • 使用测距API。您可以调用[location?Manager startRangingBeacon sInRegion: region],然后每秒钟收到一次回调,并在该时间间隔内检测到所有信标,并填充所有标识符。我通常将这些存储在由信标标识符键入的NSDictionary中,并在最后一次检测到信标时保持NSDate。然后我会定期查找过去15秒内未见过的任何信标,我知道这些已经退出。

第二种方法的缺点是,只有当应用程序位于前台时才会显示范围,并且只有在移动到后台后几秒钟才能显示范围。