Apple iBeacons

iBeacons是Apple在iOS 7里加入的新特性,可以用它来做各种炫酷的事情。

但是关于iBeacons的中文资料实在是少啊,最近看了一些来给自己总结一下。

首先这有一篇老外写的教程挺不错,英文好的建议读一读,然后cocoachina上这篇译文介绍的也不错,最后也就是Apple官方的一部分文档


 什么是iBeacons

“通过使用低功耗蓝牙技术(Bluetooth Low Energy,也就是通常所说的Bluetooth 4.0或者Bluetooth Smart),iBeacon基站可以创建一个信号区域,当设备进入该区域时,相应的应用程序便会提示用户是否需要接入这个信号网络。通过能够放置在任何物体中的小型无线传感器和低功耗蓝牙技术,用户便能使用iPhone来传输数据。”


举个栗子:现在有个大型商场,商场里有很多品牌的商店都配备了各自的iBeacon基站,当你进入某个iBeacon基站的信号区域内,你的手机上就会被推送这个品牌最近的折扣信息、新品推荐之类的信息(当然你必须安装特定的App才行)。有没有很炫酷?


好了,把iBeacon捧的多炫多酷毕竟不是我的工作,弄些干货才是重点!XD


刚开始接触iBeacon我也是一头雾水,这东西是怎么定位的?是怎么推送消息的?怎么识别基站的?

别急,慢慢来嘛。


既然说iBeacon是一个基站,那么可以暂且把它想成是一个wifi热点,而且是没有加密的wifi热点。好了,wifi需要一个SSID是吧,iBeacon基站也有一个类似SSID的东西。

它叫做proximityUUID,除了proximityUUID,一个iBeacon基站还可能拥有major,minor属性。为什么说可能呢,因为major和minor两个属性是可选的,所以一个iBeacon基站开启后就拥有如下几个属性:

proximityUUID(必须)

major(可选)

minor(可选)

如上三个属性就可以用来帮助我们的App识别一个iBeacon基站了。下面再来举个栗子解释一下这三个属性:

设想一下这么个场景,我们需要在每个省的省博物馆里部署这样一套系统,每进入一个展厅,我手机上的App就能自动弹出关于这个展厅的介绍(是不是很炫酷!?)。

那么我们就可以这样来部署我们的iBeacon基站:

首先我们需要一个proximityUUID,这个UUID可以在Mac上的终端键入命令“uuidgen”来生成。每个iBeacon基站都使用统一的proximityUUID,简单来说,这个proximityUUID是帮助我们的App找到能和这个App一起工作的iBeacon基站用的。

major和minor的值可以按这样的规则来定义:每个省份的major不同,比如浙江省的我用7,广东省的我用4,就是使用major来区别不同的博物馆啦。minor的值可以根据展厅的不同而不同,就是用minor的值来区别同一博物馆下不同的展厅啦。Apple的文档里关于major和minor的类型都是16位的无符号整形数,一般来说都够用了吧。


介绍完iBeacon的基站,下面来说说在App里到底是怎么工作的。

首先需要知道iBeacon在iOS上有两种工作模式:

1. Monitoring

2. Ranging

Monitoring用来监测是否进入到一个iBeacon的基站区域内,Ranging则用来获取这个区域内所有iBeacon的信息(因为可能同时发现多个iBeacon基站)。

注:

1. 两种模式可以同时运行,只是调用的delegate methods不同。

2. 当App进入到后台后,Monitoring可以继续运行,而Ranging则不行!这点很重要!


iOS中,我们可以通过调用startMonitoringForRegion:来运行Monitoring模式。调用startRangingBeaconsInRegion:来运行Ranging模式。

简单的实例代码如下:


首先初始化一个CLLoactionManager对象

self.locationManager = [[CLLocationManager alloc] init];
self.locationManager.delegate = self;

然后使用locationManager来开启Monitoring

NSUUID *uuid = [[NSUUID alloc] initWithUUIDString:UUID];
<pre name="code" class="objc">self.beaconRegion = [[CLBeaconRegion alloc] initWithProximityUUID:uuid
     identifier:@"com.iBeacon"];
region.notifyOnEntry = YES;
region.notifyOnExit = YES;
region.notifyEntryStateOnDisplay = YES;
    
[self.locationManager startMonitoringForRegion:region];
 

startMonioringForRegion方法调用后,如果手机监测到进入或者离开一个iBeacon基站区域,delegate就会调用

这两个方法。

然后可以在locationManager:didEnterRegion:方法中调用

[self.locationManager startRangingBeaconsInRegion:self.beaconRegion];
来开启Ranging模式。

当离开、进入一个iBeacon区域或者于基站距离发生变化时,location Manger就会调用didRangeBeacons:inRegion:方法。

先来看一个didRangeBeacons:inRegion:方法的实现,它是一个delegate methods。下面这段实例代码来自Apple官方的demo

// Delegate method from the CLLocationManagerDelegate protocol.

- (void)locationManager:(CLLocationManager *)manager

        didRangeBeacons:(NSArray *)beacons

               inRegion:(CLBeaconRegion *)region {

 

   if ([beacons count] > 0) {

      CLBeacon *nearestExhibit = [beacons firstObject];

 

      // Present the exhibit-specific UI only when

      // the user is relatively close to the exhibit.

      if (CLProximityNear == nearestExhibit.proximity) {

         [self presentExhibitInfoWithMajorValue:nearestExhibit.major.integerValue];

      } else {

         [self dismissExhibitInfo];

   }

}

这里有几个值得注意的地方。

该方法传递了两个参数,(NSArray *)beacons和(CLBeaconRegion *)region。这个beacons数组里的元素是按照距离排序的,所以取出数组中的第一个beacon就是离我们最近的那个ibeacons基站(当然这里也会有误差,不能保证真实距离就是最短的)。

CLBeacons类中有如下几个属性

proximityUUID, major, minor, proximity, accuracy, rssi. 前三个属性在前面提到过,不再赘述。

proximity属性是一个枚举类型,用来衡量距离的大小,它没有具体的数值,只用了

    CLProximityUnknown,
    CLProximityImmediate,
    CLProximityNear,
    CLProximityFar

几个值来划分距离,从远到近分别是CLProximityUnknown, CLProximityFar, CLProximityNear, CLProximityImmediate.

accuracy表示以米为单位的精度

rssi表示接受到的信号的强度

所以在这个didRangeBeacons:inRegion:方法内,你就可以做自己想做的事情啦~XD


顺道一提,locationManager:didExitRegion:方法不太灵敏,大概有30s的延迟,locationManager:didEnterRegion:方法的反应就非常快,google了一下说是Apple那边的原因。想深入了解的可以戳我


先写这么多,如果有小伙伴对iBeacon有兴趣也可以一起讨论~

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值