iBeacon在didEnterRegion中的主要和次要值

时间:2014-09-18 08:31:37

标签: ios objective-c cllocationmanager ibeacon cllocation

我试图访问didEnterRegion委托中最近的信标的主要值和次要值。但是,将值打印到控制台时,它们将返回null

- (void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region {

    if ([region isKindOfClass:[CLBeaconRegion class]]) {

        CLBeaconRegion *beaconRegion = (CLBeaconRegion *)region;

        int major = [beaconRegion.major intValue];
        int minor = [beaconRegion.minor intValue];

        NSLog(@" Major %@ Minor %@", beaconRegion.major, beaconRegion.minor);

        }
}

5 个答案:

答案 0 :(得分:5)

您实施的区域监控回调不会告诉您检测到的信标的个别标识符。如果您想获取检测到的各个信标的标识符,则必须使用信标测距API,如@Larme在评论中所述。测距的回调包括第二个参数,它是所有信标的数组。

答案 1 :(得分:2)

您必须区分监控范围 iBeacons。只有成功测试iBeacons才能为您提供主要/次要ID。

答案 2 :(得分:0)

看起来您没有使用次要值和主要值初始化BeaconRegion

初始化您需要使用的信标区域 initWithProximityUUID:major:minor:identifier:

而不是

initWithProximityUUID:identifier:

如果您不想将次要值和主要值初始化为区域,那么您可能需要调用注释中提到的didRangeBeacons方法。

答案 3 :(得分:0)

您正试图获取地区的主要和次要价值观。但是你说想要获得灯塔的价值。

这取决于您使用的是哪个信标品牌,但必须有一个方法可以返回设备找到的信标数组。通常,数组的第一个对象是最接近的对象。 在那种方法中,你可以获得信标的价值。

示例代码:

- (void)beaconManager:(ESTBeaconManager *)manager didRangeBeacons:(NSArray *)beacons inRegion:(ESTBeaconRegion *)region
{
    if([beacons count] > 0)
    {
        // beacon array is sorted based on distance
        // closest beacon is the first one
        ESTBeacon* closestBeacon = [beacons objectAtIndex:0];

        NSString* theMajor = [NSString stringWithFormat:@"%@",closestBeacon.major];
    }

}

答案 4 :(得分:0)

设置locationManager(记得为iOS 8配置plist以添加这两个值NSLocationAlwaysUsageDescription,NSLocationWhenInUseUsageDescription)。

@property (strong, nonatomic) CLLocationManager *locationManager;
self.locationManager = [[CLLocationManager alloc] init];
self.locationManager.delegate = self;

[[UIApplication sharedApplication] cancelAllLocalNotifications];

// Needed for iOS 8
if([self.locationManager respondsToSelector:@selector(requestAlwaysAuthorization)]) {
    [self.locationManager requestAlwaysAuthorization];
}

然后调用startRangingItem:

- (void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region{
    if ([region isKindOfClass:[CLBeaconRegion class]]) {

        [self startRangingItem];
    }
}


- (void)startRangingItem {
    CLBeaconRegion *beaconRegion = [self beaconRegionWithItem];
    [self.locationManager startRangingBeaconsInRegion:beaconRegion];
}

- (CLBeaconRegion *)beaconRegionWithItem{

    NSUUID *iPadTransmitterUUID = [[NSUUID alloc] initWithUUIDString:@"AAAAAAAA-BBBB-CCCC-DDDD-EEEEEEFFFFF1"];

    CLBeaconRegion *beaconRegion = [[CLBeaconRegion alloc] initWithProximityUUID:iPadTransmitterUUID identifier:@"Transmitter1"];

    return beaconRegion;
}

然后在didRangeBeacons:***

- (void)locationManager:(CLLocationManager *)manager didRangeBeacons:(NSArray *)beacons inRegion:(CLBeaconRegion *)region{

    CLBeacon *testBeacon = [beacons objectAtIndex:0];

    NSLog(@"Inside didRangeBeacons Major %@ Minor %@", testBeacon.major, testBeacon.minor);

}
  

***请注意,一旦用户进入该区域,此didRangeBeacons方法将仅在后台运行5秒钟。它将在5秒后停止测距。如果要继续测距,用户需要启动应用程序。 (强制didRangeBeacons在后台运行是可能的,但它可能会被苹果拒绝)