var locMgr = INTULocationManager.sharedInstance()
    locMgr.requestLocation(withDesiredAccuracy: .city, timeout: 30, delayUntilAuthorized: true,block: {(currentLoc: CLLocation!, achievedAccuracy: INTULocationAccuracy, status: INTULocationStatus) -> Void in
        if status == INTULocationStatus.success {
        }
        else{
        }

INTULocationManager usado, Swift 4.1, iOS 11.1

Si se ejecuta por primera vez este código emergente Solicitud de permiso de ubicación

Pero si lo negara, esto no aparecerá la próxima vez.

¿Cómo abrir la ventana emergente de permisos?

Creo un botón

Ejecuta este código

let locationManager = CLLocationManager()
    locationManager.delegate = self
    locationManager.requestWhenInUseAuthorization()

Pero no funcionó

0
Adam 13 sep. 2018 a las 12:57

4 respuestas

La mejor respuesta

No hay ninguna funcionalidad predeterminada que muestre el permiso de ubicación una vez que el usuario haya denegado el permiso. Debe mostrar una alerta al usuario de que se requiere permiso y luego redirigir al usuario a la pantalla de Configuración. Aquí está el código completo que puede usar. Defina una función que verifique el permiso de ubicación.

    func hasLocationPermission() -> Bool {
        var hasPermission = false
        if CLLocationManager.locationServicesEnabled() {
            switch CLLocationManager.authorizationStatus() {
            case .notDetermined, .restricted, .denied:
                hasPermission = false
            case .authorizedAlways, .authorizedWhenInUse:
                hasPermission = true
            }
        } else {
            hasPermission = false
        }

        return hasPermission
    }

Ahora verifique el permiso de ubicación a través de esta función y muestre alerta si es necesario.

    if !hasLocationPermission() {
            let alertController = UIAlertController(title: "Location Permission Required", message: "Please enable location permissions in settings.", preferredStyle: UIAlertControllerStyle.alert)

            let okAction = UIAlertAction(title: "Settings", style: .default, handler: {(cAlertAction) in
                //Redirect to Settings app
                UIApplication.shared.open(URL(string:UIApplicationOpenSettingsURLString)!)
            })

            let cancelAction = UIAlertAction(title: "Cancel", style: UIAlertActionStyle.cancel)
            alertController.addAction(cancelAction)

            alertController.addAction(okAction)

            self.present(alertController, animated: true, completion: nil)
        }
7
Ehsan Saddique 22 oct. 2019 a las 07:40

Si el usuario niega el permiso, abra la ventana emergente de permisos

 /*  func checkLocation() {
    if CLLocationManager.authorizationStatus() != .authorizedWhenInUse
    {
        print("requesting autorization")
        locationManager.requestWhenInUseAuthorization()

    } else {
        print("start updating location")
    }
}*/

func askEnableLocationService() ->String {
    var showAlertSetting = false
    var showInitLocation = false
    if CLLocationManager.locationServicesEnabled() {
        switch CLLocationManager.authorizationStatus() {
        case .denied:
            showAlertSetting = true
            print("HH: kCLAuthorizationStatusDenied")
        case .restricted:
            showAlertSetting = true
            print("HH: kCLAuthorizationStatusRestricted")
        case .authorizedAlways:
            showInitLocation = true
            print("HH: kCLAuthorizationStatusAuthorizedAlways")
        case .authorizedWhenInUse:
            showInitLocation = true
            print("HH: kCLAuthorizationStatusAuthorizedWhenInUse")
        case .notDetermined:
            showInitLocation = true
            print("HH: kCLAuthorizationStatusNotDetermined")
        default:
            break
        }
    }else{
        showAlertSetting = true
        print("HH: locationServicesDisabled")

    }
    if showAlertSetting {
        let alertController = UIAlertController(title: "xxxxxx", message: "Please enable location service in the settings", preferredStyle: .alert)
        let OKAction = UIAlertAction(title: "OK", style: .default) { (action:UIAlertAction!) in



            if let url = URL(string: UIApplicationOpenSettingsURLString) {
                UIApplication.shared.open(url, options: [:], completionHandler: nil)
            }

        }
        alertController.addAction(OKAction)
        self.window?.rootViewController?.present(alertController, animated: true, completion:nil)

    }
    if showInitLocation {

        return "YES"

    }
    return "NO"

}
1
SAXENA 14 sep. 2018 a las 10:36

Swift 5

Una vez que el usuario niega el permiso, la alerta se deshabilita para su aplicación y no se volverá a mostrar. Puede mostrar una ventana emergente al usuario que requiere permiso.

Aquí está el código completo que puedes usar

  if CLLocationManager.locationServicesEnabled() {
        switch CLLocationManager.authorizationStatus() {
        case .notDetermined, .restricted, .denied:
            showPermissionAlert()
        case .authorizedAlways, .authorizedWhenInUse:
            locationManager.startUpdatingLocation()
        }
    } else {
       locationManager.startUpdatingLocation()
    }

Ahora verifique el permiso de ubicación a través de esta función y muestre alerta si es necesario.

   func showPermissionAlert(){
    let alertController = UIAlertController(title: "Location Permission Required", message: "Please enable location permissions in settings.", preferredStyle: UIAlertController.Style.alert)

    let okAction = UIAlertAction(title: "Settings", style: .default, handler: {(cAlertAction) in
        //Redirect to Settings app
        UIApplication.shared.open(URL(string:UIApplication.openSettingsURLString)!)
    })

    let cancelAction = UIAlertAction(title: "Cancel", style: UIAlertAction.Style.cancel)
    alertController.addAction(cancelAction)

    alertController.addAction(okAction)

    self.present(alertController, animated: true, completion: nil)
}
0
Keshu R. 6 ene. 2020 a las 12:50

Ese es el comportamiento predeterminado. Una vez que se muestra la ventana emergente por primera vez. La solicitud posterior se tratará como rechazada o lo que se seleccione en la primera selección. Sin embargo, puede implementar su propia alerta y enviar al usuario directamente a la aplicación de configuración para otorgar acceso a la ubicación como se muestra a continuación:

//check if user has denied the access on first popup
    if !permissionGranted {

        let permissionAlert = UIAlertController(title: "Location Access", message: "Requires location access to take advantage of this feature. Please provide location access from settings", preferredStyle: .alert)

        let cancelAction = UIAlertAction(title: "Cancel", style: .default, handler: nil)
        let settingAction = UIAlertAction(title: "Settings", style: .default) { (action) in
            guard let appSettingURl = URL(string: UIApplicationOpenSettingsURLString) else { return }
            if UIApplication.shared.canOpenURL(appSettingURl) {
                UIApplication.shared.open(appSettingURl, options: [:], completionHandler: nil)
            }
        }
        permissionAlert.addAction(cancelAction)
        permissionAlert.addAction(settingAction)
        present(permissionAlert, animated: true, completion: nil)
    }
0
kathayatnk 13 sep. 2018 a las 10:39