iBeacon開發

Beacon

什麼是iBeacons

iBeacons是蘋果在2013年WWDC上推出一項基於藍牙4.0(Bluetooth LE | BLE | Bluetooth Smart)的精準微定位技術,當你的手持設備靠近一個Beacon基站時,設備就可以感應到Beacon信號,範圍能夠從幾毫米到50米。iBeacons相比較於原來的藍牙技術有幾個特色:json

  • 首先它不須要配對,因此你不用擔憂一個名爲『一頭母豬』的藍牙設備請求和你配對^_^。蘋果在以前對藍牙設備的控制比較嚴格,因此只有經過MFI認證過的藍牙設備才能與iDevice鏈接,而藍牙4.0就沒有這些限制了;
  • 準確與距離。普通的藍牙(藍牙4.0以前)通常的傳輸距離在0.1~10m,而iBeacons信號能夠精確到毫米級別,而且最大可支持到50m的範圍;
  • 功耗更低。其實藍牙4.0又叫低功耗藍牙,一個普通的鈕釦電池可供一個Beacon基站硬件使用兩年。

目前已經有很多硬件廠商都在生產Beacon發射硬件,文章配圖爲Estimote公司生產的寶石形狀的Beacon。固然並非非得購買這些Beacon硬件才能使用iBeacons技術,其實從iPhone 4S和iPad 3及後續設備都已經支持藍牙4.0,因此這些設備升級到iOS7都可以支持iBeacons,同時也能做爲Beacon發射基站使用。 蘋果在全美254家Apple Store中部署iBeacons不少就是直接使用iDevice做爲基站。ide

Passbook + iBeacons

在iOS7中,Passbook的功能全部加強,固然也少不了對iBeacons的支持,你只須要在pass.json文件中加入beacons字段,而後填寫上與該Pass相關的beacon基站信息,包括proximityUUIDmajorminor以及當該Pass接收到該beacon信號時須要顯示的文本relevantText。這樣,當你把這個包含beacons信息的Pass加入到Passbook,並靠近beacons中的某個基站時,該Pass的信息就會自動出如今手機的鎖屏界面上,並顯示relevantText中的文本。固然得有一個前提:手機打開藍牙。atom

"beacons":[
    {
     "proximityUUID" : "E2C56DB5-DFFB-48D2-B060-D0F5A71096E0",
     "relevantText" : "TechDay 2013 Beijing",
     "major" : 0,
     "minor" : 0
     }
  ],

和 locations 字段同樣,一個Pass文件中最多支持10個beacon基站信息。其實這樣作也是出於省電考慮,由於系統在每次接收到beacon信號時,都會在Passbook庫中輪詢每個Pass的beacons信息,匹配後纔將它顯示出來,因此若是不作數量限制,耗電量可能就難以接受,locations原理也相似。spa

iBeacons開發

Beacon Monitoring

由於是一種定位技術,蘋果將iBeacons相關的接口放到了 CoreLocation.framework 。在iOS7以前,咱們能夠經過CLRegion定義一個地理區域,來跟蹤設備在該區域內的運動狀況,iOS7以後,CLRegion被徹底變成了一個抽象類,子類CLCircularRegionCLBeaconRegion分別承擔實現一個地理區域和Beacon信號區域的功能。代理

即iOS7以後的CLRegion主要有兩個屬性:code

@interface CLRegion : NSObject <NSCopying, NSSecureCoding>
@property (nonatomic, assign) BOOL notifyOnEntry;
@property (nonatomic, assign) BOOL notifyOnExit;
@end

notifyOnEntrynotifyOnExit分別標記是否在進入和退出該區域時調用對用代理方法。CLBeaconRegion另外增長了一個屬性notifyEntryStateOnDisplay標記是否在用戶手機屏幕點亮時調用代理方法。接口

一個beacon基站主要有三個屬性,即上面說到過的:proximityUUID、 major、 minor,對應到CoreLocation中的CLBeacon類:ip

@interface CLBeacon : NSObject <NSCopying, NSSecureCoding>
//...
@property (readonly, nonatomic) NSUUID *proximityUUID;
@property (readonly, nonatomic) NSNumber *major;
@property (readonly, nonatomic) NSNumber *minor;
//...
@end

建立一個 CLBeaconRegion ,咱們須要先建立一個目標監控區域惟一的UUID:開發

NSUUID *myUUID = [[NSUUID alloc] initWithUUIDString:@"E2C56DB5-DFFB-48D2-B060-D0F5A71096E0"];
CLBeaconRegion *targetBeaconRegion = [[CLBeaconRegion alloc] initWithProximityUUID:myUUID identifier:@"TechDay 2013 Beijing"];

建立完Regoin後,咱們須要對該Region進行監控以獲取是否進入該區域及一些距離等信息,咱們須要建立一個CLLocationManager實例而後調用startMonitoringForRegion:方法來監控上面的BeaconRegion:部署

self.locationManager = [[CLLocationManager alloc] init];
self.locationManager.delegate = self;
[self.locationManager startMonitoringForRegion:targetBeaconRegion];

剩下的就是經過CLLocationManagerDelegate中的各個方法來獲取監控區域內的全部CLBeacon基站,進入或退出某個Beacon區域,計算舉例某個CLBeacon的距離等。

Beacon Broadcasting

前面咱們說到全部支持藍牙4.0的iDevice都可以做爲beacon基站發射信號,這就須要 CoreBluetooth.framework 的支持。 咱們須要建立一個CBPeripheralManager實例,而後發射beacon廣播信號:

//爲beacon基站建立一個惟一標示
NSUUID *myUUID = [[NSUUID alloc] initWithUUIDString:@"A4E86DC5-A0E2-G7W0-B060-A0F5A71096C0"];
CLBeaconRegion *myBeaconRegion = [[CLBeaconRegion alloc] initWithProximityUUID:myUUID identifier:@"iBeacons"];

//獲取該Beacon區域的信號信息
NSDictionary *peripheralData = [myBeaconRegion peripheralDataWithMeasuredPower:nil];

//建立並廣播Beacon信號
CBPeripheralManager *peripheralManager = [[CBPeripheralManager alloc] initWithDelegate:self queue:dispatch_get_main_queue()];
[peripheralManager startAdvertising:peripheralData];

固然你還須要在CBPeripheralManagerDelegate代理方法:peripheralManagerDidUpdateState:根據不一樣的狀態作一些處理。

總結

蘋果的偉大之處就是在於將複雜的技術以簡單的形式呈現出來,相信看完本文你已經對iBeacons開發相關的技術有了很好的瞭解,然而iBeacons技術自己的應用纔是真正體現價值的地方,相信它能給不少行業帶來變革。

Posted by TracyYih - 2013-12-15
如需轉載,請註明: 本文來自 Esoft Mobile

相關文章
相關標籤/搜索