Aplicación con Swift 4.1 que identifica las zonas mediante iBeacons

2
2306

Índice de contenidos


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

	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.


	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.


	func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {

        if status == .authorizedAlways{
            escaneariBeacons()
        }
    }


6. Identificación de zonas


	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.

2 COMENTARIOS

  1. 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.

  2. 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!!!

DEJA UNA RESPUESTA

Por favor ingrese su comentario!

He leído y acepto la política de privacidad

Por favor ingrese su nombre aquí

Información básica acerca de la protección de datos

  • Responsable:
  • Finalidad:
  • Legitimación:
  • Destinatarios:
  • Derechos:
  • Más información: Puedes ampliar información acerca de la protección de datos en el siguiente enlace:política de privacidad