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对于苹果有哪些作用?

1、挑战谷歌(微博)地图

目前,苹果已经决定,利用商场超市等室内场所所分布的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

iOS 多久监控一次 iBeacons?

iOS:如何确定广播作为 iBeacon 的功耗?

iOS 7-iBeacon:当应用程序关闭时,如何从 iBeacon 获取比其 UUID 更多的数据?

IOS:手机锁定时iBeacon扫描频率?

iOS 在前台无法再次找到 iBeacon