我试图访问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);
}
}
答案 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在后台运行是可能的,但它可能会被苹果拒绝)