ios core-location core-motion apple-m7

ios - Actualizaciones de CoreMotion en estado de fondo



core-location core-motion (5)

Lo que noté al apagar el GPS, la aplicación no ejecutará ningún código en el fondo para iOS 7, la aplicación se ve como en estado inactivo. Por lo tanto, mejor al pasar a segundo plano use startMonitoringSignificantLocationChanges y también obtenga actualizaciones de su administrador de ubicación. Significa que simultenoulsy usa el servicio startUpdatingLocation en el cambio de estado del usuario y startMonitoringSignificantLocationChanges en el fondo.

Entonces, cuando el usuario startMonitoringSignificantLocationChanges el GPS, mientras usaba startMonitoringSignificantLocationChanges su aplicación recibirá

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations

Es mejor comprobar aquí en el fondo mismo qué es lo que falla con CoreMotion Framework. Y trata de reiniciarlo. Debido a que sin el dispositivo de chip M7 puedo leer la lectura del acelerómetro en tal caso.

Con el chip M7 en los últimos dispositivos iOS, se puede recibir una notificación programática a medida que el usuario pasa de estar fijo a correr, caminar, etc. usando CMMotionActivityManager. Stava y Runkeeper lo han usado para pausar automáticamente el sondeo del GPS (apagar la antena del GPS) cuando detecta que el usuario no se está moviendo a través del M7, y luego volver a habilitar las actualizaciones del GPS una vez que se están moviendo nuevamente. Es capaz de hacer esto mientras la aplicación está en el estado de fondo, que es la clave aquí.

El problema que encuentro al duplicar esta funcionalidad es que si desactivo las actualizaciones de GPS mientras mi aplicación está en segundo plano, dejo de recibir actualizaciones de actividad y ya no puedo detectar cuando el usuario se mueve nuevamente a través del M7 para volver a encender el GPS.

Si dejo el GPS funcionando todo el tiempo, seguiré recibiendo actualizaciones de movimiento de Core Motion todo el tiempo que la aplicación esté en segundo plano.

Supongo que no están jugando al ruido blanco o algún otro truco barato para mantenerse activo. ¿Cómo hicieron esto?


Primero, verifica si has configurado el comportamiento en segundo plano de tu aplicación.

Vaya a la sección de capacidades de destino y revise el modo de fondo para las actualizaciones de ubicación.


RunKeeper realmente usa el truco de audio para mantenerse despierto. Si abre el paquete de la aplicación y comprueba su Info.plist, verá que se registra para el modo de audio de fondo. Así es como obtienen notificaciones de audio periódicas de su distancia, velocidad y ritmo. También es la forma en que permanecen despiertos durante la carrera mientras se minimiza el consumo de la batería.

Si notaste que el ícono de Servicios de ubicación (el triángulo en la barra de estado) desaparece por completo mientras usas RunKeeper, definitivamente no están usando ningún tipo de seguimiento de ubicación para lograr la ejecución en segundo plano. Incluso la activación de geo-vallas y el monitoreo significativo del cambio de ubicación causaría que aparezca el ícono de Servicios de localización.

Tampoco están usando el M7 para mantenerse despiertos porque no funciona de esa manera. Una actualización de las API de CoreMotion relacionadas con M7 no activará su aplicación. Cuando la aplicación se active, podrán consultar la actividad del movimiento y el historial de pasos y quizás intentar calcular algo, pero dudo que sea tan preciso.

Finalmente, debe tener en cuenta que las API de Pausa automática se introdujeron en iOS 6 antes del lanzamiento del iPhone 5s y el chip M7. Son conceptos ortogonales.


Si su administrador de ubicación está trabajando en el modo activo, para habilitar el modo de fondo, debe hacer estos tres pasos:

  1. Verifique que [Target / Capabilities / Background Modes / Location updates] esté habilitado.
  2. [locationManager requestAlwaysAuthorization];
  3. locationManager.allowsBackgroundLocationUpdates = YES;

has considerado experimentar con

application:performFetchWithCompletionHandler:

en el delegado de la aplicación? No puede controlar la frecuencia con que se llama, pero dependiendo de la aplicación, puede ser cada ~ 15 minutos. A continuación, puede iniciar CMMotionActivityManager desde allí para consultar los resultados de M7.

No está del todo claro qué funcionalidad estás tratando de replicar, pero el chip M7 registra toda la actividad, independientemente de si tu aplicación se está ejecutando. Por lo tanto, puede realizar consultas en segundo plano y actualizar totales de pasos o totales de tipo de actividad.