【发布时间】:2015-01-12 07:55:06
【问题描述】:
我使用 Apple AirLocate 演示 App 来创建 iBeacon。
- 标识符:com.example.apple-samplecode.AirLocate
- UUID:E2C56DB5-DFFB-48D2-B060-D0F5A71096E0
- 专业:0
- 轻微:0
- 实测功率:-59
Android 信标检测器应用成功接收到信号。
但是,当我在 iOS 8 中使用以下代码检测 iBeacon 时,信标不显示:
self.coreLocation = [[CLLocationManager alloc] init];
_coreLocation.delegate = self;
NSString *identifier = [NSString stringWithFormat:@"com.example.apple-samplecode.AirLocate.%@", @"E2C56DB5-DFFB-48D2-B060-D0F5A71096E0"];
CLBeaconRegion *region = [[CLBeaconRegion alloc] initWithProximityUUID:uuid identifier:identifier];
if(region) {
region.notifyOnEntry = YES;
region.notifyOnExit = YES;
[_coreLocation startMonitoringForRegion:region];
}
无论我在标识符字段中使用哪个值,CLLocationManager 都找不到信标。它的代表didDetermineState: 和didRangeBeacons: 从未被调用过。然而,代表monitoringDidFailForRegion 收到了这个:
操作无法完成。 (kCLErrorDomain 错误 4。)
网上查了一些资料,错误码4的意思是:
用户拒绝访问区域监控服务。
但是我使用下面的代码来证明我的应用被授权监控区域:
- (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status {
if(status == kCLAuthorizationStatusDenied) {
NSLog(@"didChangeAuthorizationStatus: Denied");
} else if(status == kCLAuthorizationStatusNotDetermined) {
NSLog(@"didChangeAuthorizationStatus: Not Determined");
} else if(status == kCLAuthorizationStatusAuthorizedAlways) {
NSLog(@"didChangeAuthorizationStatus: Authorized Always");
} else if(status == kCLAuthorizationStatusAuthorizedWhenInUse) {
NSLog(@"didChangeAuthorizationStatus: Authorized When In Use");
} else if(status == kCLAuthorizationStatusRestricted) {
NSLog(@"didChangeAuthorizationStatus: Restricted");
} else {
NSLog(@"didChangeAuthorizationStatus: Unknown");
}
}
它返回:
didChangeAuthorizationStatus:使用时已授权
鉴于:
- 我正在使用装有 iOS 8.1.2 的 iPhone 5s
- 我在
Info.plist中添加了NSLocationWhenInUseUsageDescription - 在功能页面中,我启用了“位置更新”和“使用蓝牙 LE 配件”(Xcode 将相应条目添加到
Info.plist) - 通过
[self.coreLocation requestWhenInUseAuthorization]请求“使用时”授权 - 首次启动应用时允许“定位服务”和“推送通知”
- 飞行模式已关闭
- 蓝牙已开启
- Wi-Fi 已开启,已连接到互联网
- 设置 > 常规 > 后台应用刷新已开启
- 设置 > 隐私 > 位置服务 > 我的应用 > 使用时(打勾)
-
[CLLocationManager isMonitoringAvailableForClass:[CLRegion class]]返回是
我错过了什么导致此错误 4 ?还有,标识符是否必须与 iBeacon 的 Bundle Identifier 匹配(为什么 Android 可以检测所有的 Beacon,而 iOS 需要指定标识符)?
【问题讨论】:
-
尝试添加[_locationManager startRangingBeaconsInRegion:beaconRegion]; [_locationManager requestStateForRegion:beaconRegion];并确保错误地添加了 NSLocationWhenInUseUsageDescription。你的代码看起来不错
标签: objective-c bluetooth ios8 core-location ibeacon