iphone solicita permiso de location actual nuevamente

Caso: para la location actual, el usuario seleccionó "No permitir" en la installation de la aplicación, ¿hay alguna forma de volver a preguntar por la location del usuario y activar la alerta nativa de iPhone para la location actual?

He visto algunas publicaciones en stackoverflow pero hay antiguas, ¿hay una solución ahora para llamar a un nuevo sdk o alguien encontró una forma,

Post referido: CLLocation pide nuevamente permiso

Lamentablemente, no puedes hacerlo. Una cosa que puede hacer es solicitar al usuario que cambie la configuration de location.

if (![CLLocationManager locationServicesEnabled]) { UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Location Service Disabled" message:@"To re-enable, please go to Settings and turn on Location Service for this app." delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; [alert show]; } 

en ios8, Apple introdujo una constante UIApplicationOpenSettingsURLString que es la location de la vista de "configuraciones" del dispositivo.

puede codificar lo siguiente (en swift) para dirigir al usuario a la vista de configuration:

 switch CLLocationManager.authorizationStatus() { case .AuthorizedWhenInUse, .Restricted, .Denied: let alertController = UIAlertController( title: "Background Location Access Disabled", message: "In order to be notified, please open this app's settings and set location access to 'Always'.", prefernetworkingStyle: .Alert) let cancelAction = UIAlertAction(title: "Cancel", style: .Cancel, handler: nil) alertController.addAction(cancelAction) let openAction = UIAlertAction(title: "Open Settings", style: .Default) { (action) in if let url = NSURL(string:UIApplicationOpenSettingsURLString) { UIApplication.shanetworkingApplication().openURL(url) } } alertController.addAction(openAction) self.presentViewController(alertController, animated: true, completion: nil) } 

Parece que la respuesta aceptada no es completamente cierta. [CLLocationManager locationServicesEnabled] comtesting si los services de location están habilitados, como se describe en la documentation.

Devuelve un valor boolean que indica si los services de location están habilitados en el dispositivo. El usuario puede habilitar o deshabilitar los services de location desde la aplicación Configuración cambiando el conmutador de Servicios de location en General. Debe verificar el valor de retorno de este método antes de comenzar las actualizaciones de location para determinar si el usuario tiene services de location habilitados para el dispositivo actual. Los services de location solicitan a los usuarios la primera vez que intentan usar información relacionada con la location en una aplicación, pero no solicitan bashs posteriores. Si el usuario niega el uso de services de location e intenta iniciar actualizaciones de location de todos modos, el administrador de la location notifica un error a su delegado.

Si desea verificar si se le da permiso al usuario para usar su location, debe verificar [CLLocationManager authorizationStatus] . Si el estado de su aplicación es kCLAuthorizationStatusDenied , significa que el usuario denegó explícitamente su aplicación cuando solicitó el permiso. Puede usar esto e informar al usuario en consecuencia.

No creo que haya otra forma de pedir permiso de location. Pero si realmente necesita la location del usuario, puede mostrar una alerta que les indique que la habiliten desde la configuration.

Esto es lo que hice considerando las respuestas anteriores: (esto está en MonoTouch C # pero fácilmente traducible a Swift u Obj-C)

Lo siguiente pide permiso y luego procede a la actualización de location si se otorga. De lo contrario, la próxima vez que el usuario vendrá; si los services de location están deshabilitados o denegados, se mostrará un post para solicitar el permiso / activación con una networkingirección a la configuration

 //Location Manager (foreground) CLLocationManager locMgr = new CLLocationManager(); locMgr.PausesLocationUpdatesAutomatically = false; if (UIDevice.CurrentDevice.CheckSystemVersion(8, 0)) { locMgr.RequestWhenInUseAuthorization(); } if (CLLocationManager.LocationServicesEnabled && CLLocationManager.Status == CLAuthorizationStatus.AuthorizedWhenInUse) { //set the desinetworking accuracy, in meters locMgr.DesinetworkingAccuracy = 150; locMgr.LocationsUpdated += (object sender, CLLocationsUpdatedEventArgs e) => { Console.WriteLine(e.Locations); }; locMgr.StartUpdatingLocation(); } else if (!CLLocationManager.LocationServicesEnabled || CLLocationManager.Status == CLAuthorizationStatus.Denied) { var alert = UIAlertController.Create(NSBundle.MainBundle.LocalizedString("Location access", "Location access"), NSBundle.MainBundle.LocalizedString("Please check location", "To show your position on the map, you have to enable location services and authorize the app"), UIAlertControllerStyle.Alert); alert.AddAction(UIAlertAction.Create("Ok", UIAlertActionStyle.Cancel, null)); if (UIDevice.CurrentDevice.CheckSystemVersion(8, 0)) { alert.AddAction(UIAlertAction.Create(NSBundle.MainBundle.LocalizedString("Go to settings", "Go to settings"), UIAlertActionStyle.Default, delegate { var url = new NSUrl(UIApplication.OpenSettingsUrlString); UIApplication.ShanetworkingApplication.OpenUrl(url); })); } PresentViewController(alert, true, null); }