¿Qué pueden hacer exactamente las aplicaciones CoreBluetooth en segundo plano?


El sujeto lo dice todo, realmente. 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 Bluetooth mientras están inactivos, pero ¿qué eventos exactos se entregan y no se entregan?

Por ejemplo:

  1. ¿Puedo mantener comunicaciones con un dispositivo con el que ya he establecido un emparejamiento?
  2. Puedo emitir solicitudes de detección periódicas para encontrar dispositivos que están fuera de alcance / nunca he visto antes? (Por ejemplo, si quería ser capaz de entregar una notificación cuando se encuentra un nuevo dispositivo interesante)
  3. ¿Qué pasa si un dispositivo sale del alcance y luego regresa? ¿Obtendré eventos desconectados y conectados sin la intervención del usuario, o tendré que estar en primer plano y hacer que el usuario solicite explícitamente la reconexión?
Author: Chris Smowton, 2012-03-27

4 answers

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

Cuando se ejecuta en primer plano, puede iniciar un análisis utilizando CBCentralManager::scanForPeripheralsWithServices. Su escaneo puede ser restringido a dispositivos que anuncian un servicio en particular, o sin restricciones (pase nil para el parámetro de esa llamada). También puede permitir o no permitir duplicados; en el primer caso, usted obtendrá un didDiscoverPeripheral devolución de llamada cada vez que el iPhone recibe un paquete de publicidad; en este último solo obtendrá una devolución de llamada por dispositivo encontrado.

Cuando se introduce el 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 estaba restringido (es decir, especificó uno o más UUID de servicio que estaba buscando), su escaneo continuará ejecutar, pero la bandera permitir duplicados será ignorada. Esto significa que ahora solo obtendrá devoluciones de llamada didDiscoverPeripheral para nuevos dispositivos . Si todos los dispositivos fueron vistos en primer plano, no recibirá devoluciones de llamada en absoluto.
  • Iniciar y detener el escaneo no restablece qué dispositivos se consideran nuevos. Si hay un dispositivo presente, solo obtendrá una devolución de llamada única, incluso a través de múltiples exploraciones, a menos que...
  • Si conecta a un device, then disconnect, then scan again, the device will be enumerated again (i.e. you will get one more call to didDiscoverPeripheral). Supongo que iOS considera que como haber "mostrado interés" en el dispositivo.

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

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

 119
Author: Chris Smowton,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-04-10 20:48:36

Además de la respuesta de Chris:

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

Así que cuando desea 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 ser el "backgrounding evento" de WWDC 2012 Core Bluetooth videos https://developer.apple.com/videos/wwdc/2012 / Pero el primero parece un hack, no quiero confiar en él.

Probé esto en iPhone5, iOS6.1.4


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

Core Bluetooth Procesamiento en segundo plano para Aplicaciones iOS

 8
Author: mash,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-08-12 14:42:12

También es bueno observar el comportamiento de backgrounding y CoreBluetooth relacionado con los iBeacons, aunque a Apple le gusta pensar en esto como una funcionalidad de CoreLocation:

  1. Cuando las notificaciones para una región de 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á activada o desactivada. 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 es tan obvio: Si usas la API iBeacon ranging, entonces tu aplicación tiene que estar en primer plano. No dice explícitamente esto en la documentación in de hecho, uno puede ser engañado al pensar que el rango debería funcionar en el fondo de la documentación. Sin embargo, un ingeniero de Apple aclara esto en un post enterrado en algún lugar en un largo hilo en el foro de desarrolladores de Apple, y he visto esto fallar también. El rango solo funcionará en primer plano.

  3. Uno puede descubrir otros servicios que se anuncian por un iBeacons publicidad periférica. Pero esto funcionará solo en primer plano. Así que si desea que la central sea notificada de la proximidad utilizando iBeacons, y luego hacer algunas otras transacciones utilizando otros servicios basados en BLE, esto funcionará, pero solo en primer plano. No funcionará en segundo plano. Para las transacciones con servicios basados en BLE en segundo plano, el anuncio tiene que 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 BLE-services en segundo plano. (Me hubiera gustado mucho que esto funcionara, pero no hay dados).

 7
Author: user108,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-10-18 20:08:55

Acabo de aprender el modo de fondo para dispositivos BLE en iOS8. 3 y 8.4 y he encontrado algunas diferencias desde arriba:

  1. Si comienzo

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

De

- (void)applicationDidEnterBackground:(UIApplication *)application

He encontrado que la enumeración devuelve el mismo dispositivo cada llamada con diferente RSSI, tan CBCentralManagerScanOptionAllowDuplicateskey no es ignorado.

  1. Si la aplicación está en primer plano, descubrió el dispositivo BLE 50 veces en segundo. 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 1time en sec.
 4
Author: Igor Vlasov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-07-14 07:02:35