iBeacons是蘋果在2013年WWDC上推出一項基於藍牙4.0(Bluetooth LE | BLE | Bluetooth Smart)的精準微定位技術,當你的手持設備靠近一個Beacon基站時,設備就可以感應到Beacon信號,範圍能夠從幾毫米到50米。iBeacons相比較於原來的藍牙技術有幾個特色:json
目前已經有很多硬件廠商都在生產Beacon發射硬件,文章配圖爲Estimote公司生產的寶石形狀的Beacon。固然並非非得購買這些Beacon硬件才能使用iBeacons技術,其實從iPhone 4S和iPad 3及後續設備都已經支持藍牙4.0,因此這些設備升級到iOS7都可以支持iBeacons,同時也能做爲Beacon發射基站使用。 蘋果在全美254家Apple Store中部署iBeacons不少就是直接使用iDevice做爲基站。ide
在iOS7中,Passbook的功能全部加強,固然也少不了對iBeacons的支持,你只須要在pass.json文件中加入beacons
字段,而後填寫上與該Pass相關的beacon基站信息,包括proximityUUID
、major
、minor
以及當該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相關的接口放到了 CoreLocation.framework 。在iOS7以前,咱們能夠經過CLRegion定義一個地理區域,來跟蹤設備在該區域內的運動狀況,iOS7以後,CLRegion被徹底變成了一個抽象類,子類CLCircularRegion
和CLBeaconRegion
分別承擔實現一個地理區域和Beacon信號區域的功能。代理
即iOS7以後的CLRegion主要有兩個屬性:code
@interface CLRegion : NSObject <NSCopying, NSSecureCoding> @property (nonatomic, assign) BOOL notifyOnEntry; @property (nonatomic, assign) BOOL notifyOnExit; @end
notifyOnEntry
和notifyOnExit
分別標記是否在進入和退出該區域時調用對用代理方法。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的距離等。
前面咱們說到全部支持藍牙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