CLLocationManager requestStateForRegion с кодом ошибки доступа к данным "Когда используется" 4
Я пытаюсь реализовать ранжирование iBeacon для приложения iOS.
[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: "Операция не может быть завершена".
Перестановка requestStateForRegion
с startRangingBeaconsInRegion
кажется, чтобы обойти эту ошибку и locationManager:didRangeBeacons:inRegion:
успешно называется.
Это известная проблема, которая [locationManager requestStateForRegion:region];
вызовет код ошибки 4, если только kCLAuthorizationStatusAuthorizedWhenInUse
предоставляется?
2 ответа
Документация Apple по Region Monitoring беспокоила меня из-за этой выдержки:
Если статус авторизации kCLAuthorizationStatusAuthorized, ваше приложение может получать уведомления о пересечении границы для любых регионов, которые оно зарегистрировало. Если для статуса авторизации установлено любое другое значение, приложение не будет получать эти уведомления.
Я думал что kCLAuthorizationStatusAuthorized
(не рекомендуется в iOS 8) будет включать kCLAuthorizationStatusAuthorizedAlways
а также kCLAuthorizationStatusAuthorizedWhenInUse
так как они оба были особыми типами "Авторизованы".
Благодаря @heypiotr я решил взглянуть на декларацию Apple Docs и заметил, что enum объявляет следующее:
kCLAuthorizationStatusAuthorized,
kCLAuthorizationStatusAuthorizedAlways = kCLAuthorizationStatusAuthorized,
kCLAuthorizationStatusAuthorizedWhenInUse
Так, requestStateForRegion
требует kCLAuthorizationStatusAuthorizedAlways
потому что это единственное значение, которое совпадает с kCLAuthorizationStatusAuthorized
и, по словам Apple, только kCLAuthorizationStatusAuthorized
будет работать с мониторингом.
Мониторинг основного местоположения требует "всегда" авторизации, даже если вы пытаетесь выполнять мониторинг только тогда, когда приложение активно. поскольку requestStateForRegion
является частью API мониторинга, он объясняет, почему он вызывает ошибку мониторинга при авторизации "при использовании".
Единственный обходной путь, о котором я могу подумать, это когда при авторизации "когда используется" начинайте ранжирование сразу и используйте результаты ранжирования вместо requestStateForRegion
определить, находитесь ли вы внутри или за пределами диапазона данного маяка.