Я использую фреймворк CoreLocation
в своем приложении в Xcode7 (предварительно выпущенный), и я заметил, что есть новое добавленное свойство под названием allowsBackgroundLocationUpdates
в классе CLLocationManager
.
Какая связь между этим свойством и местоположением обновляется на вкладке "Фоновые режимы вкладки". Какое значение по умолчанию у него и влияет ли оно на приложения, запущенные в iOS9?
Ответ 1
Это новое свойство объясняется на сессии WWDC "Что нового в местоположении ядра" .
Значение по умолчанию NO
, если вы связываетесь с iOS 9.
Если ваше приложение использует местоположение в фоновом режиме (без отображения синей строки состояния), вы должны установить allowsBackgroundLocationUpdates
в YES
в дополнение к настройке возможностей фонового режима в Info.plist. В противном случае обновления местоположения доставляются только на переднем плане. Преимущество состоит в том, что теперь вы можете иметь менеджеров местоположения с обновлениями фонового местоположения и других менеджеров местоположения с обновлениями только для основного местоположения в том же приложении. Вы можете также reset значение NO
изменить поведение.
Документация достаточно понятна:
По умолчанию это НЕТ для приложений, связанных с iOS 9.0 или позже, независимо от минимальной цели развертывания.
С UIBackgroundModes, чтобы включить "местоположение" в Info.plist, вы также должно установить это свойство в YES во время выполнения при вызове -startUpdatingLocation с намерением продолжить в фоновом режиме.
Установка этого свойства в YES, когда UIBackgroundModes не включает "location" является фатальной ошибкой.
Сброс этого свойства в НЕТ эквивалентен отсутствию "местоположения", от значения UIBackgroundModes. Доступ к местоположению по-прежнему разрешается всякий раз, когда приложение работает (т.е. не приостановлено), и имеет достаточную авторизацию (т.е. имеет авторизацию InInUse и в использовании, или он имеет всегда авторизацию). Однако приложение все равно будет подчиняться обычным правилам приостановления действия.
См. -requestWhenInUseAuthorization и -requestAlwaysAuthorization для более подробная информация о возможных значениях авторизации.
Ответ 2
Если вы используете платформу CoreLocation в своем приложении в Xcode7 (предварительно выпущено), и вы можете заметить, что в классе CLLocationManager есть новое добавленное свойство allowBackgroundLocationUpdates.
Это новое свойство объясняется в сеансе WWDC "Что нового в основном расположении".
![enter image description here]()
Значение по умолчанию - NO
, если вы ссылаетесь на iOS 9.
Если ваше приложение использует местоположение в фоновом режиме (без отображения синей строки состояния), вы должны установить allowsBackgroundLocationUpdates
на YES
в дополнение к настройке возможности фонового режима в Info.plist. В противном случае обновления местоположения доставляются только на переднем плане. Преимущество заключается в том, что теперь у вас в одном приложении могут быть диспетчеры местоположения с фоновыми обновлениями местоположения и другие менеджеры местоположения только с обновлениями местоположения переднего плана. Вы также можете сбросить значение на NO
, чтобы изменить поведение.
Документация достаточно ясна об этом:
По умолчанию это НЕТ для приложений, связанных с iOS 9.0 или позже, независимо от минимальной цели развертывания.
С UIBackgroundModes, установленным для включения "location" в Info.plist, вы необходимо также установить это свойство в YES во время выполнения при вызове -startUpdatingLocation с намерением продолжить в фоновом режиме.
Установка этого свойства в YES, когда UIBackgroundModes не включает "location" - фатальная ошибка.
Сброс этого свойства в NO равносилен пропуску "location" из значения UIBackgroundModes. Доступ к локации еще разрешено, когда приложение запущено (т.е. не приостановлено), и имеет достаточную авторизацию (т.е. имеет авторизацию WhenInUse и является в использовании, или он всегда имеет разрешение). Тем не менее, приложение будет по-прежнему подчиняться обычным правилам приостановления задачи.
См. -requestWhenInUseAuthorization и -requestAlwaysAuthorization для подробнее о возможных значениях авторизации.
Установить Info.plist как :
![enter image description here]()
Синтаксис для конфигурации Info.plist выглядит следующим образом:
<key>NSLocationAlwaysUsageDescription</key>
<string>I want to get your location Information in background</string>
<key>UIBackgroundModes</key>
<array>
<string>location</string>
</array>
Или откройте вкладку "Возможности" целевого приложения.
![enter image description here]()
(источник: raywenderlich.com)
Используйте как:
_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];
Я пишу демо Здесь (Demo2)
Ответ 3
Ну, я все еще использую xCode 6, так как 7 бета всегда сбой с симулятором, и у меня есть эта проблема, хотя я даже не связываюсь с iOS9! И я не могу установить это свойство, так как он не существует в iOS8! О, Apple, когда закончится мучение?!
Я изменил его на эту совместимую с xCode6 версию, выполнив этот поздний связанный вызов:
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 9.0) {
BOOL yes = YES;
NSMethodSignature* signature = [[CLLocationManager class] instanceMethodSignatureForSelector: @selector( setAllowsBackgroundLocationUpdates: )];
NSInvocation* invocation = [NSInvocation invocationWithMethodSignature: signature];
[invocation setTarget: locationManager];
[invocation setSelector: @selector( setAllowsBackgroundLocationUpdates: ) ];
[invocation setArgument: &yes atIndex: 2];
[invocation invoke];
}
Подтвержденная работа над iOS8 (ничего не делает) и на iOS9 beta 6 (правильно вызывает метод).
Ответ 4
Я столкнулся с тем же сервисом местоположения в фоновом режиме для iOS 9.0.x, и я исправил его, как рекомендовано в этом сообщении, добавив ниже коды
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 9) {
_locationManager.allowsBackgroundLocationUpdates = YES;
}
Однако он не работает в iOS 9.1. У кого-то есть такая же проблема???
Если да, пожалуйста, любезно помогите. Благодаря
Ответ 5
{
NSArray* backgroundModes = [NSBundle MainBundle].infoDictionary[@"UIBackgroundModes"];
if(backgroundModes && [backgroundModes containsObject:@"location"]) {
if([manager respondsToSelector:@selector(setAllowsBackgroundLocationUpdates:)]) {
// We now have iOS9 and the right capabilities to set this:
[manager setAllowsBackgroundLocationUpdates:YES];
}
}
}
Ответ 6
Здесь приведено резюме многих методов, которые обновляются с iOS 8 до iOS 9
Многие API и коды должны быть найдены для каждой используемой структуры. Поэтому выполните поиск в Общей структуре, а затем найдите эти методы для обновления изношенных методов.