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