¿Cómo trabajar con la ubicación diferida iOS 6?

Intento utilizar la nueva característica iOS 6 de actualizaciones de ubicación diferidas, pero continúo recibiendo este error:

didFinishDeferredUpdatesWithError: dominio de error = kCLErrorDomain Code = 11 “La operación no se pudo completar. (kCLErrorDomain error 11.)”

Estoy usando el siguiente código:

- (DeviceAPI *) init { locationManager = [[CLLocationManager alloc] init]; [locationManager setDelegate:self]; [locationManager setDesiredAccuracy:kCLLocationAccuracyBest]; [locationManager startUpdatingLocation]; [locationManager allowDeferredLocationUpdatesUntilTraveled:(CLLocationDistance)100000 timeout:(NSTimeInterval)100000]; return self; } 

Y esta función de callback :

 - (void)locationManager: (CLLocationManager *) manager didFinishDeferredUpdatesWithError:(NSError *)error { NSLog(@"didFinishDeferredUpdatesWithError :%@", [error description]); } 

¿Alguna ayuda?

De acuerdo con los foros de desarrolladores de Apple para iOS 6.0 SDK, las actualizaciones de ubicación diferida solo están disponibles:

  • en el hardware del iPhone 5
  • ejecutando iOS 6.0 o superior
  • precisión deseada establecida en kCLLocationAccuracyBest
  • llamar al método “startUpdatingLocation”
  • esperar a que las actualizaciones de ubicación entren aproximadamente a 1 por segundo
  • luego comience a diferir las actualizaciones

Ver: https://devforums.apple.com/message/751974#751974

Parece que necesita hardware de iPhone 5 y espera a que las actualizaciones de ubicación entren a 1Hz.

Además, como se menciona otro póster, necesitarás implementar el método locationManager: didUpdateLocations: en tu delegado.

¿Estableciste la ubicación en tu campo info.plist UIBackgroundModes?

En mis pruebas, he encontrado que las actualizaciones diferidas solo funcionan en iOS 6.0.1 o superior, pero no en 6.0. Probé en 2 teléfonos 1 que actualicé y 1 que dejé usando 6.0 por razones de prueba. Creo que esta es la razón por la cual el simulador no funciona y si su teléfono aún no está actualizado, es probable que eso tampoco funcione.

También asegúrate de implementar

– locationManager: didUpdateLocations:

en lugar de la ahora obsoleta

– locationManager: didUpdateToLocation: fromLocation:

como se requiere para el uso con actualizaciones de ubicación diferida.

Antes de llamar a allowDeferredLocationUpdatesUntilTraveled: timeout: configure el filtro de distancia en kCLDistanceFilterNone, luego funcionará.

Encontré esta descripción en una muestra de Framework para la llamada [CLRegion initCircularRegionWithCenter]:

“Si el radio de la superposición es demasiado grande, el registro falla automáticamente, así que fije el radio al valor máximo”.