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:uuididentifier:@"com.iBeacon"];
region.notifyOnEntry = YES;
region.notifyOnExit = YES;
region.notifyEntryStateOnDisplay = YES;[self.locationManager startMonitoringForRegion:region];

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

  • locationManager:didEnterRegion:

  • locationManager:didExitRegion:

这两个方法。

然后可以在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 *)managerdidRangeBeacons:(NSArray *)beaconsinRegion:(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有兴趣也可以一起讨论~

Apple iBeacons相关推荐

  1. Apple苹果公司组织架构

    Apple苹果公司组织架构 这种模式,自乔布斯回到苹果时,开始实施,一直保留到现在. 今天,苹果大学校长兼副总裁 Joel Podolny 在<哈佛商业评论>上发表了一篇题为<How ...

  2. ios5中apple增加了解析JSON的api——NSJSONSerialization。

    ios5中apple增加了解析JSON的api--NSJSONSerialization.网上已经有人做过测试,NSJSONSerialization在效率上完胜SBJSON.TouchJSON.YA ...

  3. 使用 Flash Builder 的 Apple iOS 开发过程

    使用 Flash Builder 的 Apple iOS 开发过程 iOS 开发和部署过程概述 构建.调试或部署 iOS 应用程序前的准备工作 在测试.调试或安装 iOS 应用程序时选择的文件 将应用 ...

  4. Codeforces Round #417:E. FountainsSagheer and Apple Tree(树上博弈)

    Codeforces Round #417:E. FountainsSagheer and Apple Tree(树上博弈) 标签: codeforces 2017-06-02 11:41 29人阅读 ...

  5. Apple的LZF算法解析

    有关LZF算法的相关解析文档比较少,但是Apple对LZF的开源,可以让我们对该算法进行一个简单的解析.LZFSE 基于 Lempel-Ziv ,并使用了有限状态熵编码.LZF采用类似lz77和lzs ...

  6. apple hosts

    2019独角兽企业重金招聘Python工程师标准>>> #Apple #125.56.202.7 swcnd.apple.com 203.69.138.34 a1.phobos.ap ...

  7. apple id无法创建_我如何为我的Apple收藏夹创建网站

    apple id无法创建 A while ago I started an Apple collection. I've been following Apple hardware (and its ...

  8. 创建新的apple id_Google是新的Apple吗?

    创建新的apple id by Sumit Gupta 由Sumit Gupta Google是新的Apple吗? (Is Google the new Apple?) 随着众多设备的推出,谷歌试图击 ...

  9. apple id无法创建_我们如何使用Apple的学习框架来创建我们的第一个应用程序

    apple id无法创建 by Jonata Corrêa 由JonataCorrêa 我们如何使用Apple的学习框架来创建我们的第一个应用程序 (How we used Apple's learn ...

最新文章

  1. 2022-2028年中国聚合物气体分离膜行业市场发展模式及投资前景分析报告
  2. WP8.1学习系列(第一章)——添加应用栏
  3. php未正确拼写字 css,前端Bug解决方案
  4. [java进阶]4.关键字throws和throw
  5. eclipse 安装svn插件 及试用
  6. swift3 0 流控制
  7. 嵌入网站的挖矿代码——Cryptoloot
  8. python之celery使用详解一
  9. Qt连接SQL Server 2014数据库
  10. 解析Hibernate中的持久化—ORM
  11. 音视频采集-摄像头视频采集(原理与实现)
  12. 系统启动故障恢复控制台应用实例
  13. leetcodeOj:66. Plus One
  14. 趣味三大彩蛋命令安装shell脚本
  15. 啊,CET6 2021年
  16. 有活着的感觉就有未来————《时生》读后感
  17. 免费的几个CDN加速
  18. suspend(挂起)和resume(继续执行)线程
  19. 为表中的某个字段添加check约束
  20. 推荐一个快速获取时间的插件 Moment.js

热门文章

  1. 拉黑的微信好友怎么恢复,拉黑的微信好友聊天记录还在吗
  2. 计算机应用课程的体会,计算机课程心得体会
  3. 坦克大战第一节——画出自己的坦克(新手篇)
  4. 如何给物体添加阴影效果
  5. 根据计算机配置设置bios,设置BIOS让计算机每天都按时自动开机
  6. puber們這一季的愛情啊
  7. 中国大学生计算机设计大赛英语,中国大学生计算机设计大赛
  8. 【tensorflow 读取图片方式】本地文件名读取以及url方式读取
  9. Sam Altman 山姆奥特曼:强化学习进展 Reinforcement Learning Progress
  10. Cadence orcad 导出网表(.asc文件)