iBeacon在iOS 7之后的版本中有內(nèi)置庫呵曹,直接引入就可以使用
#import<CoreLocation/CoreLocation.h>//自身作為基站
#import<CoreBluetooth/CoreBluetooth.h>//作為連接基站的設(shè)備
首先對(duì)幾個(gè)重要參數(shù)作一下說明:
uuid 唯一標(biāo)識(shí),唯一標(biāo)識(shí)此類iBeacon
major 主要值
minor 次要值
主要值與次要值能夠使你區(qū)分使用相同UUID的不同iBeacon設(shè)備召娜。(在將手機(jī)模擬為iBeacon廣播時(shí),可將一些信息作為major或者minor廣播)注意major與minor為16 位無符號(hào)整數(shù)则果。
proximity 遠(yuǎn)近范圍趋惨,包含三種情況:
CLProximityFar 10米以外
CLProximityImmediate 幾米范圍之內(nèi)
CLProximityNear 幾厘米范圍內(nèi)
rssi 信號(hào)強(qiáng)度,為負(fù)值次坡,越接近0表示信號(hào)強(qiáng)度越大钩乍,距離越近
一.自身作為基站
需要遵循協(xié)議? CBPeripheralManagerDelegate
聲明管理者屬性
@property (strong, nonatomic) CBPeripheralManager *peripheraManager;
初始化辞州,queue為nil時(shí)會(huì)在主線程使用
_peripheraManager = [[CBPeripheralManager alloc] initWithDelegate:self queue:dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)];
接下來是兩個(gè)主要代理。更新狀態(tài) 寥粹,只有狀態(tài)可用的時(shí)候才能夠進(jìn)行創(chuàng)建服務(wù)变过,發(fā)布等等操作
- (void)peripheralManagerDidUpdateState:(CBPeripheralManager *)peripheral{
if (peripheral.state == CBPeripheralManagerStatePoweredOn) {
NSDictionary *peripheralData = nil;
CLBeaconRegion * region = [[CLBeaconRegion alloc] initWithProximityUUID:UUID major:0 minor:1 identifier:[UUID UUIDString]];
peripheralData = [region peripheralDataWithMeasuredPower:nil];
if(peripheralData)
{
[self.peripheraManager startAdvertising:peripheralData];//開始廣播
}
}
}
開始向外廣播數(shù)據(jù)? 當(dāng)startAdvertising被執(zhí)行的時(shí)候調(diào)用這個(gè)代理方法,可以接收到一些錯(cuò)誤信息
- (void)peripheralManagerDidStartAdvertising:(CBPeripheralManager *)peripheral error:(NSError *)error{
NSLog(@"Failed advertising: %@", error);
}
二.作為設(shè)備連接基站
需要遵循協(xié)議? CLLocationManagerDelegate
聲明一個(gè)屬性
@property (strong, nonatomic) CLLocationManager * locationManager;
@property (strong, nonatomic) CLBeaconRegion *beaconRegion;
初始化
self.locationmanager = [[CLLocationManager alloc] init];//初始化
self.locationmanager.delegate = self;
self.beaconRegion = [[CLBeaconRegion alloc] initWithProximityUUID:[[NSUUID
alloc] initWithUUIDString:UUID]];//初始化監(jiān)測(cè)的iBeacon信息
[self.locationManager requestAlwaysAuthorization];//設(shè)置location是一直允許
[self.locationManager startRangingBeaconsInRegion:self.beaconRegion];
代理
錯(cuò)誤處理
- (void)locationManager:(CLLocationManager *)manager monitoringDidFailForRegion:(CLRegion *)region withError:(NSError *)error {
NSLog(@"Failed monitoring region: %@", error);
}
- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error {
NSLog(@"Location manager failed: %@", error);
}
//發(fā)現(xiàn)有iBeacon進(jìn)入監(jiān)測(cè)范圍
-(void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region{
[self.locationManager startRangingBeaconsInRegion:self.beaconRegion];//開始RegionBeacons
}
在 iBeacon 到達(dá)范圍內(nèi)涝涤、離開范圍或某個(gè) iBeacon 的范圍改變時(shí)被調(diào)用媚狰。
- (void)locationManager:(CLLocationManager *)manager didRangeBeacons:(NSArray *)beacons inRegion:(CLBeaconRegion *)region{
//如果存在不是我們要監(jiān)測(cè)的iBeacon那就停止掃描他
if (![[region.proximityUUID UUIDString] isEqualToString:[UUID UUIDString]]){
[self.locationManager stopMonitoringForRegion:region];
[self.locationManager stopRangingBeaconsInRegion:region];
}
//打印所有iBeacon的信息
for (CLBeacon* beacon in beacons) {
NSLog(@"rssi is :%ld",beacon.rssi);
NSLog(@"beacon.proximity %ld",beacon.proximity);
}
}