allowsBackgroundLocationUpdates в CLLocationManager в iOS9


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

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

6 61

6 ответов:

это новое свойство объясняется в сеансе WWDC "Что нового в Core Location".

значение по умолчанию:NO Если вы ссылаетесь на iOS 9.

если ваше приложение использует расположение в фоновом режиме (без отображения синей строки состояния) , вы должны установить allowsBackgroundLocationUpdates to YES в дополнение к установке возможности фонового режима в Info.файл plist. В противном случае обновления местоположения поставляются только на переднем плане. Преимущество в том, что теперь вы можете иметь место менеджеры с фоновыми обновлениями местоположения и другое менеджеры местоположения с обновлениями местоположения только на переднем плане в том же приложении. Вы также можете сбросить значение NO чтобы изменить поведение.

документация довольно ясна об этом:

по умолчанию это не для приложений, связанных с iOS 9.0 или позже, независимо от минимальной цели развертывания.

С UIBackgroundModes установлен для включения "местоположение" в информации.plist, вы необходимо также установить для этого свойства значение YES во время выполнения при каждом вызове -startUpdatingLocation с намерением продолжить в фоновом режиме.

установка для этого свойства значения да, если UIBackgroundModes не включает "расположение" - это фатальная ошибка.

сброс этого свойства до значения нет эквивалентен пропуску " location" из значения UIBackgroundModes. Доступ к местоположению по-прежнему разрешается всякий раз, когда приложение работает (т. е. не приостановлено), и имеет достаточная авторизация (т. е. она имеет авторизацию WhenInUse и является в использовании, или он всегда имеет разрешение). Тем не менее, приложение будет по-прежнему будьте подчинены обычным правилам приостановки выполнения задач.

см. - requestWhenInUseAuthorization и-requestAlwaysAuthorization для более подробно о возможных значениях авторизации.

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

это новое свойство объясняется в сеансе WWDC "Что нового в Core Location". enter image description here

значение по умолчанию:NO Если вы ссылаетесь на iOS 9.

если ваше приложение использует расположение в фоновом режиме (без отображения синего строка состояния) вы должны установить allowsBackgroundLocationUpdates до YES в дополнение к установке возможности фонового режима в информации.файл plist. В противном случае обновления местоположения поставляются только на переднем плане. Преимущество заключается в том, что теперь вы можете иметь менеджеры местоположений с обновлениями фонового местоположения и другие менеджеры местоположений только с обновлениями местоположения переднего плана в том же приложении. Вы также можете сбросить значение NO чтобы изменить поведение.

документация довольно ясна об этом:

по умолчанию это не для приложений, связанных с iOS 9.0 или позже, независимо от минимальной цели развертывания.

С UIBackgroundModes установлен для включения "местоположение" в информации.plist файл, вы необходимо также установить для этого свойства значение YES во время выполнения при каждом вызове -startUpdatingLocation с намерением продолжить в фоновом режиме.

установка для этого свойства значения да, если UIBackgroundModes не включает "расположение" - это фатальная ошибка.

сброс этого свойства до значения нет эквивалентен пропуску " location" из значения UIBackgroundModes. Доступ к местоположению по-прежнему разрешается всякий раз, когда приложение работает (т. е. не приостановлено), и имеет достаточную авторизацию (т. е. имеет авторизацию WhenInUse и является в использовании, или он всегда имеет разрешение). Тем не менее, приложение будет по-прежнему будьте подчинены обычным правилам приостановки выполнения задач.

см. - requestWhenInUseAuthorization и-requestAlwaysAuthorization для более подробно о возможных значениях авторизации.

Настройка Информация.plist файл как: enter image description here

синтаксис для информации.конфигурация 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];

Я пишу демо Здесь (Demo2)

Ну, я все еще использую xCode 6, так как бета-версия 7 всегда падает с симулятором, и у меня есть эта проблема, хотя я даже не связываюсь с iOS9! И я не могу установить это свойство, так как оно не существует в iOS8! О яблоко, когда же кончится мучение?!

Я изменил его на эту совместимую версию 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 (вызывает метод правильно).

я столкнулся с тем же сервисом определения местоположения в фоновом режиме для iOS 9.0.x и я исправил это, как рекомендовано в этом посте, добавив ниже коды

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 9) {
    _locationManager.allowsBackgroundLocationUpdates = YES;
}

однако это не работает в iOS 9.1 у кого-нибудь есть такая же проблема??? Если это так, пожалуйста, любезно помочь. Спасибо

{
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];
         }
     }
}

здесь это сводка многих методов, которые обновляются с iOS 8 до iOS 9

многие API и коды должны быть найдены для каждого фреймворка, который вы используете. Поэтому найдите в общем фреймворке, а затем найдите эти методы для обновления амортизированных методов.