iBeacon:CLBeaconRegion 标识符的设置?

Posted

技术标签:

【中文标题】iBeacon:CLBeaconRegion 标识符的设置?【英文标题】:iBeacon: Settings of CLBeaconRegion identifier? 【发布时间】: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 需要指定标识符)?

参考:Region Monitoring and iBeacon

【问题讨论】:

尝试添加[_locationManager startRangingBeaconsInRegion:beaconRegion]; [_locationManager requestStateForRegion:beaconRegion];并确保错误地添加了 NSLocationWhenInUseUsageDescription。你的代码看起来不错 【参考方案1】:

几个建议:

    尝试使用 AppStore 中现成的 iOS 检测器,例如 Locate,以消除硬件问题。

    如果上述方法有效,请尝试卸载并重新安装您的应用。如果在应用程序运行后添加授权代码,我已经看到位置权限被搞砸了。

此外,发布您的 Info.plist 可能会有所帮助,以防出现问题。

【讨论】:

重启设备解决了权限问题。不知道为什么。

以上是关于iBeacon:CLBeaconRegion 标识符的设置?的主要内容,如果未能解决你的问题,请参考以下文章

连接到 iBeacon

如何使用 CoreLocation 获取多个 iBeacon?

iBeacons 在 iOS 中以后台模式扫描?

是否可以在 iBeacon 应用程序上动态设置 UUID?

如何在 ibeacon 中使用唯一标识符?

iOS ibeacon 标识符 initWithProximityUUID:(NSUUID *)proximityUUID identifier:(NSString *)identifier?