SignificantLocationChanges no funciona desde iOS 8

Tengo un problema con SignificantLocationChanges desde el lanzamiento de iOS 8. El método

 [locationManager startMonitoringSignificantLocationChanges]; 

se llama correctamente después de verificar la disponibilidad, los delegates también funcionan bien (lo didChangeAuthorizationStatus con el método didChangeAuthorizationStatus , que forma parte del mismo delegado y object) y el comstackdor no tiene dudas, pero no hay absolutamente ninguna actualización y ningún error de didFailWithError método. El logging dice que el estado de autorización es 4, lo cual está bien, creo.

Antes de iOS 8, todo funciona bien.

El primer dispositivo de testing (iPad 2 con 3G) ejecuta iOS 7.1.2 el segundo (iPhone 5) 8.0.2, cuando uso el método startUpdatingLocation normal startUpdatingLocation actualizaciones inmediatamente. Pero SignificantLocationChanges sería mucho mejor para mi trabajo. ¿Alguien tiene una idea de dónde podría ser el error?

En iOS 8, debe solicitar la autorización con el tipo "Siempre" para permitir que su aplicación use ubicaciones significativas.

Agregue una nueva fila en su file -Info.plist con la key NSLocationAlwaysUsageDescription introduzca la descripción de la imagen aquí

Luego solicite autorización si todavía no lo ha solicitado.

 - (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status { if (status == kCLAuthorizationStatusNotDetermined && [manager respondsToSelector:@selector(requestAlwaysAuthorization)]) { [manager requestAlwaysAuthorization]; } } 

Estoy teniendo problemas con startMonitoringSignificantLocationChanges también …

[self.locationManager requestWhenInUseAuthorization]; la [self.locationManager requestWhenInUseAuthorization]; y agregó la cadena NSLocationWhenInUseUsageDescription al file Plist.

Cuando ejecuto mi aplicación todo funciona, se didChangeAuthorizationStatus método delegado didChangeAuthorizationStatus , pero no hubo actividad en los didUpdateLocation o didFailWithError .

¡Pero cuando cambio a startUpdatingLocation , por arte de magia funciona! Pero necesito que startMonitoringSignificantLocationChanges funcione porque no quiero que mi aplicación consum batería para un evento que no necesito.

¡¡ACTUALIZAR!! ¡Problema resuelto!

¡Oh, veo por qué no funciona ahora! La nueva reference de SDK aquí en este enlace dice;

"Debe llamar a este método o al método requestAlwaysAuthorization antes de usar los services de location. Si el usuario otorga la autorización" cuando está en uso "a su aplicación, su aplicación puede comenzar la mayoría (pero no todos) de los services de location mientras está en primer plano (Las aplicaciones no pueden usar ningún service que relanza automáticamente la aplicación, como la supervisión de la región o el service de cambio de location significativo). "

Por lo tanto, no es posible usar startMonitoringSignificantLocationChanges con [self.locationManager requestWhenInUseAuthorization]; método. ¡Tienes que usar requestAlwaysAuthorization en requestAlwaysAuthorization lugar!

¿Te has acordado de llamar al método?

 -requestAlwaysAuthorization (or -requestWhenInUseAuthorization) 

en su CLLocationManager? Este es un nuevo método en iOS 8, y es obligatorio llamar antes de comenzar las actualizaciones de location.

Además, verifique si está asignando y llamando -startUpdatingLocation en el hilo principal. No estoy seguro de eso, pero creo que llamarlo en un hilo diferente podría causar problemas.