2010-09-17 14 views
20

No recibo ninguna devolución de llamada de ubicación en SIM o dispositivo. Tengo este código que se llama:¿Por qué no se llama a mi delegado de CLLocationmanager?

- (void)startLocationCallbacks: (NSObject*) ignore 
{ 
    locationManager.delegate = self; 
    locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation; 
    locationManager.distanceFilter = MINIMUM_METERS; 

    [locationManager startUpdatingLocation]; 
    NSLog(@"[DEBUG] [locationManager startUpdatingLocation] (%@, %@)", locationManager, locationManager.delegate); 
} 

y log declaraciones en la parte superior de ambos

- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error 

y

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation 

pero ni declaración de registro cada vez se vuelve a llamar. Las notificaciones de ubicación están habilitadas para mi aplicación (como se muestra en Configuración, además, dije "permitir")

¿Cuáles son algunas de las posibles razones por las que no recibo actualizaciones de ubicación?

Config/Otros Info:

  • he asignado locationManager, y lo ha guardado en una propiedad de retener.
  • he llamado startUpdatingLocation
  • estoy usando 4.1 SDK
  • El problema es tanto Sim & iPod touch (2ª generación) & iPhone-3, todos corriendo 4.1
  • Ubicación notificaciones se les permite en mi aplicación (tanto como se indica en Configuración y porque hice clic en "permitir" en la alerta.)
  • He utilizado CLLocationManager con éxito antes (en muchas aplicaciones de envío!) Este es un verdadero tirador de pelo para mí.

Gracias!

+0

NOTA: He visto varios otros preguntas SO similares, no ayudaron. Todo el "encienda su wifi", "no use sim", etc., la cosa no se aplica, aquí. No es que yo sepa, de todos modos. Espero encontrar una lista de todas las razones por las que no reciba las devoluciones de llamadas, así que puedo marcarlas. ¡Gracias! – Olie

+0

¿Ha intentado probar si el delegado recibe una notificación? Ejecute '[locationManager.delegate locationManager: locationManager didUpdateToLocation: newLocation fromLocation: oldLocation];' Si al ejecutar esto obtiene la notificación de su delegado como se esperaba, significa que sus dispositivos no pueden obtener una ubicación. Si el delegado no recibe una notificación, puede significar un error en su código con el objeto delegado o un error en el SDK (muy, muy improbable). – vfn

+2

Otra pista: apagué las notificaciones de ubicación en Configuraciones, tratando de que me preguntara nuevamente. Sin preguntar Además, no hay error de "usuario denegado" (didFailWithError: ...) Es realmente como si mi gestor de ubicación simplemente no estuviera generando chispas. O no reconocerme como el delegado. Cuando inspecciono locationManager.delegate, es lo correcto. Grr, murmurar, refunfuñar! – Olie

Respuesta

46

Whew! Ok, lo encontré.

Resulta que una de las maneras de hacer que un CLLocationManager no active las devoluciones de llamadas de ubicación es hacer toda la configuración en no-el-hilo principal. Cuando moví mi rutina de configuración a performSelectorOnMainThread, todo funcionó exactamente como se esperaba.

¡Qué pesadilla!

Esperanza esta respuesta ayuda a los demás ...

Editar/aclaración:

Originalmente, tenía algo como esto:

- (BOOL) appDidFinishLaunchingWithOptions: (NSDictionary*) options 
{ 
    // ...[app setup, snip] 
    [NSThread detachNewThreadSelector: @selector(postLaunchSetupThread) toTarget: self withObject: nil]; 
} 

- (void)postLaunchSetupThread 
{ 
    NSAutoreleasePool *pool = [NSAutoreleasePool new]; 
    // ...[other setup, snip] 
    [self setupLocationManager]; 
    [pool release]; 
} 

- (void)setupLocationManager 
{ 
    self.myLocationManager = [[[CLLocationManager alloc] init] autorelease]; 
    [myLocationManager startLocationUpdates]; 
} 

Pero llamar setupLocationManager en un hilo impedido que las devoluciones de llamada . Así que mi solución era mover la línea

[self setupLocationManager]; 

cabo del hilo y de nuevo en appDidFinishLaunchingWithOptions

+4

Gracias por esto, me salvó horas de locura tratando de resolverlo. CLLocationManager de hecho no le gusta ser creado fuera del hilo principal. – lxt

+3

¡Me estaba volviendo loca tratando de resolver esto! ¡Muchas gracias! – Motasim

+1

¡Eres un salvavidas! Pasé todo el día tirando de mis pelos en este ... ¡Gracias! –

15

En realidad se puede ejecutar desde otro hilo también. De la documentación de Apple:

Configuration of your location manager object must always occur on a thread with an active run loop, such as your application’s main thread.

Sólo asegúrese de que el bucle de ejecución se está ejecutando en ese hilo, y los eventos que se envían CLLocationManager. Más sobre bucle de ejecución: https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Multithreading/RunLoopManagement/RunLoopManagement.html

+0

Verdadero (+1), debería haberlo mencionado en mi respuesta, pero el punto es: no se puede configurar el administrador de la ubicación es un hilo no en ejecución y se espera que realice devoluciones de llamadas. Las soluciones incluyen (a) no configurarlo en un subproceso separado y (b) asegurarse de que se ejecute el runloop de su subproceso independiente. – Olie

+3

He intentado hacer que esto funcione en un subproceso con un ciclo de ejecución en ejecución y los métodos de delegado aún no se invocaron. ¿Puedes proporcionar una implementación de ejemplo de trabajo? –

1

Para iOS 8

1) Coloqué estas líneas justo después de iniciar el administrador de ubicación.

if([self.locationManager respondsToSelector:@selector(requestAlwaysAuthorization)]) { 
    [self.locationManager requestAlwaysAuthorization]; 
} 

2) que añade a la NSLocationAlwaysUsageDescription plist y la pusieron en una cadena y añade un mensaje. 3) En mi objetivo, he hecho clic en la pestaña Capacidades, y luego se volvió de Modes Antecedentes y marcó "actualizaciones de ubicación" y "usos accesorios Bluetooth LE"

Esto funcionó para mí

0

En mi caso fue porque de mi dispositivo no pudo determinar la ubicación: mientras permanecía en el interior, la señal de GPS no estaba disponible y el wi-fi también se desconectó, por lo que el administrador de ubicación simplemente no pudo recibir datos de ubicación y nunca se llamó al delegado.

Una vez que he conectado a internet wi-fi funcionó (supongo moviendo al aire libre también debería hacer el truco en ese caso, pero a veces no es una forma muy conveniente :))

Cuestiones relacionadas