iOS 7 SDK iBeacons Game

Questo tutorial ti guiderà attraverso la nuova tecnologia iBeacons. Per spiegare questa tecnologia in modo interessante, creerai un'applicazione "calda e fredda" in questo tutorial. L'app analizzerà la regione beacon e ti informerà di conseguenza.


introduzione

iBeacon è una tecnologia introdotta in iOS 7 che consente di aggiungere un monitoraggio preciso della posizione geografica all'applicazione. Nonostante il fatto IBeacon è classificato come tecnologia Core Location, iBeacon utilizza la tecnologia Bluetooth Low Energy.

iBeacons supporta tre tipi di profili di distanza tra iBeacon e il dispositivo: immediato, vicino, e lontano. Attraverso queste distanze, è possibile tracciare il movimento del dispositivo all'interno del raggio di iBeacon. iBeacons lavorano di concerto con il monitoraggio specifico della regione. Un'applicazione iOS può essere configurata per verificare una specifica firma iBeacon e, quando il dispositivo iOS si trova in prossimità di tale iBeacon, l'applicazione notifica all'utente.

Per trasformare un dispositivo iOS 7 in un iBeacon, devi creare un'istanza di CLBeaconRegion. Deve essere creato con il UUID e Identifier proprietà. Tuttavia, puoi anche dichiarare e definire altre due proprietà (non obbligatorie): Valore principale e Valore minore.

Si noti che, l'UUID è un identificatore di iBeacon univoco. Pertanto, il parametro UUID dovrebbe essere unico per la tua applicazione. Se l'applicazione utilizza più dispositivi come iBeacons, tutti dovrebbero condividere lo stesso UUID. In questo caso, è necessario configurare iBeacons in base al valore di prossimità, utilizzando il valore maggiore e minore, creando così gruppi singolari che identificano ciascun iBeacon.

Dato che ora sai cos'è un iBeacon e le sue proprietà di base, possiamo implementare un iBeacon. Per completare con successo questo tutorial, sono necessari due dispositivi iOS con supporto Bluetooth 4.0 (iPhone 4 o superiore). Uno dei dispositivi crea e notifica l'iBeacon, mentre l'altro riceve il segnale e presenta le informazioni relative alla distanza di quel dispositivo all'iBeacon.

Questo è il risultato finale del nostro test:

Illustrazione del risultato finale

1. Download del codice

Poiché l'obiettivo di questo tutorial è di insegnarti come creare e implementare un iBeacon, ti forniremo un codice di esempio con diverse viste e oggetti che sono già definiti. Puoi scaricare il codice di esempio all'inizio di questa pagina.

Tuttavia, il codice di esempio contiene quanto segue:

  • Un'applicazione che utilizza il controller di navigazione e tre visualizzazioni e controller.
  • Il controller di visualizzazione iniziale ViewController con due pulsanti (Invia iBeacon e ricevi iBeacon My Proximity).
  • UN SendViewController che crea un iBeacon personalizzato.
  • UN GetViewController che riceve l'iBeacon e presenta le informazioni relative alla distanza di quel iBeacon.

Tutte le viste sono già posizionate e correttamente definite. Hai solo bisogno di aggiungere il codice per il processo di iBeacon. Apri il progetto, eseguilo e gioca con gli oggetti per familiarizzare con il codice. La seguente figura presenta l'immagine che vedrai quando eseguirai il progetto per la prima volta.


Illustrazione dell'interfaccia principale dell'app

Si noti che, come sopra menzionato, sono inclusi due framework:

 #importare  #importare 

Se vuoi (o hai bisogno) di, puoi consultare la documentazione ufficiale del framework di entrambi CoreLocation e CoreBluetooth.


2. Creare un iBeacon

Andiamo a lavorare! Il nostro primo passo è concentrarsi sul SendViewController.h file. Qui definirai le proprietà inerenti la definizione di iBeacon e il delegato appropriato.

Sono necessarie tre proprietà per creare iBeacon: a CLBeaconRegion, un CBPeripheralManager, e a NSDictionary. Il CLBeaconRegion oggetto definisce un tipo di regione che si basa sulla vicinanza del dispositivo a un beacon Bluetooth. Cerca dispositivi le cui informazioni identificative corrispondono alle informazioni fornite. Quando il dispositivo entra nel raggio d'azione, la regione attiva la consegna di una notifica appropriata. Il CBPeripheralManager object gestisce i servizi pubblicati all'interno del database GATT (Generic Attribute Profile) del dispositivo periferico locale e pubblicizza tali servizi sui dispositivi centrali. Finalmente, il NSDictionary memorizza le informazioni che verranno successivamente pubblicizzate. Detto questo, il seguente frammento ti aiuterà a creare queste proprietà:

 @property (strong, nonatomic) CLBeaconRegion * beaconRegion; @property (strong, nonatomic) NSDictionary * beaconPeripheralData; @property (strong, nonatomic) CBPeripheralManager * peripheralManager;

In termini di delegato, userete il CBPeripheralManagerDelegate. Questo protocollo viene utilizzato dal delegato per verificare la pubblicazione e la pubblicità e per monitorare le richieste di lettura, scrittura e abbonamento dai dispositivi centrali remoti.

 @interface SendViewController: ViewController < CBPeripheralManagerDelegate>

Salva il tuo progetto e cambia in SendViewController.m file. Un avvertimento sarà lì ad aspettarti. Prima di risolvere il problema, inizializzare e allocare le risorse per le proprietà precedenti. Nel - (Void) viewDidLoad metodo dovresti innanzitutto iniziare a inizializzare il beaconRegion utilizzando un UUID univoco. L'UUID può essere generato usando il Terminal.app e il comando uuidgen.

Qui, il _beaconRegion l'oggetto è inizializzato usando quattro proprietà (due richieste e due facoltative). Si noti che è possibile inizializzarlo con tre metodi diversi (consultare la documentazione). La prima proprietà è l'UUID univoco, il secondo e il terzo sono opzionali e sono correlati alle specifiche all'interno dell'app (gruppo e faro all'interno del gruppo). L'ultima proprietà è l'identificatore di iBeacon. Lo snippet è:

 NSUUID * uuid = [[Assegnazione NSUUID] initWithUUIDString: @ "F2037E44-13BF-4083-A3A6-514A17BBBA10"]; _beaconRegion = [[CLBeaconRegion alloc] initWithProximityUUID: uuid major: 1 minor: 1 identificatore: @ "com.MobileTuts.iBeacons"];

Per dare un feedback all'utente, aggiorna l'etichetta con l'UUID generato prima:

 _uuidLabel.text = _beaconRegion.proximityUUID.UUIDString;

Ora è necessario inizializzare le due proprietà rimanenti della classe. Il _beaconPeripheralData chiama il _beaconregion peripheralDataWithMeasuredPower metodo che recupera i dati che possono essere utilizzati per pubblicizzare il dispositivo corrente come un beacon. Il _peripheralManager viene inizializzato con il delegato per ricevere gli eventi dei ruoli periferici, la coda di invio per la distribuzione degli eventi dei ruoli periferici e un dizionario opzionale contenente le opzioni di inizializzazione per un gestore periferico. Ecco lo snippet completo:

 _beaconPeripheralData = [_beaconRegion peripheralDataWithMeasuredPower: nil]; _peripheralManager = [[CBPeripheralManager alloc] initWithDelegate: self queue: nil options: nil];

A questo punto, hai assegnato le risorse necessarie, quindi devi solo correggere l'avviso. Aggiungi il -(void) peripheralManagerDidUpdateState: (CBPeripheralManager *) periferica metodo delegato. Questo metodo viene utilizzato per verificare lo stato del dispositivo e, tenendo in considerazione lo stato, l'app agisce di conseguenza. In questo caso, se lo stato è CBPeripheralManagerStatePoweredOn, l'app inizierà l'annuncio. Ci sono diversi stati disponibili. In una vera applicazione dovresti testarli tutti. Gli stati sono:

  • CBCentralManagerStateUnknown
  • CBCentralManagerStateResetting
  • CBCentralManagerStateUnsupported
  • CBCentralManagerStateUnauthorized
  • CBCentralManagerStatePoweredOff
  • CBCentralManagerStatePoweredOn

Ecco il metodo completo per implementare:

 -(void) peripheralManagerDidUpdateState: (CBPeripheralManager *) periferica if (peripheral.state == CBPeripheralManagerStatePoweredOn) NSLog (@ "On"); [_peripheralManager startAdvertising: _beaconPeripheralData];  else if (peripheral.state == CBPeripheralManagerStatePoweredOff) NSLog (@ "Off"); [_peripheralManager stopAdvertising]; 

In questo momento hai creato e configurato iBeacon. Ora puoi iniziare la pubblicità di iBeacon. Tuttavia, è necessario implementare un'app client per provarla. Il prossimo passo ti guiderà a raggiungere questo obiettivo. L'immagine seguente presenta l'interfaccia utente che dovresti vedere quando esegui l'app.


Illustrazione di iBeacon

3. Ricevi un iBeacon

Per cambiare la tua vista al GetViewController.h la classe definisce due oggetti, uno CLBeaconRegion e l'altro CLLocationManager. Il CLBeaconRegion è simile alla definizione di cui sopra, e non dovresti avere alcuna difficoltà nel processo di creazione. Il CLLocationManager definisce l'interfaccia per configurare la consegna di eventi relativi alla posizione alla tua applicazione.

 @property (strong, nonatomic) CLBeaconRegion * beaconRegion; @property (strong, nonatomic) CLLocationManager * locationManager;

Inoltre, è necessario definire un delegato del protocollo, questa volta il CLLocationManagerDelegate.

 @interface GetViewController: ViewController 

Ora vai al GetViewController.m e permettiamo e inizializziamo gli oggetti. Il _locationManager è semplice e dovresti impostare il delegato su se stesso. Quindi è necessario creare un UUID e definire il _beaconRegion. Inoltre, è necessario definire una regione per il monitoraggio. In questo caso monitorerai il _beaconRegion regione.

 _locationManager = [[allocazione di CLLocationManager] init]; _locationManager.delegate = self; NSUUID * uuid = [[Assegnazione NSUUID] initWithUUIDString: @ "F2037E44-13BF-4083-A3A6-514A17BBBA10"]; _beaconRegion = [[CLBeaconRegion alloc] initWithProximityUUID: identificatore uuid: @ "com.MobileTuts.iBeacons"]; [_locationManager startMonitoringForRegion: _beaconRegion];

Ora è necessario definire i seguenti tre metodi:

  • - (void) locationManager: gestore (CLLocationManager *) didEnterRegion: (CLRegion *) region
  • -(void) locationManager: (CLLocationManager *) manager doneExitRegion: (CLRegion *) region
  • -(void) locationManager: gestore (CLLocationManager *) didRangeBeacons: (NSArray *) beacons inRegion: (CLBeaconRegion *) region

I nomi sono auto esplicativi, tuttavia il primo indica al delegato che l'utente è entrato nella regione specificata. Il secondo indica al delegato che l'utente ha lasciato la regione specificata e l'ultimo indica al delegato che uno o più beacon si trovano nell'intervallo. Questo ultimo metodo è obbligatorio.

Il primo metodo inizia solo a fornire notifiche per i beacon nella regione specificata, mentre il secondo fa il contrario. Arresta la consegna delle notifiche per i beacon nella regione specificata. I metodi completi sono:

 - (void) locationManager: gestore (CLLocationManager *) didEnterRegion: (CLRegion *) region NSLog (@ "Beacon Found"); [_locationManager startRangingBeaconsInRegion: _beaconRegion];  - (void) locationManager: gestore (CLLocationManager *) doneExitRegion: (CLRegion *) region NSLog (@ "Left Region"); [_locationManager stopRangingBeaconsInRegion: _beaconRegion]; 

Infine, l'ultimo metodo acquisisce i dati dei beacon disponibili e trasforma tali dati in qualsiasi forma l'utente desideri. Per ricevere correttamente i dati, creare a CLBeacon oggetto. Aggiorna l'etichetta e cambia il colore dello sfondo, prendendo in considerazione la distanza di iBeacon. Il codice sorgente del metodo completo è il seguente:

 -(void) locationManager: gestore (CLLocationManager *) didRangeBeacons: (NSArray *) beacons inRegion: (CLBeaconRegion *) region CLBeacon * beacon = [[CLBeacon alloc] init]; beacon = [beacon lastObject]; self.UUID.text = beacon.proximityUUID.UUIDString; if (beacon.proximity == CLProximityUnknown) _distanceLabel.text = @ "Prossimità sconosciuta"; [_view setBackgroundColor: [UIColor blackColor]];  else if (beacon.proximity == CLProximityImmediate) _distanceLabel.text = @ "Immediate"; [_view setBackgroundColor: [UIColor redColor]];  else if (beacon.proximity == CLProximityNear) _distanceLabel.text = @ "Near"; [_view setBackgroundColor: [UIColor orangeColor]];  else if (beacon.proximity == CLProximityFar) _distanceLabel.text = @ "Far"; [_view setBackgroundColor: [UIColor blueColor]]; 

Tu puoi ora Correre l'app (in due dispositivi separati) e testare i beacon. Nota che devi lasciare entrambi i dispositivi tra i cinque ei quindici metri per uscire e rientrare nella zona predefinita. Tuttavia, è possibile applicare una semplice soluzione per testare l'app senza la necessità di spostare tale spazio. Dovresti dichiarare un metodo aggiuntivo (- (void) locationManager: gestore (CLLocationManager *) didStartMonitoringForRegion: (CLRegion *) region) che afferma che la regione è direttamente collegata alla regione di quel faro.

 - (void) locationManager: gestore (CLLocationManager *) didStartMonitoringForRegion: (CLRegion *) region [_locationManager startRangingBeaconsInRegion: _beaconRegion]; 

Inoltre, è necessario chiamare manualmente questo metodo in receiveiBeacon: (id) sender.

 [self locationManager: _locationManager didStartMonitoringForRegion: _beaconRegion];

Correre il progetto e testare le funzionalità! Allontanati dal tuo dispositivo iBeacon e controlla la tua interfaccia. Dovresti ottenere schermate come le seguenti immagini quando sei a una distanza ravvicinata:

Illustrazione di una distanza ravvicinata

O questo quando sei lontano dal tuo dispositivo iBeacon:

Illustrazione di una lontana distanza

Conclusione

Alla fine di questo tutorial dovresti essere in grado di definire, configurare e utilizzare iBeacons. Se avete domande o commenti, sentitevi liberi di lasciarli qui sotto!