ubicación ubicacion servicios servicio segundo puedo plano localizacion google desde desactivar activar ios core-location

ios - ubicacion - servicio de ubicación de google



¿Cómo puedo solicitarle al usuario que active los servicios de ubicación después de que el usuario haya denegado su uso? (10)

AlertViews están en desuso en iOS 8. Ahora hay una mejor manera de manejar alertas usando el nuevo AlertController:

UIAlertController *alertController = [UIAlertController alertControllerWithTitle:NSLocalizedString( @"Enter your title here", @"" ) message:NSLocalizedString( @"Enter your message here.", @"" ) preferredStyle:UIAlertControllerStyleAlert]; UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:NSLocalizedString( @"Cancel", @"" ) style:UIAlertActionStyleCancel handler:nil]; UIAlertAction *settingsAction = [UIAlertAction actionWithTitle:NSLocalizedString( @"Settings", @"" ) style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) { [[UIApplication sharedApplication] openURL:[NSURL URLWithString: UIApplicationOpenSettingsURLString]]; }]; [alertController addAction:cancelAction]; [alertController addAction:settingsAction]; [self presentViewController:alertController animated:YES completion:nil];

Tengo una aplicación con una interacción explícita del usuario que hace uso de la ubicación actual del usuario. Si el usuario niega el acceso a los servicios de ubicación, aún me gustaría utilizarlo posteriormente para solicitar al usuario que acceda a la configuración y vuelva a habilitar los servicios de ubicación para mi aplicación.

El comportamiento que quiero es el de la aplicación integrada de Mapas:

  1. Restablezca las advertencias de ubicación en Configuración> General> Restablecer> Restablecer advertencias de ubicación.
  2. Inicie la aplicación Mapas.
  3. Presiona el botón Ubicación actual en la esquina inferior izquierda.
  4. Las solicitudes de mapas con "" Maps "desearían usar su ubicación actual" | "No permitir" | "Permitir".
  5. Elija la opción "No permitir".
  6. Toque el botón Ubicación actual en la esquina inferior izquierda nuevamente.
  7. Mapas solicitan "Activar servicios de ubicación para permitir que" Maps "determine su ubicación" | "Configuraciones" | "Cancelar".

En mi propia aplicación, el mismo flujo básico da como resultado que el método CLLocationManagerDelegate -locationManager: didFailWithError: se invoque con un error kCLErrorDenied en el paso final y el usuario no tiene la opción de abrir la aplicación de configuración para corregirlo.

Podría mostrar mi propia alerta en respuesta al error, pero no tendría la capacidad de iniciar la aplicación de Configuración, como la alerta que el sistema operativo puede proporcionar, tal como lo utiliza la aplicación de mapas incorporada.

¿Hay algo en la clase CLLocationManager que me falta que pueda darme este comportamiento?


Aquí está la implementación rápida 3 del código provisto por Markus y bjc.

let alertController = UIAlertController(title: NSLocalizedString("Enter your title here", comment: ""), message: NSLocalizedString("Enter your message here.", comment: ""), preferredStyle: .alert) let cancelAction = UIAlertAction(title: NSLocalizedString("Cancel", comment: ""), style: .cancel, handler: nil) let settingsAction = UIAlertAction(title: NSLocalizedString("Settings", comment: ""), style: .default) { (UIAlertAction) in UIApplication.shared.openURL(NSURL(string: UIApplicationOpenSettingsURLString)! as URL) } alertController.addAction(cancelAction) alertController.addAction(settingsAction) self.present(alertController, animated: true, completion: nil)


Aquí hay una versión Swift del código en la respuesta de Markus. Este código crea una alerta que le da al usuario la opción de abrir Configuración.

let alertController = UIAlertController(title: NSLocalizedString("Enter your title here", comment: ""), message: NSLocalizedString("Enter your message here.", comment: ""), preferredStyle: .Alert) let cancelAction = UIAlertAction(title: NSLocalizedString("Cancel", comment: ""), style: .Cancel, handler: nil) let settingsAction = UIAlertAction(title: NSLocalizedString("Settings", comment: ""), style: .Default) { (UIAlertAction) in UIApplication.sharedApplication().openURL(NSURL(string: UIApplicationOpenSettingsURLString)!) } alertController.addAction(cancelAction) alertController.addAction(settingsAction) self.presentViewController(alertController, animated: true, completion: nil)


Con iOS8, finalmente puedes vincular al usuario a la aplicación de Configuración a través de openURL. Por ejemplo, puede crear un UIAlertView con un solo botón que lleve al usuario a la aplicación Configuración:

UIAlertView *alert = [[UIAlertView alloc] initWithTitle:ICLocalizedString(@"LocationServicesPermissionTitle") message:ICLocalizedString(@"LocationPermissionGeoFenceMessage") delegate:self cancelButtonTitle:@"Settings" otherButtonTitles:nil]; [alert show];

En tu delegado de UIAlertView:

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex { [alertView dismissWithClickedButtonIndex:buttonIndex animated:YES]; [[UIApplication sharedApplication] openURL: [NSURL URLWithString: UIApplicationOpenSettingsURLString]]; }


De acuerdo con los documentos de Apple en el método locationServicesEnabled .

El usuario puede habilitar o deshabilitar servicios de ubicación desde la aplicación Configuración al alternar el interruptor Servicios de ubicación en General.

Debe verificar el valor de retorno de este método antes de comenzar las actualizaciones de ubicación para determinar si el usuario tiene servicios de ubicación habilitados para el dispositivo actual. Si este método devuelve NO e inicia actualizaciones de ubicación de todos modos, el marco de Ubicación principal le solicita al usuario que confirme si los servicios de ubicación deberían volver a habilitarse.

Entonces, ¿no puede simplemente iniciar las actualizaciones de los servicios de ubicación de alguna manera para provocar que se le solicite la alerta?


En Swift 4, hay una actualización en su sintaxis.

Swift 4

extension UIAlertController { func createSettingsAlertController(title: String, message: String) { let alertController = UIAlertController(title: title, message: message, preferredStyle: .alert) let cancelAction = UIAlertAction(title: NSLocalizedString("Cancel", comment: ""), style: .cancel, handler: nil) let settingsAction = UIAlertAction(title: NSLocalizedString("Settings", comment: ""), style: .default) { (UIAlertAction) in UIApplication.shared.open(URL(string: UIApplicationOpenSettingsURLString)! as URL, options: [:], completionHandler: nil) } alertController.addAction(cancelAction) alertController.addAction(settingsAction) self.present(alertController, animated: true, completion: nil) } }


Extensión de Swift 3 para crear configuraciones de controlador de alertas:

Importar Fundación

extension UIAlertController { func createSettingsAlertController(title: String, message: String) -> UIAlertController { let controller = UIAlertController(title: title, message: message, preferredStyle: .alert) let cancelAction = UIAlertAction(title: NSLocalizedString("Cancel", comment:"" ), style: .cancel, handler: nil) let settingsAction = UIAlertAction(title: NSLocalizedString("Settings", comment:"" ), style: .default, handler: { action in UIApplication.shared.openURL(URL(string: UIApplicationOpenSettingsURLString)!) }) controller.addAction(cancelAction) controller.addAction(settingsAction) return controller } }


Supongo que tendrá una respuesta a su pregunta cuando Apple piense en un nuevo SDK. En este momento y hasta donde yo sé, no es posible:

No hay URL-Handler disponible
No hay un método utilizable para llamar

Pero ... Como Maps lo hace, esto PUEDE hacerse, pero probablemente usando una API privada. Si no tiene miedo con este tipo de codificación, debe buscar allí en mi opinión.


Actualizar:

A partir de iOS 8, ahora existe la UIApplicationOpenSettingsURLString constante que representa una URL que, cuando se abre, abre la aplicación de configuración a la configuración de la aplicación (donde el usuario puede volver a habilitar los servicios de ubicación).

Original:

No hay forma de que hagas esto. Su única opción real es mostrar una alerta que informe al usuario de que su aplicación requiere servicios de ubicación e instruirlos para que accedan manualmente a la aplicación Configuración y la activen.


Swift ,

Una vez que deshabilite los servicios de ubicación para una aplicación, los métodos de delegado del administrador de ubicación comenzarán a mostrar el error. Entonces, al recibir el error, podemos verificar si los servicios de localización están habilitados / deshabilitados. Y de acuerdo con el resultado, podemos pedirle al usuario que vaya a la configuración y active los servicios de ubicación.

En su administrador de ubicación delegue el método para el error, agregue la verificación de permiso de ubicación

func locationManager(manager: CLLocationManager!, didFailWithError error: NSError!) { DispatchQueue.main.asyncAfter(deadline: .now() + 0.4) { //check location permissions self.checkLocationPermission() } }

Código para verificar el permiso de ubicación

//check location services enabled or not func checkLocationPermission() { if CLLocationManager.locationServicesEnabled() { switch(CLLocationManager.authorizationStatus()) { case .notDetermined, .restricted, .denied: //open setting app when location services are disabled openSettingApp(message:NSLocalizedString("please.enable.location.services.to.continue.using.the.app", comment: "")) case .authorizedAlways, .authorizedWhenInUse: print("Access") } } else { print("Location services are not enabled") openSettingApp(message:NSLocalizedString("please.enable.location.services.to.continue.using.the.app", comment: "")) } }

Código para abrir la aplicación de configuración,

//open location settings for app func openSettingApp(message: String) { let alertController = UIAlertController (title: APP_NAME_TITLE, message:message , preferredStyle: .alert) let settingsAction = UIAlertAction(title: NSLocalizedString("settings", comment: ""), style: .default) { (_) -> Void in guard let settingsUrl = URL(string: UIApplicationOpenSettingsURLString) else { return } if UIApplication.shared.canOpenURL(settingsUrl) { UIApplication.shared.open(settingsUrl, options: [:], completionHandler: nil) } } alertController.addAction(settingsAction) let cancelAction = UIAlertAction(title: NSLocalizedString("cancel", comment: ""), style: .default, handler: nil) alertController.addAction(cancelAction) present(alertController, animated: true, completion: nil) }