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 ...
- Deshágase de la
CLLocationManager.deferredLocationUpdatesAvailable() == true
en las sentencias if para permitir las actualizaciones de ubicación diferida. - 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()
. - Asegúrese de que si está probando en iOS9.0 + tiene las
allowsBackgroundLocationUpdates
configuradas para el administrador de ubicación. - 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
. - 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.