[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?
解决方法
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将用于监视.