pantalla - recuperar notificaciones iphone
Núcleo Bluetooth y fondo: ¿Detección de un dispositivo y activación de una acción, incluso después de estar días en modo de fondo? (3)
He escrito una aplicación que necesita informarse cuando un determinado dispositivo Bluetooth de bajo consumo de energía está dentro del alcance. Si el dispositivo BLE se nota, mi aplicación solo almacena una marca de tiempo.
Como se indica en los videos de WWDC 2012 Core Bluetooth, hay dos posibilidades para las aplicaciones para actuar en modo de fondo cuando se trabaja con Core Bluetooth:
Antecedentes del evento
El fondo de eventos es probablemente lo que la mayoría de las aplicaciones utilizarán al interactuar con dispositivos Bluetooth de bajo consumo. Este modo no permite comunicaciones directas con el accesorio cuando la aplicación está en segundo plano, pero proporciona una notificación del accesorio cuando desea comunicarse con la aplicación. iOS se mantendrá conectado al accesorio BTLE cuando su aplicación esté en segundo plano y continuará monitoreando las notificaciones. Cuando el accesorio BTLE conectado tenga una notificación disponible, iOS notificará al usuario que le gustaría hablar con su aplicación, lo que le permite cargar su aplicación e interactuar con el accesorio. Como muchos dispositivos necesitan ahorrar energía, solo proporcionar información en momentos deterministas mejorará en gran medida la duración de la batería del accesorio y el iPhone 4S.
- No se requieren entradas info.plist para este modo.
Antecedentes de la sesión
En ocasiones, una aplicación debe interactuar con un accesorio, incluso si se ejecuta en segundo plano. Considere una aplicación en ejecución que necesite monitorear la frecuencia cardíaca en tiempo real. Hay un claro inicio y parada de este modelo. El usuario COMIENZA su ejecución en la aplicación. Mientras la ejecución está activa, la aplicación lee la información del ritmo cardíaco hasta que la ejecución se completa o se DETIENE. Los antecedentes de la sesión también permiten el escaneo y la conexión a los accesorios BTLE mientras la aplicación está en segundo plano. Una llamada a scanForPeripheralsWithServices o connectPeripheral continuará, incluso cuando la aplicación esté en segundo plano. CoreBluetooth continuará monitoreando los periféricos o periféricos específicos que coincidan con los servicios que su aplicación está buscando y llamará a su delegado de aplicaciones cuando se encuentre o se conecte. Tenga en cuenta que cada vez que un periférico BTLE o iPhone 4S usa su radio, está agotando la energía disponible de los dispositivos respectivos. Los desarrolladores de aplicaciones que utilizan una formación de fondo basada en la sesión deben tener en cuenta el uso de energía.
- La preparación de los antecedentes de la sesión requiere una entrada en modo de segundo plano para UIBackgroundModes, bluetooth-central, en su aplicación info.plist.
Hasta ahora, tengo una sesión en segundo plano (con la entrada correspondiente info.plist). La aplicación le pide a iOS que recupere todos los dispositivos conocidos y luego le da el comando de conexión al dispositivo que estoy buscando. La devolución de llamada de la conexión se produce incluso después de unos minutos después de que mi aplicación fuera activada.
Pero: la aplicación se suspende después de, digamos, una hora. Esto significa que la próxima vez que el usuario inicie mi aplicación, no podrá saber si ha habido algún avistamiento del dispositivo BLE de interés.
Entonces, mi pregunta es: ¿es posible que mi aplicación reciba una notificación sin la interacción del usuario incluso días después de enviarla a un segundo plano cuando un determinado dispositivo BLE está dentro del alcance para que pueda almacenar mi marca de tiempo?
No, iOS no garantiza que tu aplicación se mantenga viva en el fondo. Los docs dicen:
Sin embargo, este método puede invocarse en situaciones en las que la aplicación se ejecuta en segundo plano (no se suspende) y el sistema debe finalizarla por algún motivo.
(Documentación de la applicationWillTerminate )
Usar IOS7 BLE Conservación y restauración del estado
Si su aplicación es terminada por IOS, debido a la presión de la memoria (es por esto que su aplicación no puede funcionar después de días), ya no puede manejar delegados de bluetooth. En este caso, si usó la Conservación y restauración del estado, su aplicación se puede volver a iniciar en segundo plano para que se ejecute de nuevo, también por solo 10 segundos. Después de 10s, se movería al estado suspendido. Solo en esta situación, el willRestoreState de CBCentralManager se puede activar.
Buena suerte.
A partir de iOS 7, su caso de uso ahora es fácil de soportar. Antes de iOS 7, su aplicación podría registrarse para recibir notificaciones sobre ese periférico, y se activaría en segundo plano cuando el sistema tuviera que entregar una notificación. Sin embargo, si el sistema se encontraba bajo presión de memoria mientras su aplicación estaba en segundo plano o se reiniciaba, no se reiniciaría. iOS 7 agregó la restauración de estado a CBCentralManager
y CBPeripheralManager
, por lo que ahora el sistema operativo relanzará su aplicación en una capacidad limitada incluso si no se estaba ejecutando debido a cualquiera de las condiciones mencionadas anteriormente. Consulte la guía CoreBluetooth para más información.
En resumen, para su caso de uso, podría hacer lo siguiente:
- Continúe
bluetooth-central
como modo de ejecución en segundo plano. - Opte por la conservación y restauración del estado, como se documenta here en "Cómo agregar soporte para la conservación y restauración del estado".