ubicación ubicacion segun puedo localizacion exacta desactivar como buscar actual activar ios swift location ios9 swift3

ubicacion - Compruebe si los servicios de ubicación están habilitados



no puedo activar localizacion iphone (9)

Agregue CLLocationManagerDelegate a la herencia de su clase y luego puede hacer esta comprobación:

Versión Swift 1.x - 2.x:

if CLLocationManager.locationServicesEnabled() { switch CLLocationManager.authorizationStatus() { case .NotDetermined, .Restricted, .Denied: print("No access") case .AuthorizedAlways, .AuthorizedWhenInUse: print("Access") } } else { print("Location services are not enabled") }

Versión Swift 4.x:

if CLLocationManager.locationServicesEnabled() { switch CLLocationManager.authorizationStatus() { case .notDetermined, .restricted, .denied: print("No access") case .authorizedAlways, .authorizedWhenInUse: print("Access") } } else { print("Location services are not enabled") }

He estado investigando sobre CoreLocation. Recientemente, encontré un problema que se ha cubierto en otro lugar, pero en Objective C y para iOS 8.

Me siento un poco tonto preguntando esto, pero ¿cómo puede verificar si los servicios de ubicación están habilitados con Swift en iOS 9?

En iOS 7 (¿y quizás 8?) Podría usar locationServicesEnabled() , pero eso no parece funcionar al compilar para iOS 9.

Entonces, ¿cómo podría lograr esto?

¡Gracias!


Aquí está el formato que Apple recomienda.

switch CLLocationManager.authorizationStatus() { case .notDetermined: // Request when-in-use authorization initially break case .restricted, .denied: // Disable location features break case .authorizedWhenInUse, .authorizedAlways: // Enable location features break } }

Aquí hay un ejemplo completo.

Esto incluye un AlertView con un botón para llevar al usuario a la pantalla de Settings si previamente se le negó el acceso.

import CoreLocation let locationManager = CLLocationManager() class SettingsTableViewController:CLLocationManagerDelegate{ func checkUsersLocationServicesAuthorization(){ /// Check if user has authorized Total Plus to use Location Services if CLLocationManager.locationServicesEnabled() { switch CLLocationManager.authorizationStatus() { case .notDetermined: // Request when-in-use authorization initially // This is the first and the ONLY time you will be able to ask the user for permission self.locationManager.delegate = self locationManager.requestWhenInUseAuthorization() break case .restricted, .denied: // Disable location features switchAutoTaxDetection.isOn = false let alert = UIAlertController(title: "Allow Location Access", message: “MyApp needs access to your location. Turn on Location Services in your device settings.", preferredStyle: UIAlertController.Style.alert) // Button to Open Settings alert.addAction(UIAlertAction(title: "Settings", style: UIAlertAction.Style.default, handler: { action in guard let settingsUrl = URL(string: UIApplication.openSettingsURLString) else { return } if UIApplication.shared.canOpenURL(settingsUrl) { UIApplication.shared.open(settingsUrl, completionHandler: { (success) in print("Settings opened: /(success)") }) } })) alert.addAction(UIAlertAction(title: "Ok", style: UIAlertAction.Style.default, handler: nil)) self.present(alert, animated: true, completion: nil) break case .authorizedWhenInUse, .authorizedAlways: // Enable features that require location services here. print("Full Access") break } } } }


Cuando llame a -startLocation, si el usuario denegó los servicios de ubicación, el delegado del administrador de ubicación recibirá una llamada a - locationManager:didFailWithError : con el código de error kCLErrorDenied . Esto funciona tanto en todas las versiones de iOS.


En el objetivo-c

debe realizar un seguimiento del usuario ya denegado o no determinado y luego solicitar permiso o enviar al usuario a la aplicación Configuración.

-(void)askEnableLocationService { BOOL showAlertSetting = false; BOOL showInitLocation = false; if ([CLLocationManager locationServicesEnabled]) { switch ([CLLocationManager authorizationStatus]) { case kCLAuthorizationStatusDenied: showAlertSetting = true; NSLog(@"HH: kCLAuthorizationStatusDenied"); break; case kCLAuthorizationStatusRestricted: showAlertSetting = true; NSLog(@"HH: kCLAuthorizationStatusRestricted"); break; case kCLAuthorizationStatusAuthorizedAlways: showInitLocation = true; NSLog(@"HH: kCLAuthorizationStatusAuthorizedAlways"); break; case kCLAuthorizationStatusAuthorizedWhenInUse: showInitLocation = true; NSLog(@"HH: kCLAuthorizationStatusAuthorizedWhenInUse"); break; case kCLAuthorizationStatusNotDetermined: showInitLocation = true; NSLog(@"HH: kCLAuthorizationStatusNotDetermined"); break; default: break; } } else { showAlertSetting = true; NSLog(@"HH: locationServicesDisabled"); } if (showAlertSetting) { UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:nil message:@"Please enable location service for this app in ALLOW LOCATION ACCESS: Always, Go to Setting?" delegate:self cancelButtonTitle:@"No" otherButtonTitles:@"Open Setting", nil]; alertView.tag = 199; [alertView show]; } if (showInitLocation) { [self initLocationManager]; } }

Implemente alertView Delegate y luego envíe al usuario para habilitar el servicio de ubicación si ya lo niega el usuario.

-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex { if (alertView.tag == 199) { if (buttonIndex == 1) { [[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]]; } return; } }

Administrador de ubicación de Init

-(void)initLocationManager{ self.locationManager = [[CLLocationManager alloc] init]; if([self.locationManager respondsToSelector:@selector(requestAlwaysAuthorization)]) { [self.locationManager requestAlwaysAuthorization]; } }

Tenga en cuenta kCLAuthorizationStatusAuthorizedAlways y kCLAuthorizationStatusAuthorizedWhenInUse es la diferencia.


Es solo una función de 2 líneas en Swift 4:

import CoreLocation static func isLocationPermissionGranted() -> Bool { guard CLLocationManager.locationServicesEnabled() else { return false } return [.authorizedAlways, .authorizedWhenInUse].contains(CLLocationManager.authorizationStatus()) }


Para solicitar permiso para los servicios de ubicación que utiliza:

yourSharedLocationManager.requestWhenInUseAuthorization()

Si el estado no está determinado actualmente, se mostrará una alerta solicitando al usuario que permita el acceso. Si se deniega el acceso, se notificará a su aplicación en CLLocationManagerDelegate, del mismo modo, si se deniega el permiso en algún momento, se lo actualizará aquí.

Hay dos estados separados que debe verificar para determinar los permisos actuales.

  • Si el usuario tiene habilitados o no los servicios de ubicación general

CLLocationManager.locationServicesEnabled()

  • Si el usuario ha otorgado el permiso correcto para su aplicación ...

CLLocationManager.authorizationStatus() == .authorizedWhenInUse

Podría agregar una extensión es una opción útil:

extension CLLocationManager { static func authorizedToRequestLocation() -> Bool { return CLLocationManager.locationServicesEnabled() && (CLLocationManager.authorizationStatus() == .authorizedAlways || CLLocationManager.authorizationStatus() == .authorizedWhenInUse) }

}

Aquí se accede cuando el usuario ha solicitado instrucciones por primera vez:

private func requestUserLocation() { //when status is not determined this method runs to request location access locationManager.requestWhenInUseAuthorization() if CLLocationManager.authorizedToRequestLocation() { //have accuracy set to best for navigation - accuracy is not guaranteed it ''does it''s best'' locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation //find out current location, using this one time request location will start the location services and then stop once have the location within the desired accuracy - locationManager.requestLocation() } else { //show alert for no location permission showAlertNoLocation(locationError: .invalidPermissions) } }

Aquí está el delegado:

func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) { if !CLLocationManager.authorizedToRequestLocation() { showAlertNoLocation(locationError: .invalidPermissions) } }


Para swift3.0 y superior, si se realizan verificaciones frecuentes de la disponibilidad de los servicios de ubicación, cree una clase como la siguiente,

import CoreLocation open class Reachability { class func isLocationServiceEnabled() -> Bool { if CLLocationManager.locationServicesEnabled() { switch(CLLocationManager.authorizationStatus()) { case .notDetermined, .restricted, .denied: return false case .authorizedAlways, .authorizedWhenInUse: return true default: print("Something wrong with Location services") return false } } else { print("Location services are not enabled") return false } } }

y luego úsalo así en tu VC

if Reachability.isLocationServiceEnabled() == true { // Do what you want to do. } else { //You could show an alert like this. let alertController = UIAlertController(title: "Location Services Disabled", message: "Please enable location services for this app.", preferredStyle: .alert) let OKAction = UIAlertAction(title: "OK", style: .default, handler: nil) alertController.addAction(OKAction) OperationQueue.main.addOperation { self.present(alertController, animated: true, completion:nil) } }


En Swift 3.0

if (CLLocationManager.locationServicesEnabled()) { locationManager.delegate = self locationManager.desiredAccuracy = kCLLocationAccuracyBest if ((UIDevice.current.systemVersion as NSString).floatValue >= 8) { locationManager.requestWhenInUseAuthorization() } locationManager.startUpdatingLocation() } else { #if debug println("Location services are not enabled"); #endif }


SWIFT (a partir del 24 de julio de 2018)

if CLLocationManager.locationServicesEnabled() { }

esto le dirá si el usuario ya ha seleccionado una configuración para la solicitud de permiso de ubicación de la aplicación