when usage tutorial startupdatinglocation manager example description current cllocationmanagerdelegate ios objective-c cllocationmanager

ios - usage - CLLocationManager startUpdatingLocation no llama a locationManager: didUpdateLocations: o locationManager: didFailWithError:



startupdatinglocation swift (7)

Con iOS 8.0 debe llamar -[CLLocationManager requestWhenInUseAuthorization ] o -[CLLocationManager requestAlwaysAuthorization] primero para que se le pida al usuario que dé permiso a su aplicación para usar la ubicación.

CLLocationManager utilizar el marco CLLocationManager en mi proyecto de iOS para acceder a la ubicación del usuario, pero cuando llamo

[locationManager startUpdatingLocation]

ni locationManager:didUpdateLocations: o locationManager:didFailWithError: están llamando.

//myViewController.h @interface myViewController : UITableViewController <CLLocationManagerDelegate> @end //myViewController.m @implementation myViewController{ CLLocationManager *locationManager; } //edit - (void)viewDidLoad { [super viewDidLoad]; locationManager = [[CLLocationManager alloc] init]; } //finish edit -(void)getLocation { locationManager.delegate = self; locationManager.desiredAccuracy = kCLLocationAccuracyBest; [locationManager startUpdatingLocation]; } - (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error { UIAlertView *errorAlert = [[UIAlertView alloc] initWithTitle:@"Error" message:@"Failed to Get Your Location" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; [errorAlert show]; } - (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations { CLLocation *newLocation = locations[[locations count] -1]; CLLocation *currentLocation = newLocation; NSString *longitude = [NSString stringWithFormat:@"%.8f", currentLocation.coordinate.longitude]; NSString *latitude = [NSString stringWithFormat:@"%.8f", currentLocation.coordinate.latitude]; if (currentLocation != nil) { NSLog(@"latitude: %@", latitude); NSLog(@"longitude: @"%@", longitude); }else { UIAlertView *errorAlert = [[UIAlertView alloc] initWithTitle:@"Error" message:@"Failed to Get Your Location" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; [errorAlert show]; } } @end

Ninguno de los dos métodos se llama a pesar de lo que dice en la documentación:

"Este método regresa inmediatamente. Llamar a este método hace que el administrador de ubicación obtenga una corrección de ubicación inicial (que puede llevar varios segundos) y notificar a su delegado llamando a su locationManager:didUpdateLocations: method [...] Además de la implementación de su objeto delegado el método locationManager:didUpdateLocations: también debe implementar el método locationManager:didFailWithError: para responder a posibles errores ".

No sé cómo solucionar el problema.

Gracias,

JA



Es necesario que compruebe que inicialice CLLocationManager en el hilo principal. En otro caso, no obtendrá el evento updateLocation.

No puedo encontrar esa información en los documentos de Apple, pero de todos modos me funciona.


Los servicios de ubicación funcionan de forma un poco diferente a partir de iOS 8.

Principalmente, debe agregar una clave NSLocationWhenInUseUsageDescription a su archivo Info.plist y agregar una descripción de por qué su aplicación necesita la ubicación, como "Ubicación necesaria para ...".

Tenga en cuenta que es posible que también deba verificar la versión de iOS. Solo iOS 8 y versiones superiores tienen el Administrador de ubicaciones para escuchar la requestWhenInUseAuthorization llamada de requestWhenInUseAuthorization .

El siguiente enlace muestra más detalles: http://nevan.net/2014/09/core-location-manager-changes-in-ios-8/

¡Buena suerte!


Necesita agregar cosas a continuación a su proyecto,

  1. En la lista de su proyecto, agregue estas cosas:

    1. Key: NSLocationAlwaysUsageDescription Type:String
    2. Key: NSLocationWhenInUseUsageDescription Type:String
  2. En el archivo .m con [locationManager startUpdatingLocation] agregue esta condición:

    if([locationManager respondsToSelector:@selector(requestAlwaysAuthorization)]) [locationManager requestAlwaysAuthorization];`

Entonces solo se CLLocationManager sus métodos de delegado CLLocationManager .


Solo agregue esto en info.plist

NSLocationAlwaysUsageDescription --- Necesito ubicación

NSLocationWhenInUseUsageDescription --- Necesito ubicación

privacidad - descripción del uso de la ubicación --- Necesito ubicación

locationManager = [[CLLocationManager alloc] init]; locationManager.delegate=self; locationManager.desiredAccuracy=kCLLocationAccuracyBest; locationManager.distanceFilter=kCLDistanceFilterNone; [locationManager requestWhenInUseAuthorization]; [locationManager startMonitoringSignificantLocationChanges]; [locationManager startUpdatingLocation];

Ahora llamará a su didUpdateToLocation definitivamente.

para más detalles haga clic aquí


Tenía lo siguiente en mi base de código:

-(void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status { if( status == kCLAuthorizationStatusAuthorizedAlways ) { _locationManager = [[CLLocationManager alloc] init]; _locationManager.delegate = self; _locationManager.desiredAccuracy = kCLLocationAccuracyBest; _locationManager.distanceFilter = 200; } }

Resulta que esto fue llamado en un bucle infinito, porque la inicialización de un locationManager desencadena este método por alguna razón? No me había dado cuenta de eso. Lo puse allí para atrapar cuando se otorgaron los permisos. En cambio, configuré un administrador de ubicación y comencé a actualizar la ubicación, pero luego esto disparó y lo reemplacé por uno que no estaba actualizando la ubicación, y seguí repitiendo bucles una y otra vez.

La solución para mí fue simplemente agregar && !_locationManager a la condición if.