Если вы используете рамки CoreLocation в приложении в Xcode7 (предварительно отпущена), и вы можете заметить, что недавно добавлено свойство называется allowsBackgroundLocationUpdates в классе CLLocationManager.
Это новое свойство объяснено на сессии WWDC "What's New in Core Location".
Значение по умолчанию: NO
, если вы ссылаетесь на iOS 9.
Если ваше приложение использует местоположение в фоновом режиме (без отображения синей строки состояния), вы должны установить allowsBackgroundLocationUpdates
в YES
в дополнение к настройке возможностей фонового режима в Info.plist. В противном случае обновления местоположения доставляются только на переднем плане. Преимущество заключается в том, что теперь у вас могут быть менеджеры местоположений с обновлениями фонового местоположения и другими менеджерами местоположения с обновлениями только для локального местоположения в том же приложении. Вы также можете сбросить значение до NO
, чтобы изменить поведение.
документация довольно четкое представление о нем:
По умолчанию это NO для приложений, связанных с прошивкой 9.0 или позже, независимо от минимального целевого развертывания.
С UIBackgroundModes набором включает «местоположение» в Info.plist, вы должны также установить это свойство YES во время выполнения, когда вызов -startUpdatingLocation с намерением продолжить в фоновом режиме.
Установка этого свойства в YES, когда UIBackgroundModes не включает "location" является фатальной ошибкой.
Сброс этого свойства к NO эквивалентен отсутствию «местоположения» из значения UIBackgroundModes. Доступ к местоположению по-прежнему равен , разрешенному всякий раз, когда приложение работает (то есть не приостановлено), и имеет достаточную авторизацию (то есть имеет авторизацию InInUse и используется или имеет всегда авторизацию). Тем не менее, приложение будет подчиняться обычным правилам приостановления действия.
См. -requestWhenInUseAuthorization and -requestAlwaysAuthorization for Подробнее о возможных значениях авторизации.
Набор Info.plist как:
Синтаксис Info.plist конфигурации выглядит следующим образом:
<key>NSLocationAlwaysUsageDescription</key>
<string>I want to get your location Information in background</string>
<key>UIBackgroundModes</key>
<array>
<string>location</string>
</array>
Или подтяните вкладку возможности вашего целевого приложения.
Используйте как:
_locationManager = [[CLLocationManager alloc] init];
_locationManager.delegate = self;
[_locationManager setDesiredAccuracy:kCLLocationAccuracyBest];
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8) {
[_locationManager requestAlwaysAuthorization];
}
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 9) {
_locationManager.allowsBackgroundLocationUpdates = YES;
}
[_locationManager startUpdatingLocation];
Я пишу демо Here (Demo2)
Я думаю, что это свойство делает путаницу более чем ясностью. У нас были (и у нас все еще есть) «всегда» и «когда используются» свойства, которые более чем ясны. Зачем добавлять такое запутанное свойство. И я не думаю, что использование более одного объекта CLLocationManager - лучшая практика. – androniennn
Является ли это свойство необходимым для мониторинга региона или значительного изменения местоположения в фоновом режиме или 'requestAlwaysAuthorization' все еще достаточно хорош? –
Я столкнулся со странным поведением allowBackgroundLocationUpdates при отключении после его включения. Возможно, вы могли бы помочь мне с моей проблемой. Http://stackoverflow.com/questions/41704302/disabling-allowsbackgroundlocationupdates-cllocationmanager-doesnt-work-after Спасибо – Sander