manager corelocation ios gps mapkit core-location

ios - corelocation - Error de CLError.DeferredFailed(código de kCLErrorDomain=11) Actualizaciones de GPS diferidas que fallan



locationmanager ios (3)

iOS 9.2, Xcode 7.2, ARC habilitado

El problema probablemente esté asociado con la distancia y el intervalo de tiempo que ha elegido para su aplazamiento. Intente aprovechar CLLocationDistanceMax y CLTimeIntervalMax para solucionar los problemas de la llamada a la función. Por ejemplo, establezca la distancia a CLLocationDistanceMax y luego varíe el intervalo de tiempo, luego pruebe al revés.

Pero hay otras cosas que veo que tal vez quieras cambiar ...

  1. Deshágase de la CLLocationManager.deferredLocationUpdatesAvailable() == true en las sentencias if para permitir las actualizaciones de ubicación diferida.
  2. Las actualizaciones diferidas estaban disponibles iOS6.0 +, la mayoría de los iPhone 4S se pueden actualizar a iOS7.2.1 dependiendo del hardware. No necesita llamar por separado a _locationManager.startUpdatingLocation() .
  3. Asegúrese de que si está probando en iOS9.0 + tiene las allowsBackgroundLocationUpdates configuradas para el administrador de ubicación.
  4. Asegúrese de que el _locationManager.startUpdatingLocation() inicial esté hecho en el - (void)applicationWillResignActive:(UIApplication *)application método de - (void)applicationWillResignActive:(UIApplication *)application equivalente en Swift y NO en el - (void)applicationDidEnterBackground:(UIApplication *)application método de - (void)applicationDidEnterBackground:(UIApplication *)application .
  5. Asegúrese de estar llamando _locationManager.allowDeferredLocationUpdatesUntilTraveled(C_GPS.ACTIVITY_UPDATE_DISTANCE, timeout: C_GPS.ACTIVITY_UPDATE_TIME) en el equivalente del - (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations método de - (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations para Swift .

Además, tenga en cuenta que está imprimiendo el error antes de verificar si el error existe, esto podría generar informes incorrectos de errores.

Espero que esto ayude y que no sea demasiado tarde. Aclamaciones.

PD: si esto no funciona, publique más de su código, es decir, dónde está llamando a estas funciones en relación con la aplicación. delegar * .m archivo.

Tengo una aplicación que realiza actualizaciones periódicas de ubicación para mapear la ruta de los usuarios.

Estoy usando actualizaciones diferidas.

if (CLLocationManager.deferredLocationUpdatesAvailable() == true && _isDeferingUpdates == false) { print("Doing refresh") _isDeferingUpdates = true _locationManager.allowDeferredLocationUpdatesUntilTraveled(C_GPS.ACTIVITY_UPDATE_DISTANCE, timeout: C_GPS.ACTIVITY_UPDATE_TIME) } else { print("Could not refresh") // iPhone 4S does not have deferring so must keep it always on _locationManager.startUpdatingLocation() }

Cuando la aplicación está abierta recibo la llamada "hacer actualización" cada segundo.

Mi configuración:

Tener las 2 claves en mi pList NSLocationWhenInUseUsageDescription && NSLocationAlwaysUsageDescription

Ha activado los modos en segundo plano para notificaciones remotas y actualizaciones de ubicación.

Haga que los Mapas se configuren para usar Bicicletas y Peatones.

Tener todos los permisos en mi teléfono configurado a sí.

¿Conoces alguna otra razón por la cual mi actualización diferida está fallando cuando mi aplicación se queda en segundo plano?

Nunca funciona y la documentación de las manzanas no es útil

DeferredFailed El administrador de la ubicación no ingresó al modo diferido por un motivo desconocido. Este error puede ocurrir si el GPS no está disponible, no está activo o se interrumpe temporalmente. Si obtiene este error en un dispositivo que tiene hardware de GPS, la solución es intentarlo de nuevo.

Aquí está mi controlador de errores:

func locationManager(manager: CLLocationManager, didFinishDeferredUpdatesWithError error: NSError?) { print("FINISHED BACKGROUND UPDATE with error /(error)") if (error != nil) { print("ERROR IS VALID as CLError") if (error!.code == CLError.LocationUnknown.rawValue) { print("Error: Location Unknown") } else if (error!.code == CLError.DeferredAccuracyTooLow.rawValue) { print("Error: Accuracy too low") } else if (error!.code == CLError.DeferredFailed.rawValue) { print("Error: Deferring Failed") } else if (error!.code == CLError.Denied.rawValue) { print("Error: Denied") } else { print("Error not handled") } } _isDeferingUpdates = false }


El error fue engañoso. El problema es que el 4S no admite actualizaciones de fondo. Como tal, para el 4S estaba revisando manualmente las actualizaciones de esta manera:

private func refreshUpdateDeferral() { if (CLLocationManager.deferredLocationUpdatesAvailable() == false && _isDeferingUpdates == false) { print("Doing deferred referral refresh") _isDeferingUpdates = true _locationManager.allowDeferredLocationUpdatesUntilTraveled(C_GPS.ACTIVITY_UPDATE_DISTANCE, timeout: C_GPS.ACTIVITY_UPDATE_TIME) } }

El problema era que tenía CLLocationManager.deferredLocationUpdatesAvailable() == true que significaba que estaba aplazando las actualizaciones cuando el aplazamiento ya estaba permitido. Esto parece causar el error anterior.

Por lo tanto, si obtiene este error, compruebe que no está allowDeferredLocationUpdatesUntilTraveled mientras que allowDeferredLocationUpdatesUntilTraveled ya está activo.


Puede tener problemas con las actualizaciones diferidas si su precisión y filtro de distancia no están configurados correctamente. Suponiendo que su dispositivo sea compatible con actualizaciones diferidas (CLLocationManager.deferredLocationUpdatesAvailable), primero debe configurar su administrador de ubicación de la siguiente manera:

desiredAccuracy = kCLLocationAccuracyBest distanceFilter = kCLDistanceFilterNone

Luego puede iniciar el administrador de ubicación y permitir actualizaciones diferidas.