IOS9 не отслеживает местоположение в фоновом режиме
Мое приложение отслеживает местоположение в фоновом режиме... режим фонового местоположения включен, и я использую
[self.locationManager startUpdatingLocation];
Это отлично работает на iOS7-8
, но перестало работать на iOS9
В симуляторе это работает, но на реальном устройстве я не получаю обратного вызова в фоновом режиме... при запуске того же кода на устройстве iOS8 я получаю нормальные обратные вызовы, как раньше
Является ли это документированным? Почему он работает в симуляторе, а не в устройстве? это ошибка?
При использовании startSignificantChangeUpdates
он работает на iOS9, я задаюсь вопросом, является ли это какой-то функцией экономии заряда аккумулятора, что они, возможно, запрещают запускОбновлениеЛокация
Ответы
Ответ 1
Использование:
if ([self.locationManager respondsToSelector:@selector(setAllowsBackgroundLocationUpdates:)]) {
[self.locationManager setAllowsBackgroundLocationUpdates:YES];
}
чтобы избежать использования макроса, который оценивает версию системы. Это вызовет setAllowsBackgroundLocationUpdates: на iOS 9, но не на iOS 8.
Ответ 2
Пожалуйста, используйте ссылку ниже для местоположения в ios 9
allowBackgroundLocationUpdates в CLLocationManager в iOS9
Это новое свойство объясняется на сессии WWDC "Что нового в базовом местоположении".
Значение по умолчанию - NO, если вы ссылаетесь на iOS 9.
Если ваше приложение использует местоположение в фоновом режиме (без отображения синей строки состояния), вы должны установить allowBackgroundLocationUpdates в YES в дополнение к настройке возможностей фонового режима в Info.plist. В противном случае обновления местоположения доставляются только на переднем плане. Преимущество заключается в том, что теперь у вас могут быть менеджеры местоположений с обновлениями фонового местоположения и другими менеджерами местоположения с обновлениями только для локального местоположения в том же приложении. Вы можете также reset значение NO для изменения поведения.
Документация достаточно понятна:
По умолчанию это НЕТ для приложений, связанных с iOS 9.0 или новее, независимо от минимальной цели развертывания.
Если UIBackgroundModes настроен на включение "location" в Info.plist, вы также должны установить для этого свойства значение YES во время выполнения при вызове -startUpdatingLocation с намерением продолжить в фоновом режиме.
Установка этого свойства в YES, когда UIBackgroundModes не включает в себя "местоположение", является фатальной ошибкой.
Сброс этого свойства в НЕТ эквивалентен отсутствию "местоположения" из значения UIBackgroundModes. Доступ к местоположению по-прежнему разрешен всякий раз, когда приложение работает (т.е. Не приостановлено), и имеет достаточную авторизацию (т.е. Имеет авторизацию InInUse и используется, или имеет всегда авторизацию). Тем не менее, приложение будет по-прежнему подчиняться обычным правилам приостановления действия.
См. -requestWhenInUseAuthorization и -requestAlwaysAuthorization для получения более подробной информации о возможных значениях авторизации.
Спасибо
Ответ 3
У меня была такая же проблема, вам нужно добавить что-то вроде этого:
if(SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"9.0")){
[self.locationManager setAllowsBackgroundLocationUpdates:YES];
}
Мой макрос для проверки версии системы выглядит следующим образом:
#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)
Следующая страница форума помогла мне:
https://forums.developer.apple.com/thread/6895
Ответ 4
Новый метод - locationManager → requestLocation() см. https://developer.apple.com/library/ios/documentation/CoreLocation/Reference/CLLocationManager_Class/ Также добавлен allowBackgroundLocationUpdates (только для iOS9).