什麼是iBeacons
iBeacons是蘋果在2013年WWDC上推出一項基於藍牙4.0(Bluetooth LE | BLE | Bluetooth Smart)的精準微定位技術,當你的手持設備靠近一個Beacon基站時,設備就能夠感應到Beacon信號,範圍可以從幾毫米到50米。iBeacons相比較於原來的藍牙技術有幾個特點:
1.首先它不需要配對,所以你不用擔心一個名爲『一頭母豬』的藍牙設備請求和你配對^_^。蘋果在之前對藍牙設備的控制比較嚴格,所以只有通過MFI認證過的藍牙設備才能與iDevice連接,而藍牙4.0就沒有這些限制了;
2.準確與距離。普通的藍牙(藍牙4.0之前)一般的傳輸距離在0.1~10m,而iBeacons信號可以精確到毫米級別,並且最大可支持到50m的範圍;
3.功耗更低。其實藍牙4.0又叫低功耗藍牙,一個普通的鈕釦電池可供一個Beacon基站硬件使用兩年。
目前已經有不少硬件廠商都在生產Beacon發射硬件,文章配圖爲Estimote公司生產的寶石形狀的Beacon。當然並不是非得購買這些Beacon硬件才能使用iBeacons技術,其實從iPhone 4S和iPad 3及後續設備都已經支持藍牙4.0,所以這些設備升級到iOS7都能夠支持iBeacons,同時也能作爲Beacon發射基站使用。 蘋果在全美254家Apple Store中部署iBeacons很多就是直接使用iDevice作爲基站。
Passbook + iBeacons
在iOS7中,Passbook的功能所有增強,當然也少不了對iBeacons的支持,你只需要在pass.json文件中加入beacons字段,然後填寫上與該Pass相關的beacon基站信息,包括proximityUUID、major、minor以及當該Pass接收到該beacon信號時需要顯示的文本relevantText。這樣,當你把這個包含beacons信息的Pass加入到Passbook,並靠近beacons中的某個基站時,該Pass的信息就會自動出現在手機的鎖屏界面上,並顯示relevantText中的文本。當然得有一個前提:手機打開藍牙。
- "beacons":[
- {
- "proximityUUID" : "E2C56DB5-DFFB-48D2-B060-D0F5A71096E0",
- "relevantText" : "TechDay 2013 Beijing",
- "major" : 0,
- "minor" : 0
- }
- ],
和 locations 字段一樣,一個Pass文件中最多支持10個beacon基站信息。其實這樣做也是出於省電考慮,因爲系統在每次接收到beacon信號時,都會在Passbook庫中輪詢每一個Pass的beacons信息,匹配後纔將它顯示出來,所以如果不做數量限制,耗電量可能就難以接受,locations原理也類似。
iBeacons開發
Beacon Monitoring
因爲是一種定位技術,蘋果將iBeacons相關的接口放到了 CoreLocation.framework 。在iOS7之前,我們可以通過CLRegion定義一個地理區域,來跟蹤設備在該區域內的運動情況,iOS7之後,CLRegion被完全變成了一個抽象類,子類CLCircularRegion和CLBeaconRegion分別承擔實現一個地理區域和Beacon信號區域的功能。
即iOS7之後的CLRegion主要有兩個屬性:
- @interface CLRegion : NSObject
- @property (nonatomic, assign) BOOL notifyOnEntry;
- @property (nonatomic, assign) BOOL notifyOnExit;
- @end
notifyOnEntry和notifyOnExit分別標記是否在進入和退出該區域時調用對用代理方法。CLBeaconRegion另外增加了一個屬性notifyEntryStateOnDisplay標記是否在用戶手機屏幕點亮時調用代理方法。
一個beacon基站主要有三個屬性,即上面說到過的:proximityUUID、 major、 minor,對應到CoreLocation中的CLBeacon類:
- @interface CLBeacon : NSObject
- //...
- @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技術本身的應用纔是真正體現價值的地方,相信它能給很多行業帶來變革。