2015-06-12 4 views
58

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

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

ответ

94

Это новое свойство объяснено на сессии WWDC "What's New in Core Location".

Значение по умолчанию NO если вы связываете с прошивкой 9.

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

документация довольно четкое представление о нем:

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

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

Установка этого свойства в YES, когда UIBackgroundModes не включает "location" является фатальной ошибкой.

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

См. -requestWhenInUseAuthorization and -requestAlwaysAuthorization for Подробнее о возможных значениях авторизации.

+4

Я думаю, что это свойство делает путаницу более чем ясностью. У нас были (и у нас все еще есть) «всегда» и «когда используются» свойства, которые более чем ясны. Зачем добавлять такое запутанное свойство. И я не думаю, что использование более одного объекта CLLocationManager - лучшая практика. – androniennn

+0

Является ли это свойство необходимым для мониторинга региона или значительного изменения местоположения в фоновом режиме или 'requestAlwaysAuthorization' все еще достаточно хорош? –

+0

Я столкнулся со странным поведением allowBackgroundLocationUpdates при отключении после его включения. Возможно, вы могли бы помочь мне с моей проблемой. Http://stackoverflow.com/questions/41704302/disabling-allowsbackgroundlocationupdates-cllocationmanager-doesnt-work-after Спасибо – Sander

36

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

Это новое свойство объяснено на сессии WWDC "What's New in Core Location". enter image description here

Значение по умолчанию: 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 как: 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

Используйте как:

_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)

+0

У вас возникли проблемы с этим флагом? В моем примере отключить его проект не работает, если он был установлен в true изначально http://stackoverflow.com/questions/41704302/disabling-allowsbackgroundlocationupdates-cllocationmanager-doesnt-work-after Спасибо – Sander

5

Ну, я до сих пор с помощью 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 беты-6 (вызывается метод корректно).

1

Here представляет собой резюме из многих методов, которые обновляются с прошивки от 8 до 9 прошивки

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

5

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

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

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

+0

У меня такая же проблема для iOS 9.1 – franck

+0

@franck, у меня точно такая же проблема, вы ее разрешили? – ASBai

+0

@ASBai Прости, нет, теперь это работает для меня, и я не понял, что произойдет. – franck

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]; 
     } 
    } 
} 
+0

Просто маленькая опечатка MainBundle должна быть с нижним регистром M. 'mainBundle = [NSBundle mainBundle];' – mauron85

Смежные вопросы