iOS, запрашивающая всегда авторизацию, показывает предупреждение о разрешении только в первый раз - PullRequest
0 голосов
/ 14 ноября 2018

Первый раз, когда я устанавливаю свое приложение iOS на устройство с помощью xcode и службы определения местоположения, служба requestAlwaysAuthorization () показывает «Включить службы определения местоположения», которые подталкивают пользователя к настройкам устройства, чтобы включить службу определения местоположения, затем пользователь возвращается к приложение и будет видеть предупреждение «разрешение» (с тремя вариантами всегда, при использовании и никогда). Если пользователь нажимает на параметр всегда, затем полностью закрывает приложение и отключает службу определения местоположения, а затем снова открывает приложение, предупреждение «Включить службы определения местоположения» не отображается. Это мой код:

override func viewDidLoad() {
    super.viewDidLoad()

    locationManager = CLLocationManager()
    NotificationCenter.default.addObserver(self, selector: #selector(checkLocationService), name: Notification.Name.UIApplicationWillEnterForeground, object: nil)    
}

 @objc func checkLocationService() {
    if CLLocationManager.locationServicesEnabled() {
        switch CLLocationManager.authorizationStatus() {
        case .denied, .notDetermined, .restricted:
            locationManager = CLLocationManager()
            locationManager.delegate = self
            locationManager.requestAlwaysAuthorization()
        case .authorizedWhenInUse, .authorizedAlways:
            ...
        }
    } else {
        locationManager = CLLocationManager()
        locationManager.delegate = self
        locationManager.requestAlwaysAuthorization()
    }
}

Я добавил все три ключа местоположения в Info.plist:

<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>My app need your location to work</string>
<key>NSLocationAlwaysUsageDescription</key>
<string>My app need your location to work</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>My app need your location to work</string>

Я тестирую на iOS 11 и 12 и не знаю, что не так.

1 Ответ

0 голосов
/ 14 ноября 2018

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

switch CLLocationManager.authorizationStatus() {
    case .notDetermined, .restricted:
        locationManager = CLLocationManager()
        locationManager.delegate = self
        locationManager.requestAlwaysAuthorization()
    case .authorizedWhenInUse, .authorizedAlways:
        ...
    case .denied:
        // present an alert advising the user that they need to go to the settings menu to enable the permissions as they have previously denied it. 
        // if the user presses Open Settings on the alert....
        if let url = URL(string: UIApplicationOpenSettingsURLString) { 
            UIApplication.shared.open(url: url) 
        }
    }
...