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

IOS9 не отслеживает местоположение в фоновом режиме

Мое приложение отслеживает местоположение в фоновом режиме... режим фонового местоположения включен, и я использую

[self.locationManager startUpdatingLocation];

Это отлично работает на iOS7-8, но перестало работать на iOS9

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

Является ли это документированным? Почему он работает в симуляторе, а не в устройстве? это ошибка?

При использовании startSignificantChangeUpdates он работает на iOS9, я задаюсь вопросом, является ли это какой-то функцией экономии заряда аккумулятора, что они, возможно, запрещают запускОбновлениеЛокация

4b9b3361

Ответ 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