iBKS Hello World para iOS

RESUMEN

La demo de la App “iBKS Hello World” es un proyecto que contiene las funciones más importantes para comenzar a interactuar con un Beacon.

En este documento se explica cómo está estructurado este proyecto, implementado en swift y XCode 8.2.1, y cuáles son las funciones que se pueden encontrar en él.

PÚBLICO

Este documento está enfocado para desarrolladores de Apps que no tienen experiencia en la gestión de comunicación con beacons.

  1. Antes de empezar
  2. Proyecto iBKS Hello World
  3. Permisos de la App
    1. Ubicación
    2. Bluetooth
    3. Notificaciones Locales
  4. Escanear dispositivos Bluetooth
  5. Notificaciones
  6. Escaneo en segundo plano

1.Antes de empezar

Todo lo que necesitas para empezar a jugar con “iBKS Hello World”:

  • XCode 7 o superior
  • Dispositivo iOS con versión OS 9.0 o superior y capacidades BLE.
  • Al menos un iBKS Beacon
  • Descargar proyecto iBKS Hello World

2. Proyecto iBKS Hello World

Después de descargar el proyecto “iBKS Hello World”, solo tienes que abrirlo en XCode, firmarlo con tu provisión de desarrollador y compilarlo. No hay bibliotecas adicionales ni pasos que debas incluir.
El proyecto está estructurado para mostrar tres funcionalidades importantes, cada una en una clase diferente:

  • ScanViewController: escanea y lista los beacons que están anunciándose alrededor y permite descubrir servicios y características. Los servicios y características se imprimirán en la consola de salida de XCode. CoreBluetooth se utiliza para esta demo.
  • NotificationsViewController: Muestra un diálogo de notificación en la App activado por un paquete de beacon específico detectado. También incluye la vista de configuración que te permite configurar los parámetros en el beacon que el dispositivo está buscando. CoreLocation se utiliza para esta demo.
  • Monitoreo en segundo plano (desde AppDelegate): Inicia el monitoreo y el rango en segundo plano para beacons en una región y realiza algunas acciones cuando los detecta (enviar notificación, abrir la app, …) incluso cuando la app está detenida. El monitoreo en segundo plano comienza cuando la APP pasa a segundo plano y se detiene cuando la APP pasa a primer plano. CoreLocation se utiliza para esta demo.

 

hello-ios-01

3. Permisos de la App

Se necesitan varios permisos y solicitudes para este ejemplo. Bluetooth y Ubicación se utilizarán para escanear y medir beacons en primer plano, y Notificaciones Locales para el monitoreo en segundo plano con el fin de notificar al usuario.

3.1. Ubicación

Para permitir la ubicación tanto en modo de ejecución en primer plano como en segundo plano, es necesario agregar la clave “Privacy – Location Always Usage Description” en el archivo Info.plist. Debería verse así:

hello-ios-02

También solicita permisos de ubicación en el AppDelegate en el método “didFinishLaunchingWithOptions” de la siguiente manera:

locationManager = CLLocationManager()
locationManager!.requestAlwaysAuthorization()

3.2. Bluetooth

El único paso que debes hacer para que Bluetooth funcione correctamente para este ejemplo es habilitar las “Actualizaciones de ubicación” y “Usa accesorios Bluetooth LE” en los Modos de Fondo para las Capacidades de la app. Esto es necesario solo para la función en segundo plano.

Ten en cuenta que incluso si CoreLocation y CoreBluetooth funcionan correctamente para el escaneo y rango en primer plano en este ejemplo, si planeas publicar tu app, se requerirá agregar algunas claves de privacidad y uso adicionales para Bluetooth en el archivo Info.plist. Por favor, consulta la guía de Desarrolladores de Apple para más información.

Las capacidades de la app deberían verse así (todo lo demás está deshabilitado):

hello-ios-03

3.3. Notificaciones Locales

La solicitud de Notificaciones Locales también se solicita en el AppDelegate dentro del método “didFinishLaunchingWithOptions” justo después del permiso de ubicación con el siguiente código:

let notificationSettings = UIUserNotificationSettings(types: [.sound, .alert], categories: nil)
UIApplication.shared.registerUserNotificationSettings(notificationSettings)

Al igual que para Bluetooth, puede ser necesaria la clave de descripción de Uso de Notificaciones Locales en el archivo Info.plist si la app debe publicarse en la App Store.

4. Escanear dispositivos Bluetooth

Todas las funciones necesarias utilizadas para escanear dispositivos Bluetooth están en ScanViewController. Los pasos para lograrlo son:

  1. Implementar el CBCentralManagerDelegate en el ScanViewController
  2. Definir e iniciar un CBCentralManager desde el método “viewDidLoad”. Asignar el delegado self al gestor central
  3. Cuando se recibe el estado “.poweredOn” en el método “centralManagerDidUpdateState” (que es necesario para el
    CBCentralManagerDelegate), se puede iniciar el escaneo.
  4. Los dispositivos escaneados se recibirán en el método “centralManager – didDiscover peripheral”. Trátalos adecuadamente según tus necesidades.
  5. Opcionalmente, conecta al dispositivo. En el proyecto, la conexión se realiza cuando se hace clic en un dispositivo de la lista.
  6. Para la conexión, se necesitan CBPeripheralDelegate y sus métodos.
    Una vez que comienza la conexión, el estado se recibirá en el método “centralManager – didConnect”. Luego se puede iniciar el descubrimiento de servicios y características. Para esta función, todos los pasos se registran en la consola de salida en XCode.

 

hello-ios-04

La app muestra una lista de todos los dispositivos Bluetooth detectados con su propio (y ordenado por) RSSI, nombre y UUID asignado.

5. Notificaciones

En algunos casos, es útil mostrar una notificación al usuario cuando se detecta un beacon específico en un rango de distancia particular. Este ejemplo se muestra en NotificationsViewController. CoreLocation se utiliza para este ejemplo.

iOS solo permite medir para un límite de 20 dispositivos. Establece los parámetros (UUID, Major, Minor, Rango y Mensaje) para el beacon que deseas detectar, define su región y comienza a medir con CoreLocartion. Estos son los pasos.:

  1. Define la región del beacon, con el UUID, Major y Minor de tu beacon.
  2. Comienza a medir para esa región y espera a que el beacon sea detectado.
  3. Una vez detectado, verifica si está lo suficientemente cerca y la distancia coincide con el
    rango que definiste en la configuración.
  4. Si el rango coincide para nuestra región, muestra un diálogo con el mensaje definido
    también en la configuración.
hello-ios-05hello-ios-06hello-ios-07

6. Escaneo en segundo plano

Otra función interesante es el escaneo en segundo plano. Esta permite monitorear los beacons en segundo plano incluso si la app está cerrada. El simple rango no está permitido directamente en segundo plano, pero hay una forma sencilla de hacerlo funcionar.

iOS es capaz de monitorear una región (beacon) incluso si la app ha sido cerrada. Informará en el método “didEnterRegion” cuando se detecte el beacon (puede tardar hasta 5 segundos) y solo ocurrirá cuando el estado cambie de fuera a dentro de la región.

También informará en el método “didExitRegion” cuando el beacon ya no se detecte durante algún tiempo. Esta detección puede tardar de 15 segundos a 5 minutos para evitar detecciones falsas. Este estado solo ocurrirá cuando se cambie de dentro a fuera de la región.

Además, hay un método “didDetermineState”, que es más útil ya que informa el estado actual y no solo cuando se cambian los estados. Es el método utilizado en este ejemplo. También es más seguro de usar en segundo plano según la documentación de Apple.

Todos los métodos de fondo utilizados para CoreLocation están definidos y delegados en el AppDelegat. Para este ejemplo, el monitoreo en segundo plano se inicia en el “applicationDidEnterBackground” (y solo si el interruptor en MainViewController está activado) y se detendrá en el método “applicationWillEnterForeground”

Cuando un beacon es detectado en segundo plano por el OS, esto despertará la APP por un período máximo de 10 segundos para procesar cualquier tarea necesaria. En este caso, la tarea será medir el beacon para verificar su proximidad y mostrar, si es necesario, una notificación local. Ten en cuenta que como la medición solo puede durar 10 segundos máximo, si el beacon no se mide correctamente o la proximidad no coincide con la establecida en la configuración, la notificación no se mostrará, pero el estado cambiará de todos modos a dentro de la región.