Синяя строка состояния iOS при использовании геозон / фоновых обновлений местоположения для запуска уведомлений - PullRequest
0 голосов
/ 18 октября 2019

У меня есть код приложения, который позволяет обновлять местоположение в фоновом режиме

locationManager.requestAlwaysAuthorization()
locationManager.delegate = self

locationManager.desiredAccuracy = kCLLocationAccuracyHundredMeters // less batery ussage
locationManager.pausesLocationUpdatesAutomatically = false
locationManager.allowsBackgroundLocationUpdates = true

И я хочу запускать локальные уведомления в зависимости от географического местоположения пользователя.

notificationCenter.requestAuthorization(options: [.alert, .badge, .sound]) { [weak self] (granted, error) in
            guard let self = self else { return }
            if granted {
                print("NotificationCenter Authorization Granted!")

                self.notificationCenter.removePendingNotificationRequests(withIdentifiers: [model.id])

                let content = UNMutableNotificationContent()
                content.title = model.name
                content.body = model.desc

                content.categoryIdentifier = "Location Notification"
                content.userInfo["model_id"] = model.id
                content.sound = UNNotificationSound.default

                let region = self.makeRegion(for: model)

                let trigger = UNLocationNotificationTrigger(region: region, repeats: true)
                let request = UNNotificationRequest(identifier: restaurant.id, content: content, trigger: trigger)

                self.notificationCenter.add(request)
            }
        }

locationManager.startUpdatingLocation()

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

Я слышал, что это будет отображаться во время предоставления прав пользователя в состоянии использования авторизации для основного местоположения. Поэтому, насколько я понимаю, я должен разрешать запуск этого уведомления только тогда, когда приложение находится на переднем плане (но какие изменения здесь необходимы? allowsBackgroundLocationUpdates = false?)

И использовать фоновые обновления местоположения пользователя только тогда, когда пользователь предоставил статус «Всегда авторизация».

Но странным является то, что этот индикатор синей барды также появляется, когда приложение находится на переднем плане.

ОБНОВЛЕНИЕ

ОК У меня задан вопрос «В следующий раз», всегда отображается синий индикатор.

Если есть Во время использования, синий индикатор находится только в фоновом режиме.

Здесь всегда есть синий индикатор.

Я думаю добавить такой метод делегата

func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {

        print("Core Location authorization status: \(status)")

        switch status {
        case .authorizedAlways:
            locationManager.allowsBackgroundLocationUpdates = true
        default:
            locationManager.allowsBackgroundLocationUpdates = false
        }
    }

Я думаю, что это должно решить синий индикатор навязчивое отображение в строке состояния. И единственная проблема будет в том, что если пользователь в iOS 13 выберет «Пока используется», то не будет попытки обновить местоположение в фоновом режиме, поэтому в конце не будет случая отображать предупреждение с вопросом о Всегда Авторизации, и толькоБудет ли возможность пользователю вручную включить Всегда в настройках?

Итак, мой вопрос здесь заключается в том, как сделать так, чтобы в iOS 13 появилось предупреждение с вопросом о Always Authorization, и только после этого измените

.allowsBackgroundLocationUpdates = true

на

.allowsBackgroundLocationUpdates = false

1 Ответ

1 голос
/ 18 октября 2019

Проблема в том, что все, что вы делаете, неверно.

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

Что касается синей полосы, то правило такое же, как и всегда: устанавливать

locationManager.allowsBackgroundLocationUpdates = true

следует только тогда, когда вычтобы перейти в фон, когда вы уже обновляете локации, и вы должны установить

locationManager.allowsBackgroundLocationUpdates = false

, когда вы вернетесь на передний план. Если вы не работаете в фоновом режиме (с фоновой возможностью) при обновлении локаций, вообще не используйте allowsBackgroundLocationUpdates.

Просто делайте то, что вы должны делать, и все будет хорошо.

...