我正在尝试为 iOS 应用程序实现 iBeacon 范围。

[locationManager requestAlwaysAuthorization];
CLBeaconRegion * region = [self regionFromUUID:uuid];
[locationManager startMonitoringForRegion:region];

为了确定设备是在区域内还是区域外:
- (void)locationManager:(CLLocationManager *)manager didStartMonitoringForRegion:(CLRegion *)region
{
    [locationManager requestStateForRegion:region];
}

这成功调用:
- (void)locationManager:(CLLocationManager *)manager didDetermineState:(CLRegionState)state forRegion:(CLRegion *)region {
    if (state == CLRegionStateInside) {
        [locationManager startRangingBeaconsInRegion:(CLBeaconRegion*)region];
    } else {
        [locationManager stopRangingBeaconsInRegion:(CLBeaconRegion*)region];
    }
}

并且该应用程序已成功使用 locationManager:didRangeBeacons:inRegion:

我遇到的问题是使用 requestWhenInUseAuthorizationlocationManager:didStartMonitoringForRegion: 调用 [location requestStateForRegion:region] 后,委托(delegate)方法 locationManager:monitoringDidFailForRegion:withError: 返回错误代码 4:“操作无法完成”。

requestStateForRegion 交换 startRangingBeaconsInRegion 似乎绕过了这个错误并且成功调用了 locationManager:didRangeBeacons:inRegion:

如果仅授予 [locationManager requestStateForRegion:region];,那么这是 kCLAuthorizationStatusAuthorizedWhenInUse 会导致错误代码 4 的已知问题吗?

最佳答案

Region Monitoring 的 Apple 文档因为这段摘录而困扰着我:



我在想 kCLAuthorizationStatusAuthorized(在 iOS 8 中已弃用)将包含 kCLAuthorizationStatusAuthorizedAlwayskCLAuthorizationStatusAuthorizedWhenInUse,因为它们都是“授权”的特殊类型。

感谢@heypiotr,我决定实际查看 Apple Docs Declaration 并注意到枚举声明如下:

kCLAuthorizationStatusAuthorized,
kCLAuthorizationStatusAuthorizedAlways = kCLAuthorizationStatusAuthorized,
kCLAuthorizationStatusAuthorizedWhenInUse

因此, requestStateForRegion 需要 kCLAuthorizationStatusAuthorizedAlways 因为这是唯一与 kCLAuthorizationStatusAuthorized 相同的值,并且根据 Apple 的说法,只有 kCLAuthorizationStatusAuthorized 可以用于监控。

关于ios - 带有 "When In Use"位置访问错误代码 4 的 CLLocationManager requestStateForRegion,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36072792/

10-13 07:21