El cuadro de diálogo de permiso de ubicación actual desaparece demasiado rápido

Mi aplicación toma la ubicación del usuario, obtiene las coordenadas y proporciona una distancia hacia o desde su destino u origen. Todos estos destinos posibles se muestran en una vista de tabla, de modo que obtengo las coordenadas de los usuarios al mismo tiempo que llenando la tabla. Lo único es que la vista de alerta que pregunta por la ubicación de los usuarios aparece y desaparece tan rápido que es imposible hacer clic en ella.

¿Hay alguna manera de presentar esta alerta manualmente cuando la aplicación se carga por primera vez? Intenté obtener la ubicación del usuario cuando la aplicación se carga para intentar forzar la alerta, pero eso no funcionó.

Si bien es difícil de rastrear, la solución para esto es bastante simple.

A través de muchas pruebas y errores, descubrí que mientras el cuadro de diálogo de acceso a la ubicación aparece cuando intenta acceder a cualquier servicio de ubicación en la aplicación por primera vez, el diálogo desaparece por sí mismo (sin interacción del usuario) si se CLLocationManager objeto CLLocationManager antes de que el usuario responda al diálogo.

Estaba creando una instancia CLLocationManager en mi método viewDidLoad . Como esta era una instancia local del método, ARC soltó la instancia después de que el método se completara. Tan pronto como se lanzó la instancia, el cuadro de diálogo desapareció. La solución fue bastante simple. Cambie la instancia CLLocationManager de ser una variable de nivel de método para ser una variable de instancia de nivel de clase. Ahora la instancia de CLLocationManager solo se lanza una vez que la clase está descargada.

Mismo síntoma, causa diferente: no llame a startUpdatingLocation más de una vez en una fila .

Había estructurado accidentalmente cosas tales que el código involuntariamente llamaba a startUpdatingLocation dos veces seguidas, lo que aparentemente es malo. También podría haber tenido algo que ver con la elección de la cola, ya que estaba esperando para comenzar a actualizar pendiente el resultado de una solicitud de red, pero no tuve que hacer ninguna magia GCD para solucionarlo … solo necesitaba asegurarme de que no repitió el comienzo.

Espero que alguien pueda beneficiarse de mi dolor. 🙂

Caigo en el mismo problema (al menos por los síntomas). En mi caso, el problema estaba en la aplicación - (void)applicationWillResignActive:(UIApplication *)application; método, donde estaba lanzando mi instancia CLLocationManager como parte de la preparación para la transición de fondo. Cuando lo - (void)applicationDidEnterBackground:(UIApplication *)application; y lo dejé solo en - (void)applicationDidEnterBackground:(UIApplication *)application; el problema se ha ido.
La parte engañosa es que Core Location alert DO suspende su aplicación mientras aún está en primer plano.
Espero que te ayude, me tomó mucho tiempo encontrar a ese bastardo 🙂

Sé que esta es una respuesta muy tardía. Pero puede ayudar a alguien. También enfrenté el mismo problema y pasé una hora para identificar el problema. Al principio mi código era así.

 CLLocationManager *locationManager = [[CLLocationManager alloc] init]; [locationManager startUpdatingLocation]; CLLocation *location = locationManager.location; //my stuff with the location [locationManager release]; 

Ahora la alerta de ubicación desapareció rápidamente. Cuando elimino el comentario de la última línea, funciona correctamente.

  // [locationManager release]; 

También encontré este problema, pero la solución en mi caso resultó ser completamente diferente a la respuesta aceptada.

En mi aplicación, estaba llamando a stopUpdatingLocation desde applicationWillResignActive . Esto fue un problema porque se llama a applicationWillResignActive cuando aparece el cuadro de diálogo de permisos. Esto estaba causando stopUpdatingLocation inmediatamente después de startUpdatingLocation , por lo que el cuadro de diálogo desaparecería inmediatamente.

La solución fue simplemente llamar a stopUpdatingLocation desde applicationDidEnterBackground lugar.

Esto me estaba pasando mientras usaba el simulador de iOS. Decidí que estaba ocurriendo porque mi Esquema de ejecución estaba simulando una ubicación. Creo que esto tiene el mismo efecto que llamar a locationManager.startUpdatingLocation() en el momento del lanzamiento, por lo que estaba cerrando el diálogo.

Quitar la marca de la checkbox “Permitir simulación de ubicación” en el cuadro de diálogo Editar esquemas solucionó el problema. Una vez que funciona como usted lo desea y se establece el permiso, puede volver a habilitar la simulación de ubicación y el simulador funcionará bien a partir de ese momento.

Swift 4 y iOS 11 :

Asegúrese de haber agregado líneas de privacidad (tanto siempre como cuando sea ) a su archivo .plist y agregue CoreLocation Framework a su proyecto

El cuadro de diálogo de permiso de ubicación aparece correctamente cuando he cambiado:

 locationManager.requestAlwaysAuthorization() 

con:

 locationManager.requestWhenInUseAuthorization() 

PD : He intentado TODOS los consejos y todos viewDidLoad (solicitud de autorización para viewDidLoad , var lugar de let para locationManager, no inicie startUpdatingLocation() después de la solicitud … Creo que es un error y espero que lo resuelvan tan pronto como sea posible..

La solución SWIFT 4 @Zoli se verá así:

 class WhateverViewController: UIViewController { let locationManager = CLLocationManager() // here is the point of the @Zoli answer // some code override func viewDidLoad() { super.viewDidLoad() // some other code locationManager.requestWhenInUseAuthorization() // some other code } } 

usted define más la variable locationManager como un objeto global.

 @interface ViewController : UIViewController { CLLocationManager *locationManager; } @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; CLLocationManager *locationManager = [[CLLocationManager alloc] init]; [locationManager startUpdatingLocation]; } 

Me encontré con la misma situación tuya.

  • Mi solución fue cambiada de variable local a instancia de miembro.
  • La causa fue que la instancia local no era válida después de que se finalizó el método, que incluye la variable local (de extender mi LocationManager)
  • Mi entorno: Xcode9.3.1

 #importar 
 @interface ViewController ()

 @fin

 @implementation ViewController
 @synthesize locManager;  // después
 - (void) viewDidLoad {
     [super viewDidLoad];
     // Haga cualquier configuración adicional después de cargar la vista, generalmente desde un plumín.

     // MyLocationService * locManager = [[BSNLocationService alloc] init: nil];  // antes de.  el loc.  delegado no funcionó porque la instancia se volvió inválida después de este método.
     self-> locManager = [[MyLocationService alloc] init: nil];  // después
     locManager.startService;
 }