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