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

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之iBeacon

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

iOS屏幕关闭时如何继续监控iBeacon?

设备重启后的 IOS8 iBeacon 监控

访问电池供电的 iBeacon 设备(主要是 kontakt io 设备)的电池电量?