iOS 7 SDK iBeacons Game

Deze zelfstudie leidt u door de nieuwe iBeacons-technologie. Om deze technologie op een interessante manier uit te leggen, maakt u een "warme en koude" app in deze zelfstudie. De app analyseert de bakenregio en informeert u dienovereenkomstig.


Invoering

iBeacon is een technologie die is geïntroduceerd in iOS 7 en waarmee u nauwkeurige locatieregiemonitoring aan uw toepassing kunt toevoegen. Ondanks het feit dat iBeacon is geclassificeerd als een Core Location-technologie, iBeacon maakt gebruik van Bluetooth Low Energy-technologie.

iBeacons ondersteunt drie soorten afstandsprofielen tussen de iBeacon en het apparaat: onmiddellijk, in de buurt, en ver. Via deze afstanden is het mogelijk om de beweging van het apparaat binnen het bereik van de iBeacon te volgen. iBeacons werken samen met specifieke regio-monitoring. Een iOS-applicatie kan worden geconfigureerd om een ​​specifieke iBeacon-handtekening te verifiëren, en wanneer het iOS-apparaat zich in de nabijheid van die iBeacon bevindt, meldt de toepassing de gebruiker.

Om een ​​iOS 7-apparaat in een iBeacon te veranderen, moet u een exemplaar maken van CLBeaconRegion. Het moet worden gemaakt met de UUID en Identifier eigenschappen. U kunt echter ook nog twee (niet-vereiste) eigenschappen declareren en definiëren: Grote waarde en Kleine waarde.

Merk op dat de UUID een uniek iBeacon-ID is. De UUID-parameter moet dus uniek zijn voor uw toepassing. Als uw toepassing meerdere apparaten als iBeacons gebruikt, moeten ze allemaal dezelfde UUID delen. In dit geval moet u de iBeacons configureren op basis van de benaderingswaarde, met behulp van de hoofd- en ondergeschikte waarde, en aldus singuliere groepen maken die elke iBeacon identificeren.

Omdat u nu weet wat een iBeacon is en zijn basiseigenschappen, kunnen we een iBeacon implementeren. Om deze tutorial met succes te voltooien, hebt u twee iOS-apparaten nodig met Bluetooth 4.0-ondersteuning (iPhone 4 of hoger). Een van de apparaten maakt en waarschuwt de iBeacon, terwijl de andere het signaal ontvangt en informatie presenteert over de afstand van dat apparaat tot de iBeacon.

Dit is hoe ons eindresultaat eruit zal zien:

Illustratie van het eindresultaat

1. Code downloaden

Aangezien het doel van deze zelfstudie is om u te leren hoe u een iBeacon kunt maken en implementeren, bieden we u een voorbeeldcode met verschillende weergaven en objecten die al zijn gedefinieerd. Je kunt de voorbeeldcode downloaden aan het begin van deze pagina.

Desalniettemin bevat de voorbeeldcode het volgende:

  • Een applicatie die de navigatiecontroller en drie weergaven en controllers gebruikt.
  • De eerste weergavecontroller ViewController met twee knoppen (Stuur iBeacon en ontvang iBeacon Mijn nabijheid).
  • EEN SendViewController waarmee een aangepaste iBeacon wordt gemaakt.
  • EEN GetViewController die de iBeacon ontvangt en de informatie presenteert over de afstand tot die iBeacon.

Alle weergaven zijn al geplaatst en correct gedefinieerd. U hoeft alleen de code toe te voegen voor het iBeacon-proces. Open het project, voer het uit en speel met de objecten om vertrouwd te raken met de code. De volgende afbeelding toont de afbeelding die u ziet wanneer u het project de eerste keer uitvoert.


Illustratie van de belangrijkste app-interface

Merk op dat zoals eerder vermeld, twee frameworks zijn opgenomen:

 #importeren  #importeren 

Als u wilt (of nodig) om, kunt u de officiële kaderdocumentatie van beide raadplegen CoreLocation en CoreBluetooth.


2. Maak een iBeacon

Laten we aan de slag gaan! Onze eerste stap is om ons te concentreren op de SendViewController.h het dossier. Hier definieert u de eigenschappen die inherent zijn aan de iBeacon-definitie en de juiste gedelegeerde.

U hebt drie eigenschappen nodig om de iBeacon te maken: a CLBeaconRegion, een CBPeripheralManager, en een NSDictionary. De CLBeaconRegion object definieert een type regio dat is gebaseerd op de nabijheid van het apparaat tot een Bluetooth-beacon. Het zoekt naar apparaten waarvan de identificerende informatie overeenkomt met de informatie die u verstrekt. Wanneer dat apparaat binnen bereik komt, activeert de regio een passende melding. De CBPeripheralManager object beheert gepubliceerde services in de Generic Attribute Profile (GATT) -database van het lokale randapparaat en adverteert deze services op centrale apparaten. eindelijk, de NSDictionary slaat de informatie op die later zal worden geadverteerd. Dat gezegd hebbende, zal het volgende fragment u helpen om die eigenschappen te creëren:

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

In termen van de afgevaardigde gebruikt u de CBPeripheralManagerDelegate. Dit protocol wordt gebruikt door de gedelegeerde om publicatie en reclame te controleren en om lees-, schrijf- en abonnementsverzoeken van externe centrale apparaten te controleren.

 @interface SendViewController: ViewController < CBPeripheralManagerDelegate>

Sla je project op en ga naar de SendViewController.m het dossier. Er zal één waarschuwing op je wachten. Voordat u dit probleem oplost, initialiseert u en wijst u bronnen toe voor de vorige eigenschappen. In de - (Void) viewDidLoad methode moet je eerst beginnen met het initialiseren van de beaconRegion met behulp van een unieke UUID. De UUID kan worden gegenereerd met behulp van de Terminal.app en het commando uuidgen.

Hier de _beaconRegion object wordt geïnitialiseerd met behulp van vier eigenschappen (twee vereist en twee optioneel). Merk op dat u het met drie verschillende methoden kunt initialiseren (raadpleeg de documentatie). De eerste eigenschap is de unieke UUID, de tweede en derde zijn optioneel en hebben betrekking op specificaties binnen de app (groep en baken binnen groep). De laatste eigenschap is de iBeacon-ID. Het fragment is:

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

Om feedback te geven aan de gebruiker, werkt u het label bij met de eerder gegenereerde UUID:

 _uuidLabel.text = _beaconRegion.proximityUUID.UUIDString;

Nu moet je de twee resterende klasse-eigenschappen initialiseren. De _beaconPeripheralData roept de _beaconregion peripheralDataWithMeasuredPower methode die gegevens ophaalt die kunnen worden gebruikt om het huidige apparaat als een baken te adverteren. De _peripheralManager wordt geïnitialiseerd met de gedelegeerde om de perifere rolgebeurtenissen te ontvangen, de verzendwachtrij voor het verzenden van de perifere rolgebeurtenissen en een optioneel woordenboek met initialisatieopties voor een periferiemanager. Hier is het volledige fragment:

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

Op dit punt hebt u de benodigde bronnen toegewezen, zodat u alleen de waarschuwing hoeft op te lossen. Voeg de toe -(void) peripheralManagerDidUpdateState: (CBPeripheralManager *) randapparaat gedelegeerde methode. Deze methode wordt gebruikt om de apparaatstatus te controleren en rekening houdend met de staat, handelt de app overeenkomstig. In dit geval als de staat is CBPeripheralManagerStatePoweredOn, de app begint de advertentie. Er zijn verschillende beschikbare toestanden. In een echte applicatie moet je ze allemaal testen. De staten zijn:

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

Hier is de volledige methode om te implementeren:

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

Op dit moment hebt u de iBeacon gemaakt en geconfigureerd. U kunt nu de iBeacon-advertentie starten. U moet echter een client-app implementeren om het uit te proberen. De volgende stap zal u begeleiden om dat te bereiken. De volgende afbeelding toont de gebruikersinterface die u zou moeten zien wanneer u de app uitvoert.


Illustratie van de iBeacon

3. Ontvang een iBeacon

Om uw weergave te wijzigen in de GetViewController.h klasse definieer twee objecten, één CLBeaconRegion en de andere CLLocationManager. De CLBeaconRegion is vergelijkbaar met de bovengenoemde definitie, en je zou geen enkel probleem moeten hebben in het creatieproces. De CLLocationManager definieert de interface voor het configureren van de levering van locatiegebonden gebeurtenissen aan uw toepassing.

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

Bovendien moet u een protocollenafgevaardigde definiëren, deze keer de CLLocationManagerDelegate.

 @interface GetViewController: ViewController 

Ga nu naar de GetViewController.m en laten we de objecten toestaan ​​en initialiseren. De _locatie manager is eenvoudig en je zou de gedelegeerde naar zichzelf moeten zetten. Vervolgens moet u een UUID maken en de _beaconRegion. Bovendien moet u een regio definiëren voor de bewaking. In dit geval controleert u de _beaconRegion regio.

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

Nu moet je de volgende drie methoden definiëren:

  • - (void) locationManager: (CLLocationManager *) manager didEnterRegion: (CLRegion *) regio
  • -(void) locationManager: (CLLocationManager *) manager didExitRegion: (CLRegion *) regio
  • -(void) locationManager: (CLLocationManager *) manager didRangeBeacons: (NSArray *) beacons inRegion: (CLBeaconRegion *) regio

De namen spreken voor zich, maar de eerste vertelt de deelnemer dat de gebruiker de opgegeven regio heeft ingevoerd. De tweede vertelt de afgevaardigde dat de gebruiker de opgegeven regio heeft verlaten, en de laatste vertelt de afgevaardigde dat een of meer bakens binnen bereik zijn. Deze laatste methode is verplicht.

De eerste methode begint alleen meldingen voor bakens in het opgegeven gebied af te geven, terwijl de tweede methode het tegendeel doet. Het stopt de aflevering van meldingen voor bakens in de opgegeven regio. De complete methoden zijn:

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

Ten slotte verwerft de laatste methode de gegevens van de beschikbare bakens en transformeert die gegevens in elke vorm die de gebruiker wil. Als u correct gegevens wilt ontvangen, maakt u een CLBeacon voorwerp. Het werkt het label bij en verandert de kleur van de achtergrond, rekening houdend met de afstand van de iBeacon. De volledige broncode van de methode is de volgende:

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

Je kan nu Rennen de app (in twee afzonderlijke apparaten) en test de bakens. Let op: u moet beide apparaten tussen vijf en vijftien meter verlaten om te vertrekken en de vooraf gedefinieerde zone opnieuw te betreden. Er is echter een eenvoudige oplossing die u kunt toepassen om de app te testen zonder dat u die ruimte hoeft te verplaatsen. U moet een aanvullende methode aangeven (- (void) locationManager: (CLLocationManager *) manager didStartMonitoringForRegion: (CLRegion *) regio) waarin staat dat de regio rechtstreeks is verbonden met de regio van dat baken.

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

Bovendien moet u deze methode handmatig in de receiveiBeacon: (id) verzender.

 [self locationManager: _locationManager didStartMonitoringForRegion: _beaconRegion];

Rennen het project en test de functies! Ga weg van je iBeacon-apparaat en controleer je interface. Je zou schermen moeten krijgen zoals de volgende afbeeldingen wanneer je op korte afstand bent:

Illustratie van een nabije afstand

Of deze als je ver verwijderd bent van je iBeacon-apparaat:

Illustratie van een verre afstand

Conclusie

Aan het einde van deze zelfstudie moet u iBeacons kunnen definiëren, configureren en gebruiken. Als u vragen of opmerkingen heeft, kunt u deze hieronder achterlaten!