ios - app - Detección de balizas a través de iBeacon Monitoring & Ranging vs CoreBluetooth scanForPeripheralsWithServices
swift bluetooth tutorial (1)
En su mayoría tienes razón con tu descripción. Solo dos aclaraciones:
El límite de 20 regiones no es por dispositivo, es específico de la aplicación. Independientemente de lo que otras aplicaciones estén haciendo en el dispositivo móvil, su aplicación aún puede monitorear hasta 20 regiones con iOS. Dicho esto, es probable que existan límites de hardware que sean específicos del dispositivo sobre cuántas regiones se pueden monitorear en segundo plano con asistencia de hardware. Estos límites son indocumentados. Si supera estos límites no documentados, es probable que la detección de balizas en el fondo demore mucho más. (Aunque dicho eso, no hay garantía de sistema operativo de cuándo vendrán las detecciones, de todos modos).
No puede conectarse a un
CLBeacon
utilizando las API de monitoreo yCLBeacon
. Estas API solo funcionan con paquetes de publicidad BLE, que no tienen conexión.
Sí, es posible utilizar scanForPeripheralsWithServices
como alternativa. Esto es lo que hacen las balizas Gimbal para implementar un sistema propietario. Sin embargo, existen desventajas reales en términos de tiempo de detección de fondo y confiabilidad.
Existe mucha confusión con respecto a las restricciones que aplica el iOS en las aplicaciones que desean escanear balizas / periféricos BLE. Después de leer varios blogs y respuestas de desbordamiento de pila, quiero ver si entiendo todos los problemas correctamente. Por favor, corríjame si hay algo que haya entendido mal o que haya pasado por alto. Me refiero solo a iOS 7 y superior, y me concentro en la detección y no en la conexión (¿Se puede conectar a un CLBeacon utilizando la API de monitoreo y ajuste de iBeacon?).
Las opciones para las balizas son claras: use un periférico BLE de propósito general o use un periférico BLE que se anuncie en el formato iBeacon (Además, un periférico no estándar puede publicitarse en el formato iBeacon en el paquete adv y en un formato diferente paquete de escaneo-respuesta).
Restricciones generales
- iBeacon Ranging te permitirá saber qué balizas están a tu alrededor. Debe especificar el ProximityUUID que las balizas publicitan de antemano (no hay exploración "general").
didRangeBeacons
se llamará cada segundo con una matriz de objetos CLBeacon que se encontraron recientemente. La distancia de la baliza y su precisión se calculan mediante el iOS utilizando un algoritmo confidencial que solo los desarrolladores de Apple realmente conocen (el algoritmo se basa en los valores rssi y el byte de calibración rssi-at-1-meter que anuncia la baliza). También puede usar iBeacon Monitoring para llamar a un delegado cada vez que ingrese o salga de una región. De nuevo, debe especificar la ProximityUUID que está buscando (también puede especificar una mayor y una menor). "Salir de una región" se define por algún tiempo de no recibir ningún anuncio y, por lo tanto, no puede ser inmediato. La cantidad de regiones a las que se puede asignar un rango y monitorearlas simultáneamente por dispositivo está limitada a 20: esto significa que si otras aplicaciones monitorean el rango al mismo tiempo, es posible que su aplicación no pueda monitorear el rango (¿correcto?). - CoreBluetooth: también puede detectar otras estructuras de anuncios en el anuncio de la baliza. Si la baliza se anuncia también en formato iBeacon, no podrá ver los campos de iBeacon (ProximityUUID, major, minor ...), a pesar de que se envían bajo una estructura de anuncios estándar "Específico del fabricante" que puede ver en otros casos. .
Ejecución en primer plano - El caso de uso menos restringido:
- iBeacon Rango y Monitoreo - sin más restricciones.
- CoreBluetooth - Pasando
nil
en elscanForPeripheralsWithServices
descanForPeripheralsWithServices
buscará todos los periféricos. Al pasarCBCentralManagerScanOptionAllowDuplicatesKey
comoYES
en las opciones, se hará quedidDiscoverPeripheral
se llame varias veces para el mismo / beacon periférico (supongo que al utilizar un temporizador no se recibió el anuncio durante algún tiempo y supongo que el usuario salió de la "región") .
Ejecución en segundo plano - El caso de uso más restringido:
- iBeacon Ranging no funcionará directamente. iBeacon Monitoring llamará a
didEnterRegion
y le dará un tiempo de ejecución de la aplicación de 6 segundos, en el que puede iniciar el rango (por ejemplo, para detectar mayor y menor). Es posible que la detección no sea inmediata ya que iOS activa y desactiva el escaneo para conservar la energía de la batería. Si ingresa en una región de varias balizas con el mismo ProximityUUID y monitorea este UUID sin una mayor y / o menordidEnterRegion
, se llamarádidEnterRegion
cuando comience a recibir la señal de la primera baliza, sin embargo, si no salió de la En la región de la primera baliza y también ingresó a la región de una segunda baliza, la aplicación no se volverá adidEnterRegion
(no se volverá adidEnterRegion
adidEnterRegion
), por lo que no puede comenzar a buscar la segunda y la segunda baliza. La aplicación no puede simplemente aparecer en primer plano, sino que puede crear notificaciones locales y otras operaciones en segundo plano. - CoreBluetooth: según el procesamiento de fondo del núcleo Bluetooth,
scanForPeripheralsWithServices
puede ejecutarse en segundo plano con, pero debe especificar al menos un serviceUUID.didDiscoverPeripheral
recibirá un tiempo de ejecución de 10 segundos. El uso deCBCentralManagerScanOptionAllowDuplicatesKey
no funcionará:didDiscoverPeripheral
se llamará una vez para cada periférico. Por lo tanto, no puede detectar la "salida" de la región y la "reentrada". Supongo que puede usar un periférico BLE no estándar que cambia su dirección MAC para superar este problema. La aplicación no puede simplemente aparecer en primer plano, sino que puede crear notificaciones locales y otras operaciones en segundo plano. Es posible que la detección no sea inmediata ya que iOS activa y desactiva el escaneo para conservar la energía de la batería.
Corriendo después de que la aplicación muere
- Monitoreo iBeacon - Funciona! Incluso si el usuario mató la aplicación o el dispositivo fue reiniciado.
- CoreBluetooth: la aplicación se activará si fue eliminada por el iOS (debido a la inactividad o las limitaciones de memoria). Sin embargo, si el usuario eliminó explícitamente la aplicación, no se activará (lo que hace que el primer caso sea difícil de probar). No sé qué pasa después de reiniciar un dispositivo ...
¿Alguien tiene más experiencia con estas restricciones? ¿ scanForPeripheralsWithServices
puede utilizar scanForPeripheralsWithServices
como una mejor alternativa a iBeacon Monitoring en algunos casos de uso?
¡Gracias!