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
Además de la respuesta de Chris:
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:
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
fuente
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:
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).
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.
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).
fuente
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:
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.
fuente