ios – CLLocationManager requestStateForRegion,“When In Use”位置访问错误代码4

前端之家收集整理的这篇文章主要介绍了ios – CLLocationManager requestStateForRegion,“When In Use”位置访问错误代码4前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试为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:.

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

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

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

解决方法

Region Monitoring的Apple文档困扰我这个摘录:

If the authorization status is kCLAuthorizationStatusAuthorized,your app can receive boundary crossing notifications for any regions it registered. If the authorization status is set to any other value,the app doesn’t receive those notifications.

我认为kCLAuthorizationStatusAuthorized(在iOS 8中已弃用)将包括kCLAuthorizationStatusAuthorizedAlways和kCLAuthorizationStatusAuthorizedWhenInUse,因为它们都是特殊类型的“授权”.

感谢@heypiotr,我决定实际查看Apple Docs Declaration并注意到enum声明了以下内容

kCLAuthorizationStatusAuthorized,kCLAuthorizationStatusAuthorizedAlways = kCLAuthorizationStatusAuthorized,kCLAuthorizationStatusAuthorizedWhenInUse

因此,requestStateForRegion需要kCLAuthorizationStatusAuthorizedAlways,因为这是唯一与kCLAuthorizationStatusAuthorized相同的值,并且根据Apple,只有kCLAuthorizationStatusAuthorized将用于监视.

猜你在找的iOS相关文章