objective-c - requestwheninuseauthorization - location when in use usage description
El cuadro de diálogo de permiso de ubicación actual desaparece demasiado rápido (9)
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..
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ó.
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 :)
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 casilla de verificación "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.
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
}
}
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. :)
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];
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.
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.
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];
}