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 определить, находитесь ли вы внутри или за пределами диапазона данного маяка.

Другие вопросы по тегам