Índice de contenidos
- 1. Introducción
- 2. Entorno
- 3. Petición de permisos de localización
- 3. Creación de interfaz
- 4. Creación de una región en base a los datos de los iBeacons
- 5. Lanzamiento del escaneo de iBeacons
- 6. Identificación de zonas
- 7. Conclusiones
1. Introducción
En este tutorial vamos a aprender a crear una aplicación capaz de detectar las diferentes zonas preestablecidas mediante
las balizas iBeacons. Se trata del Kit Kontakt iBeacon de Apple, compuesto por 5 balizas que emiten una señal bluetooth de
baja energía. Cada uno tiene 3 parámetros importántes: UUID , Major y Minor.
- UUID: Identificador único universal de un iBeacon
- Major: Identificador de un subgrupo de iBeacons
- Minor: Identificador específico de un iBeacon
2. Entorno
El tutorial está escrito usando el siguiente entorno:
- Hardware:
- Portátil MacBook Pro 15’ (2.3 GHz Intel Core i7, 16GB DDR3)
- iPhone 6S 4.7’ (Chip A9, 2GB RAM)
- Sistema Operativo:
- Mac OS High Sierra 10.13.4
- OS 11.3
- Entorno de desarrollo: Xcode 9.4 beta
3. Petición de permisos de localización
Es importante informar y requerir el permiso de localización al usuario, y para ello debemos añadir dos parámetros más
en la lista de «Info.plist».
- Privacy – Location Always and When In Use Usage Description
- Privacy – Location When In Use Usage Description
4. Creación de interfaz
En el fichero de «Main.storyboard», agregamos 3 «Image View» y nombramos cada una con una letra.
Debería de tener este aspecto:
Debemos importar la librería CoreLocation y además implementar el protocolo CLLocationManagerDelegate en la clase
«ViewController.swift». Vamos a declarar un locationManager para utilizarlo poseteriormente en la petición de permisos
y el escaneo de iBeacons. El código quedaría así:
ViewController.swift
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
import UIKit import CoreLocation class ViewController: UIViewController, CLLocationManagerDelegate { var locationManager:CLLocationManager = CLLocationManager() //Referencia a los componentes de la interfaz: @IBOutlet weak var iZonaA: UIImageView! @IBOutlet weak var iZonaB: UIImageView! @IBOutlet weak var iZonaC: UIImageView! @IBOutlet weak var numiBeacons: UILabel! //Declaración de variables que recogen la distancia de la baliza al dispositivo móvil var disA:Double = 0 var disB:Double = 0 var disC:Double = 0 override func viewDidLoad() { super.viewDidLoad() locationManager.delegate = self //Pedimos el permiso de localización locationManager.requestAlwaysAuthorization() } |
5. Creación de una región en base a los datos de los iBeacons
Creamos un método encargado de asignar los valores específicos de nuestro kit de iBeacons. Para saber estos datos hay que
entrar al Panel Kontak en el enlace: https://panel.kontakt.io/signin
en el cual, anteriormente, se haya registrado el producto.
En este ejemplo, únicamente necesitaremos el UUID del kit, y el valor de Major de cada iBeacon.
Finalmente comenzará el escaneo en la región definida.
1 2 3 4 5 6 7 8 9 10 11 |
func escaneariBeacons(){ let uuid = UUID(uuidString: "f7826da6-4fa2-4e98-8024-bc5b71e0893e")! let identifier = "com.autentia" //Identificador personalizado let region = CLBeaconRegion(proximityUUID: uuid, identifier: identifier) locationManager.startRangingBeacons(in: region) } |
6. Lanzamiento del escaneo de iBeacons
Lo siguiente, es implementar el método locationManager, para verificar si el usuario ha concedido los permisos de localización
y llamar al método anterior.
1 2 3 4 5 6 |
func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) { if status == .authorizedAlways{ escaneariBeacons() } } |
6. Identificación de zonas
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
func locationManager(_ manager: CLLocationManager, didRangeBeacons beacons: [CLBeacon], in region: CLBeaconRegion) { guard let discoveredBeaconProximity = beacons.first?.proximity else { numiBeacons.text = ("No hay ibeacons cerca"); return } if(beacons.count > 0){ // Si hay iBeacons en el perímetro numiBeacons.text = "\(beacons.count)" for b in beacons{ if(b.major == 43614){ // iBeacon de la zona A disA = b.accuracy }else if(b.major == 15288){ // iBeacon de la zona B disB = b.accuracy }else if(b.major == 40577){ // iBeacon de la zona C disC = b.accuracy } } // Si el más cercano es el de la zona A if(disA < disB && disA < disC && disA != -1.0 && disB != -1.0 && disC != -1.0){ iZonaA.backgroundColor = UIColor.green iZonaB.backgroundColor = UIColor.red iZonaC.backgroundColor = UIColor.red // Si el más cercano es el de la zona de B }else if(disB < disA && disB < disC && disA != -1.0 && disB != -1.0 && disC != -1.0){ iZonaB.backgroundColor = UIColor.green iZonaA.backgroundColor = UIColor.red iZonaC.backgroundColor = UIColor.red // Si el más cercano es el de la zona de C }else if(disC < disB && disC < disA && disA != -1.0 && disB != -1.0 && disC != -1.0){ iZonaC.backgroundColor = UIColor.green iZonaB.backgroundColor = UIColor.red iZonaA.backgroundColor = UIColor.red } }else{ numiBeacons.text = "0" } } |
Por último, queda instalar la aplicación, distribuir los iBeacons y probar la aplicación. El aspecto final:
6. Conclusiones
Si bien es cierto que, la tecnología basada en iBeacons es útil y atractiva, ya que requiere de pocas herramientas para
su funcionamiento, hay que destacar que la precisión en el cálculo de la distancia entre el teléfono y las balizas
deja mucho que desear. Por lo tanto, no debe estar destinado a un uso que requiera exactitud.
Excelente tu aporte muchas gracias, me ha sido de la mejor ayuda.
ahora tengo el siguiente problema…. como hacer que la app siga ejecutándose todo el tiempo,
cuando cuambio de app y cuando bloqueo la pantalla.
La aplicación me corre excelente pero ahora supongamos que cambio de app o bloqueo la pantalla y entro a una zona nueva requiero que la app siga ejecutandose, he logrado hacer que envie notificaciones pero siempre lo hace mientras esta activa… pleas ayuda!!!