Подтвердить что ты не робот

AllowBackgroundLocationUpdates в CLLocationManager в iOS9

Я использую фреймворк CoreLocation в своем приложении в Xcode7 (предварительно выпущенный), и я заметил, что есть новое добавленное свойство под названием allowsBackgroundLocationUpdates в классе CLLocationManager.

Какая связь между этим свойством и местоположением обновляется на вкладке "Фоновые режимы вкладки". Какое значение по умолчанию у него и влияет ли оно на приложения, запущенные в iOS9?

4b9b3361

Ответ 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 и коды должны быть найдены для каждой используемой структуры. Поэтому выполните поиск в Общей структуре, а затем найдите эти методы для обновления изношенных методов.