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: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相关推荐
- Apple苹果公司组织架构
Apple苹果公司组织架构 这种模式,自乔布斯回到苹果时,开始实施,一直保留到现在. 今天,苹果大学校长兼副总裁 Joel Podolny 在<哈佛商业评论>上发表了一篇题为<How ...
- ios5中apple增加了解析JSON的api——NSJSONSerialization。
ios5中apple增加了解析JSON的api--NSJSONSerialization.网上已经有人做过测试,NSJSONSerialization在效率上完胜SBJSON.TouchJSON.YA ...
- 使用 Flash Builder 的 Apple iOS 开发过程
使用 Flash Builder 的 Apple iOS 开发过程 iOS 开发和部署过程概述 构建.调试或部署 iOS 应用程序前的准备工作 在测试.调试或安装 iOS 应用程序时选择的文件 将应用 ...
- Codeforces Round #417:E. FountainsSagheer and Apple Tree(树上博弈)
Codeforces Round #417:E. FountainsSagheer and Apple Tree(树上博弈) 标签: codeforces 2017-06-02 11:41 29人阅读 ...
- Apple的LZF算法解析
有关LZF算法的相关解析文档比较少,但是Apple对LZF的开源,可以让我们对该算法进行一个简单的解析.LZFSE 基于 Lempel-Ziv ,并使用了有限状态熵编码.LZF采用类似lz77和lzs ...
- apple hosts
2019独角兽企业重金招聘Python工程师标准>>> #Apple #125.56.202.7 swcnd.apple.com 203.69.138.34 a1.phobos.ap ...
- apple id无法创建_我如何为我的Apple收藏夹创建网站
apple id无法创建 A while ago I started an Apple collection. I've been following Apple hardware (and its ...
- 创建新的apple id_Google是新的Apple吗?
创建新的apple id by Sumit Gupta 由Sumit Gupta Google是新的Apple吗? (Is Google the new Apple?) 随着众多设备的推出,谷歌试图击 ...
- apple id无法创建_我们如何使用Apple的学习框架来创建我们的第一个应用程序
apple id无法创建 by Jonata Corrêa 由JonataCorrêa 我们如何使用Apple的学习框架来创建我们的第一个应用程序 (How we used Apple's learn ...
最新文章
- 2022-2028年中国聚合物气体分离膜行业市场发展模式及投资前景分析报告
- WP8.1学习系列(第一章)——添加应用栏
- php未正确拼写字 css,前端Bug解决方案
- [java进阶]4.关键字throws和throw
- eclipse 安装svn插件 及试用
- swift3 0 流控制
- 嵌入网站的挖矿代码——Cryptoloot
- python之celery使用详解一
- Qt连接SQL Server 2014数据库
- 解析Hibernate中的持久化—ORM
- 音视频采集-摄像头视频采集(原理与实现)
- 系统启动故障恢复控制台应用实例
- leetcodeOj:66. Plus One
- 趣味三大彩蛋命令安装shell脚本
- 啊,CET6 2021年
- 有活着的感觉就有未来————《时生》读后感
- 免费的几个CDN加速
- suspend(挂起)和resume(继续执行)线程
- 为表中的某个字段添加check约束
- 推荐一个快速获取时间的插件 Moment.js
热门文章
- 拉黑的微信好友怎么恢复,拉黑的微信好友聊天记录还在吗
- 计算机应用课程的体会,计算机课程心得体会
- 坦克大战第一节——画出自己的坦克(新手篇)
- 如何给物体添加阴影效果
- 根据计算机配置设置bios,设置BIOS让计算机每天都按时自动开机
- puber們這一季的愛情啊
- 中国大学生计算机设计大赛英语,中国大学生计算机设计大赛
- 【tensorflow 读取图片方式】本地文件名读取以及url方式读取
- Sam Altman 山姆奥特曼:强化学习进展 Reinforcement Learning Progress
- Cadence orcad 导出网表(.asc文件)