iOS 中 iBeacon 开发
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS 中 iBeacon 开发相关的知识,希望对你有一定的参考价值。
参考技术A iBeacon 是苹果公司2013年9月发布的移动设备用OS(ios7)上配备的新功能。其工作方式是,配备有低功耗蓝牙(BLE)通信功能的设备使用BLE技术向周围发送自己特有的 ID,接收到该 ID 的应用软件会根据该 ID 采取一些行动。它采用了基于蓝牙4.0的低功耗蓝牙技术(Bluetooth Low Energy, BLE),主要是用作辅助室内定位的功能.
我们可以用iBeacon可以进行室内定位(车库,商场),智能打卡,提醒(离开某物体的时候,比如离开家)。
iBeacon中有两个角色:
发射者: 一般都是各种硬件
接收者: 一般都是智能终端(手机)
发射者通过BLE 的广告通信通道,以一定时间间隔向外广播数据包(一般是每秒两三次),接收者可以通过终端提供的功能来接收,达到信息的交互.
从iOS开发者的角度看: iBeacon 在 CoreLocation 框架中抽象为CLBeacon类, 该类有6个属性,分别是:
proximityUUID :是一个 NSUUID,用来标识公司。每个公司、组织使用的 iBeacon 应该拥有同样的 proximityUUID。
major :主要值,用来识别一组相关联的 beacon,例如在连锁超市的场景中,每个分店的 beacon 应该拥有同样的 major。
minor :次要值,则用来区分某个特定的 beacon。
proximity :远近范围的,一个枚举值。
accuracy :与iBeacon的距离。
rssi :信号轻度为负值,越接近0信号越强,等于0时无法获取信号强度。
只要进入iBeacon的范围,就能唤醒 App(大约10秒钟),即使在程序被杀掉的情况下。必要时,可以使用UIApplication类的
接收者提供了两种方式来接收iBeacon信号:
Monitoring : 可以用来在设备进入/退出某个地理区域时获得通知, 使用这种方法可以在应用程序的后台运行时检测iBeacon,但是只能同时检测20个region区域,并且不能够推测设备与iBeacon的距离.
Ranging : iOS 7之后提供的 API, 用于确定设备的近似距离iBeacon 技术,可以用来检测某区域内的所有iBeacons,并且可以精度估计发射者与接收者的距离。
iOS 中 iBeacon 是基于地理位置的微定位技术,虽然借助手机蓝牙进行接收Majro、Minor,但是他们在开发工程中没有任何关系。
iBeacon使用苹果提供CoreLocation库,然而在 BLE 在开发过程中使用CoreBluetooth库。从上面提供的库来看就很清楚了,特别是在 iOS8.0 之后的时候如果想使用iBeacon,必须让用户点击是否允许XXapp使用地理位置。如果在第一次使用 iOS App 扫描iBeacon的时候没有提示这句话,是不可能接收到iBeacon的信号(除非iOS 8.0之下)。如果是 BLE 则的开发过程中之需要提示用户打开蓝牙,并不要求其他的地理位置任何信息。
任何支持使用蓝牙低功耗共享数据的 iOS 设备都可以用作 iBeacon。
ios之iBeacon
什么是iBeacon?
2013年WWDC大会上,苹果推出iBeacon技术。该技术允许开发人员开发能够使用iBeacon硬件传感器的iOS应用程序,来为相应的应用程序提供更加精准的位置信息。2014年WWDC大会上,苹果表示,对iBeacon技术进行了改善,借助该技术,应用程序现在能够跟踪到用户所在的楼层的精确位置信息。
iBeacon服务将与Apple Store中的应用程序协同。如果你已经在手机上下载了iBeacon,并许可它对你进行跟踪,它会尝试为你提供适合您需求的零售经验。
目前,苹果已在其零售店中使用iBeacon,以此为顾客提供关于附近产品和服务等信息;沃尔玛等大型零售连锁企业也在对该技术进行测试。
iBeacon有哪些用途?
你可以想象这样一幅场景:
当你走进沃尔玛超市的时候,你手机中的购物清单会自动转化成一张个性化地图,并为你推荐最值得买的商品;当你站在一场音乐会门口的售票机前时,你拿出手机便可以一键完成门票的购买;当地走过当地的一个酒吧时,你可以在无需使用现金的情况下便完成付费、甚至给予小费……这些正是iBeacon带来的。
iBeacon对于苹果有哪些作用?
目前,苹果已经决定,利用商场超市等室内场所所分布的iBeacon设备,来绘制室内地图。
以地图测绘的角度来看,iBeacon设备将会发出有关建筑物分布、结构的信息,而用户手中的iPhone,将成为地图信息采集员。苹果将会把海量的信息整合,从而获得室内地图信息。另外,在商户提供粗略地图的前提下,苹果也可以利用iBeacon,对地图的精确性进行评估验证。
但苹果面临着巨大的挑战,因为谷歌是室内地图的领先者。早在2011年,谷歌室内地图就对外发布。覆盖的建筑物包括商场超市、机场、车站等建筑物。
在过去几年中,谷歌室内地图日臻完善,今年三月份,谷歌甚至宣布,将推出印度22个大城市的室内地图,令人不可思议的是,谷歌甚至可以告知用户所在楼层的电梯,到底是上行还是下行。
谷歌部分室内地图的绘制,依赖的是WiFi热点和移动通信基站等信息,如果苹果依靠大量iBeacon设备和用户的iPhone绘制地图,精度可能会超过谷歌。
2、布局智能家居
苹果向FCC提交的文件表示这是苹果公司第一个即将发布的智能家居设备。目前,苹果正在积极开发智能硬件,这款硬件设备将与苹果推出的智能家居技术HomeKit集成。
HomeKit允许iPad、iPhone和iPod touch等iOS设备连接到家用电器,如中央空调、车库门和门锁等。iBeacon传感器可以帮助苹果用户更好地使用HomeKit技术,因为它能为智能家居设备提供用户更精确的位置信息。文/沙瓦迪卡(简书作者)
原文链接:http://www.jianshu.com/p/7816b016ceac
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
iBeacon是苹果被允许能在后台运行的,不论你将应用退出到后台还是杀死,iBeacon都能激活应用不过只能激活10秒左右,但是这段时间足可以做很多事情了。
一.iBeacon的使用
开始监听你的Ibeacon。
在iOS8里面苹果改变了地位的开启方式(iBeacon的使用是基于蓝牙和定位的),首先要在工程里的info.plist增加字段NSLocationAlwaysUsageDescription(这个是允许一直在后台运行的)
接着在程序里添加
- (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status
if (status == kCLAuthorizationStatusAuthorizedAlways)
[self.locationmanager startMonitoringForRegion:self.beacon1];
.h文件
#import<UIKit/UIKit.h>
#import<CoreLocation/CoreLocation.h>
#import<CoreLocation/CoreLocation.h>
@interface ViewController : UIViewController<UITableViewDataSource,UITableViewDelegate,CLLocationManagerDelegate,>
@property (nonatomic, strong) NSArray *beaconArr;//存放扫描到的iBeacon
@property (strong, nonatomic) CLBeaconRegion *beacon1;//被扫描的iBeacon
@property (strong, nonatomic) CLLocationManager * locationmanager;
@end,,,
.m文件
#define BEACONUUID @"12334566-7173-4889-9579-954995439125"//iBeacon的uuid可以换成自己设备的uuid
- (void)viewDidLoad
[super viewDidLoad];
self.tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 20, 320, 400)];
self.tableView.delegate = self;
self.tableView.dataSource = self;
[self.view addSubview:self.tableView];
self.beaconArr = [[NSArray alloc] init];
self.locationmanager = [[CLLocationManager alloc] init];//初始化
self.locationmanager.delegate = self;
self.beacon1 = [[CLBeaconRegion alloc] initWithProximityUUID:[[NSUUID alloc] initWithUUIDString:BEACONUUID] identifier:@"media"];//初始化监测的iBeacon信息
[self.locationmanager requestAlwaysAuthorization];//设置location是一直允许
- (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status
if (status == kCLAuthorizationStatusAuthorizedAlways)
[self.locationmanager startMonitoringForRegion:self.beacon1];//开始MonitoringiBeacon
//发现有iBeacon进入监测范围
-(void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region
[self.locationmanager startRangingBeaconsInRegion:self.beacon1];//开始RegionBeacons
//找的iBeacon后扫描它的信息
- (void)locationManager:(CLLocationManager *)manager didRangeBeacons:(NSArray *)beacons inRegion:(CLBeaconRegion *)region
//如果存在不是我们要监测的iBeacon那就停止扫描他
if (![[region.proximityUUID UUIDString] isEqualToString:BEACONUUID])
[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);
......
self.beaconArr = beacons;
[self.tableView reloadData];
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
return self.beaconArr.count;
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
static NSString *ident = @"cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ident];
if (!cell)
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:ident];
CLBeacon *beacon = [self.beaconArr objectAtIndex:indexPath.row];
cell.textLabel.text = [beacon.proximityUUID UUIDString];
NSString *str;
switch (beacon.proximity)
case CLProximityNear:
str = @"近";
break;
case CLProximityImmediate:
str = @"超近";
break;
case CLProximityFar:
str = @"远";
break;
case CLProximityUnknown:
str = @"不见了";
break;
default:
break;
cell.detailTextLabel.text = [NSString stringWithFormat:@"%@ %ld %@ %@",str,beacon.rssi,beacon.major,beacon.minor];
return cell;
二.ibeacon的参数
uuid唯一标识此类iBeacon。
proximity远近范围的,有Near(在几米内),Immediate(在几厘米内),Far(超过 10 米以外,不过在测试中超不过10米就是far),Unknown(无效)
major和minor组合后区分同一类型下的iBeacon。
accuracy和iBeacon的距离
rssi信号轻度为负值,越接近0信号越强,等于0时无法获取信号强度
三.碎碎念
当进入iBeacon范围是会触发didEnterRegion方法,此时可能获取不到iBeacon的rssi ,proximity,accuracy值因为距离有点远,所一要在此时做些动作和这三个参数有关的话需要小心。
以上是关于iOS 中 iBeacon 开发的主要内容,如果未能解决你的问题,请参考以下文章