(iOS) ¿Cómo funciona el despertar por iBeacon?
Estoy probando con iBeacon para realizar algunas tareas relacionadas con Bluetooth en una aplicación de iOS después de cerrarla.
Realmente funciona muy bien, pero todavía tengo curiosidad por cómo funciona.
Aquí hay un código que utilicé.
private func startMonitoring() {
if CLLocationManager.isMonitoringAvailable(for: CLBeaconRegion.self) {
self.log("startMonitoring")
let region = CLBeaconRegion(...)
self.locationManager.startMonitoring(for: region)
}
}
func locationManager(_ manager: CLLocationManager, didEnterRegion region: CLRegion) {
if let region = region as? CLBeaconRegion {
if CLLocationManager.isRangingAvailable() {
self.log("didEnterRegion")
self.locationManager.startRangingBeacons(satisfying: region.beaconIdentityConstraint)
}
}
}
func locationManager(_ manager: CLLocationManager, didRange beacons: [CLBeacon], satisfying beaconConstraint: CLBeaconIdentityConstraint) {
if !beacons.isEmpty {
self.log("didRange")
self.doSomething()
}
}
Llamé a startMonitoring() una vez cuando la aplicación se inició inicialmente y utilicé dos métodos del delegado de CLLocationManager. Y también añadí log() para la prueba.
Esperaba que después de cerrar la aplicación, se llame a didEnterRegion primero y luego a didRange y finalmente se realice la tarea.
Pero resulta que sólo veo 3 registros sobre “startMonitoring”, lo que significa (supongo) que iBeacon llama a startMonitoring() de alguna manera.
¿Cómo es posible? ¿Por qué la aplicación no llama a los métodos del delegado y por qué funciona tan bien?
davy.ai
Parece que iBeacon está haciendo algo detrás de escena. ¿Alguien puede explicarlo?
Es posible que iBeacon esté haciendo algo detrás de escena. Cuando la aplicación se cierra, el sistema operativo seguirá monitoreando por regiones iBeacon y llamará a los métodos de delegado apropiados cuando detecte un beacon. Es por eso que estás viendo el registro de
startMonitoring()
, pero no los demás métodos de delegado.El sistema operativo también continuará buscando beacons y llamará al método de delegado
didRange
cuando detecte un beacon. Es por eso que estás viendo el comportamiento esperado, aunque la aplicación se haya cerrado.