ios之iBeacon
Posted ZHZMAREN
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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的主要内容,如果未能解决你的问题,请参考以下文章
如何在 iOS、Swift 中搜索 iBeacons UUID,并扫描周围的所有 iBeacons