¿Qué pueden hacer exactamente las aplicaciones CoreBluetooth mientras están en segundo plano?

78

El sujeto lo dice todo, de verdad. La documentación, en la medida en que exista, sugiere que las aplicaciones escritas en el marco CoreBluetooth que se ejecutan en dispositivos iOS pueden agregar "bluetooth-central" a su lista de privilegios en segundo plano y así procesar algún tipo de eventos de Bluetooth mientras están inactivos, pero qué eventos exactos hacen y no se entregan?

Por ejemplo:

  1. ¿Puedo mantener comunicaciones con un dispositivo con el que ya establecí un emparejamiento?
  2. ¿Puedo emitir solicitudes de descubrimiento periódicas para encontrar dispositivos que están fuera de alcance o que nunca antes había visto? (Por ejemplo, si quisiera poder enviar una notificación cuando se encuentre un nuevo dispositivo interesante)
  3. ¿Qué pasa si un dispositivo se sale del alcance y luego regresa? ¿Me desconectaré y conectaré eventos sin la intervención del usuario, o tendré que estar en primer plano y hacer que el usuario solicite explícitamente la reconexión?
Chris Smowton
fuente

Respuestas:

120

Nadie parecía saberlo, así que compré una cuenta de desarrollador de iOS y realicé algunos experimentos. Esto es lo que encontré:

Cuando se ejecuta en primer plano, puede iniciar un escaneo usando CBCentralManager :: scanForPeripheralsWithServices. Su escaneo puede estar restringido a dispositivos que anuncian un servicio en particular, o no restringido (pase nulo para el parámetro de esa llamada). También puede permitir o no permitir duplicados ; en el primer caso, recibirá una devolución de llamada didDiscoverPeripheral cada vez que el iPhone reciba paquetes de publicidad; en el último, solo obtendrá una devolución de llamada por dispositivo encontrado.

Cuando ingresa al fondo, las reglas parecen ser las siguientes:

  • Si estaba ejecutando un análisis sin restricciones , se cancelará silenciosamente. No recibirá ninguna devolución de llamada didDiscover.
  • Si su escaneo fue restringido (es decir, especificó uno o más UUID de servicio que estaba buscando), su escaneo continuará ejecutándose, pero se ignorará la marca de permitir duplicados . Esto significa que ahora solo obtendrá devoluciones de llamada didDiscoverPeripheral para dispositivos nuevos . Si todos los dispositivos se vieron mientras estaban en primer plano, no recibirá ninguna devolución de llamada.
  • Iniciar y detener la exploración no restablece qué dispositivos se consideran nuevos. Si hay un dispositivo presente, solo recibirá una única devolución de llamada, incluso en varios escaneos, a menos que ...
  • Si se conecta a un dispositivo, luego se desconecta y luego vuelve a escanear , el dispositivo se enumerará nuevamente (es decir, recibirá una llamada más a didDiscoverPeripheral). Supongo que iOS considera que "ha mostrado interés" en el dispositivo.

No sé si los intentos de conexión a dispositivos no conectables (por ejemplo, anunciantes BLE, como los que implementan el perfil de proximidad) son lo suficientemente buenos, ya que mis dispositivos de ejemplo son conectables. Sin embargo, al menos para dispositivos conectables, este procedimiento de escaneo / conexión / desconexión / escaneo es suficiente para sondear la presencia de un dispositivo en segundo plano.

Los resultados anteriores se recopilaron utilizando un iPhone 4S con iOS 5.0.1

Chris Smowton
fuente
2
Hola Chris. ¡Interesante! Aunque no entiendo una cosa. ¿Puede el proceso seguir ejecutándose en segundo plano si se comunica con un diseño Bluetooth? (Por ejemplo, ¿podría conectar un monitor de frecuencia cardíaca y luego mover la aplicación al fondo y esperar que siga funcionando?)
Ben
2
Hola Ben. No seguirá ejecutándose como lo hace en primer plano, pero seguirá ejecutándose cuando ocurran eventos de Bluetooth del tipo que describo anteriormente. Un problema que he encontrado es que incluso en esta situación, cuando no hay interacción del usuario durante un tiempo, el teléfono se pone en reposo y la aplicación deja de ser invocada. He solucionado esto registrándome (falsamente) como una aplicación de audio, lo que evita la suspensión; Sin embargo, esto es obviamente inadmisible para la tienda de aplicaciones.
Chris Smowton
Hola Chris. Buena publicación. Su último comentario niega la declaración de esta publicación: lists.apple.com/archives/bluetooth-dev/2011/Dec/msg00007.html Esta no es una buena noticia. ¿Crees que se trata de un error real en la implementación? ¿Ha configurado una conexión a un dispositivo? ¿Puede confirmar que las notificaciones de actualización de valor también se detienen? Gracias.
allprog
1
@ChrisSmowton Sé que ya no tienes un dispositivo iOS. Pero, ¿tiene una idea de cómo diferenciar entre iOS que ignora un duplicado y que iOS no encuentra un periférico?
shreyashirday
3
Si no lo ha visto desde la última vez que se conectó a él, no está allí. Si lo ha visto, la única forma que conozco de volver a descubrirlo cuando está en segundo plano es intentar una conexión.
Chris Smowton
9

Además de la respuesta de Chris:

  • Si su aplicación tiene el modo de fondo "bluetooth-central" y está conectada a un periférico, puede recibir notificaciones ( peripheral:didUpdateValueForCharacteristic:error:) del periférico en segundo plano, incluso después de 10 minutos.

Entonces, cuando desee ejecutar continuamente en segundo plano, tiene 2 opciones:

  • Ejecute el bucle "conectar, desconectar, escanear de nuevo"
  • Hacer que el periférico envíe notificaciones

Más tarde debería aparecer el "Fondo de eventos" de los videos de Bluetooth Core de la WWDC 2012 https://developer.apple.com/videos/wwdc/2012/ Pero el primero parece un truco, no quiero depender de él.

Probé esto en iPhone5, iOS6.1.4


Apple finalmente lanzó la Guía de programación de Core Bluetooth y aquí está la nota oficial sobre

Procesamiento básico de Bluetooth en segundo plano para aplicaciones iOS

mezcla
fuente
7

También es bueno tener en cuenta el comportamiento del fondo y CoreBluetooth relacionados con los iBeacons, aunque a Apple le gusta pensar en esto como una funcionalidad de CoreLocation:

  1. Cuando las notificaciones para una región iBeacon están activadas, notificarán al usuario la entrada o salida de la región. Estas notificaciones pueden depender de si la pantalla está encendida o apagada. Estas notificaciones funcionarán incluso cuando la aplicación que solicita notificaciones esté en segundo plano. (Esto está claro en la documentación).

  2. No tan obvio: si usa la API de rango iBeacon, entonces su aplicación debe estar en primer plano. No dice esto explícitamente en la documentación; de hecho, uno puede inducir a error al pensar que el rango debería funcionar en el fondo de la documentación. Sin embargo, un ingeniero de Apple aclara esto en una publicación enterrada en algún lugar de un largo hilo en el foro de desarrolladores de Apple, y también he visto que esto falla. El rango funcionará solo en primer plano.

  3. Se pueden descubrir otros servicios que se anuncian mediante una publicidad periférica iBeacons. Pero esto funcionará solo en primer plano. Entonces, si desea que la central sea notificada de la proximidad usando iBeacons, y luego realice otras transacciones usando otros servicios basados ​​en BLE, esto funcionará, pero solo en primer plano. No funcionará en segundo plano. Para transacciones con servicios basados ​​en BLE en segundo plano, el anuncio debe ser un anuncio BLE normal, no un iBeacon. No puede usar un anuncio de iBeacon para ayudar al proceso de descubrimiento en segundo plano y luego cambiar a usar los servicios BLE en segundo plano. (Me hubiera gustado mucho que esto funcionara, pero sin dados).

usuario108
fuente
4

Acabo de aprender el modo en segundo plano para dispositivos BLE en iOS8.3 y 8.4 y he encontrado algunas diferencias con respecto a los anteriores:

  1. si empiezo

    [centralManager scanForPeripheralsWithServices: @ [[CBUUID UUIDWithString: kServiceUUID]] opciones: @ {CBCentralManagerScanOptionAllowDuplicatesKey: @YES}];

desde

- (void)applicationDidEnterBackground:(UIApplication *)application

Encontré que la enumeración devuelve el mismo dispositivo en cada llamada con diferente RSSI, por lo que CBCentralManagerScanOptionAllowDuplicatesKey no se ignora.

  1. Si la aplicación está en primer plano, descubrió el dispositivo BLE 50 veces en segundos. Si la aplicación está en segundo plano pero la pantalla del teléfono está activa, la aplicación descubrió dispositivos BLE 6 veces en segundos. Si la pantalla del teléfono está bloqueada, la aplicación descubrió dispositivos BLE 1 vez en seg.
Igor Vlasov
fuente
1
Es bueno saberlo, parece que han mejorado la pila desde que lo
usé