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

IOS8: появляется синяя полоса "Использование вашего местоположения" вскоре после выхода из приложения

Я хотел бы получить синюю полосу при отслеживании в фоновом режиме, но не тогда, когда нет.

Мое приложение постоянно использует службы определения местоположения, поэтому в iOS8 я использую requestWhenInUseAuthorization on CLLocationManager. Как правило, приложение перестает отслеживать ваше местоположение, когда вы его закрываете, но пользователь может выбрать вариант, позволяющий приложению отслеживать свое местоположение в фоновом режиме. Поэтому у меня есть опция location для UIBackgroundModes в файле Info.plist. Это отлично работает: при переключении на задний план приложение продолжает получать обновления местоположения, а синяя полоса появляется как напоминание о том, что приложение использует службы определения местоположения. Все идеально.

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

- (void) applicationDidEnterBackground:(UIApplication *)application
{
    if (!trackingInBackground) {
        [theLocationManager stopUpdatingLocation];
    }
}

Синяя полоса отображается только на секунду после закрытия приложения, но она все еще выглядит довольно раздражающей.

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

Я попытался stopUpdatingLocation уже в методе applicationWillResignActive:, но это не имеет никакого значения.

Кто-нибудь знает, как получить синюю полосу при отслеживании в фоновом режиме, но не тогда, когда нет?

4b9b3361

Ответ 1

Мы часто сообщаем об Apple, и иногда они на самом деле действуют на него. Чтобы не допустить появления синей полосы, как описано в вопросе, Apple представила новое свойство на CLLocationManager в iOS-9. Установите его в тот момент, когда вы знаете, что вам нужно место в фоновом режиме:

theLocationManager.allowsBackgroundLocationUpdates = YES;

или, обратно совместимым способом:

if ([theLocationManager respondsToSelector:@selector(setAllowsBackgroundLocationUpdates:)]) {
    [theLocationManager setAllowsBackgroundLocationUpdates:YES];
}

в Swift:

if #available(iOS 9.0, *) {
    theLocationManager.allowsBackgroundLocationUpdates = true 
}

Если это свойство не установлено, синяя панель не будет отображаться при выходе из приложения, а местоположение пользователя недоступно для вашего приложения. Обратите внимание, что в iOS 9 вы должны установить свойство, чтобы иметь возможность использовать местоположение в фоновом режиме.

Смотрите видео WWDC для объяснения Apple.

Ответ 2

Синяя полоса отображается только при включении Background Location Updates и запросе when-in-use authorization в iOS 8.

Синяя полоса "Использование вашего местоположения" появляется вскоре после выхода из приложения

Похоже, что диспетчер местоположений не может сразу остановиться. Таким образом, синий бар появится, пока менеджер местоположений не остановится полностью. Или, может быть, это просто ошибка, как сказал Кейт.

Ответ 3

Чтобы отобразить синее уведомление, вам нужно добавить "Конфиденциальность" - "Местоположение" При использовании описания использования в файле Plist (это важно, когда Always Location синяя полоса не была появляются когда-либо)

 self.locationManager.delegate = self;
 self.locationManager.requestWhenInUseAuthorization()
 self.locationManager.pausesLocationUpdatesAutomatically = true/false
 self.locationManager.allowsBackgroundLocationUpdates = true

затем нажмите звездочку: locationManager.startUpdatingLocation()

Также методы переопределения:

 func locationManager(_ manager: CLLocationManager, didUpdateLocations
  locations: [CLLocation]) {
       print(manager.location?.coordinate.latitude ?? "No data")
 }


 func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
     if status == .authorizedWhenInUse {
         if CLLocationManager.isMonitoringAvailable(for: CLBeaconRegion.self) {
             if CLLocationManager.isRangingAvailable() {
                 // do stuff
                 print(manager.location?.coordinate.latitude ?? "No data")
                 locationManager.startUpdatingLocation()
             }
         }
     }
 }

Запомните импорт!!:

 import CoreLocation

И также помните Делегат (CLLocationManagerDelegate):

 class ViewController: UIViewController, CLLocationManagerDelegate{

Ответ 4

Если вы выполните шаги ниже, синяя полоса не появится в фоновом режиме

  • set NSLocationAlwaysUsageDescription в Info.plist
  • Проверить возможности > Режимы фонa > Обновления местоположений
  • в коде locationManager.requestAlwaysAuthorization()

Ответ 5

Это не ошибка, у вас все еще есть активный менеджер местоположений где-то в вашем приложении. У вас есть вид карты с showsUserLocation = YES например? Это может быть так.

Я тщательно изучил свой проект, и когда я остановил всех менеджеров местоположений, панель исчезла, когда это должно произойти.

Ответ 6

Чтобы отобразить синюю полосу заголовка, в которой ваше приложение использует местоположение при нажатии кнопки "домой", вы должны установить Конфиденциальность - Местоположение при использовании Использование Описание в файле Plist

 self.locationManager.delegate = self;

 locationManager.desiredAccuracy = kCLLocationAccuracyBest

 self.locationManager.requestWhenInUseAuthorization()

 self.locationManager.pausesLocationUpdatesAutomatically = true

 self.locationManager.allowsBackgroundLocationUpdates = true

когда вы используете self.locationManager.requestAlwaysAuthorization(), то он не будет отображать синий заголовок

вам нужно использовать self.locationManager.requestWhenInUseAuthorization(), тогда он отобразит синий заголовок, когда приложение находится в фоновом режиме, которое ваше приложение использует в качестве местоположения

вы также должны установить фоновый режим в возможностях в целевом для местоположения