allowsBackgroundLocationUpdates в CLLocationManager в iOS9
Я использую CoreLocation
framework в моем приложении в Xcode7 (предварительно выпущенном), и я заметил, что есть недавно добавленное свойство под названием allowsBackgroundLocationUpdates
in CLLocationManager
класса.
какова связь между этим свойством и обновлениями местоположения в фоновых режимах вкладки возможности. Каково его значение по умолчанию и влияет ли оно на приложения, работающие в iOS9?
6 ответов:
это новое свойство объясняется в сеансе WWDC "Что нового в Core Location".
значение по умолчанию:
NO
Если вы ссылаетесь на iOS 9.если ваше приложение использует расположение в фоновом режиме (без отображения синей строки состояния) , вы должны установить
allowsBackgroundLocationUpdates
toYES
в дополнение к установке возможности фонового режима в Info.файл plist. В противном случае обновления местоположения поставляются только на переднем плане. Преимущество в том, что теперь вы можете иметь место менеджеры с фоновыми обновлениями местоположения и другое менеджеры местоположения с обновлениями местоположения только на переднем плане в том же приложении. Вы также можете сбросить значениеNO
чтобы изменить поведение.документация довольно ясна об этом:
по умолчанию это не для приложений, связанных с iOS 9.0 или позже, независимо от минимальной цели развертывания.
С UIBackgroundModes установлен для включения "местоположение" в информации.plist, вы необходимо также установить для этого свойства значение YES во время выполнения при каждом вызове -startUpdatingLocation с намерением продолжить в фоновом режиме.
установка для этого свойства значения да, если UIBackgroundModes не включает "расположение" - это фатальная ошибка.
сброс этого свойства до значения нет эквивалентен пропуску " location" из значения UIBackgroundModes. Доступ к местоположению по-прежнему разрешается всякий раз, когда приложение работает (т. е. не приостановлено), и имеет достаточная авторизация (т. е. она имеет авторизацию WhenInUse и является в использовании, или он всегда имеет разрешение). Тем не менее, приложение будет по-прежнему будьте подчинены обычным правилам приостановки выполнения задач.
см. - requestWhenInUseAuthorization и-requestAlwaysAuthorization для более подробно о возможных значениях авторизации.
если вы используете CoreLocation framework в своем приложении в Xcode7 (предварительно выпущенном),и вы можете заметить, что в классе CLLocationManager есть недавно добавленное свойство allowsBackgroundLocationUpdates.
это новое свойство объясняется в сеансе WWDC "Что нового в Core Location".
значение по умолчанию:
NO
Если вы ссылаетесь на iOS 9.если ваше приложение использует расположение в фоновом режиме (без отображения синего строка состояния) вы должны установить
allowsBackgroundLocationUpdates
доYES
в дополнение к установке возможности фонового режима в информации.файл plist. В противном случае обновления местоположения поставляются только на переднем плане. Преимущество заключается в том, что теперь вы можете иметь менеджеры местоположений с обновлениями фонового местоположения и другие менеджеры местоположений только с обновлениями местоположения переднего плана в том же приложении. Вы также можете сбросить значениеNO
чтобы изменить поведение.документация довольно ясна об этом:
по умолчанию это не для приложений, связанных с iOS 9.0 или позже, независимо от минимальной цели развертывания.
С UIBackgroundModes установлен для включения "местоположение" в информации.plist файл, вы необходимо также установить для этого свойства значение YES во время выполнения при каждом вызове -startUpdatingLocation с намерением продолжить в фоновом режиме.
установка для этого свойства значения да, если UIBackgroundModes не включает "расположение" - это фатальная ошибка.
сброс этого свойства до значения нет эквивалентен пропуску " location" из значения UIBackgroundModes. Доступ к местоположению по-прежнему разрешается всякий раз, когда приложение работает (т. е. не приостановлено), и имеет достаточную авторизацию (т. е. имеет авторизацию WhenInUse и является в использовании, или он всегда имеет разрешение). Тем не менее, приложение будет по-прежнему будьте подчинены обычным правилам приостановки выполнения задач.
см. - requestWhenInUseAuthorization и-requestAlwaysAuthorization для более подробно о возможных значениях авторизации.
Настройка Информация.plist файл как:
синтаксис для информации.конфигурация 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 и коды должны быть найдены для каждого фреймворка, который вы используете. Поэтому найдите в общем фреймворке, а затем найдите эти методы для обновления амортизированных методов.