iOS7虽然出来很长时间了,但是关于iOS7的iBeacon的技术以及知识是一点都不知道,目前关于iBeacon的技术介绍和成熟的产品也很少。但现在需要该技术的支持,自己就去大概的了解了下。当然,由于接触的时间短,也没有去详细的看官方的文档,所以可能会造成理解的不全面或者理解错误,但是在写这篇文章的时候,暂时就按自己的理解来说吧,至于错误或者不全面留给以后去解决吧。
1、什么是iBeacon技术?
iBeacons是苹果在WWDC 2013上有意无意透漏出来的一项重要功能,通过低功耗蓝牙(BluetoothLowEnergy)技术进行十分精确的微定位和室内导航,据悉其定位精度可以以厘米计算。iBeacon基站可以创建一个信号区域(如何创建没有去详细的了解,但是下面的例子会告诉你如何创建一个信号区域),当设备进入该区域时,相应的应用程序便会提示用户是否需要接入这个信号网络。实现iBeacons精准的微定位功能需要运行iOS 7且支持BLE的设备,比如iPhone4s以后的设备。
2.iBeacon的使用案例
当用户走进iBeacon基站信号覆盖区域内时,用户就会收到相关的提醒和询问。举个例子,当用户走到商场某个店面附近时,安装了相应app的用户就会收到由iBeacons基站发出的产品信息或者打折信息。苹果更是在254间Apple Store 里应用了iBeacon 技术。
相信大家都会有个有误解,认为推送消息是通过iBeacon基站下发的,其实不然。
iBeacon仅仅提供位置服务,推送消息功能需要您去开发一款APP软件,并安装到用户手机中,在后台挂载相应服务程序。例如进入iBeacons广播范围的用户手机收到商场打折促销信息,信息是由手机上的应用去获取的,而不是保存在iBeacons里。
具体实现过程是:当APP软件接收到iBeacon广播的位置信息后,经过一定计算来获取自己的当前位置,当计算出来的位置符合您设定的特定条件时,APP向您的广告数据服务器请求对应内容并呈现给用户,到此完成一条消息的推送。也就是说要实现动态的信息推送,至少需要一个APP软件和一个数据服务器。当然如果仅向用户呈现固定内容,则数据服务器不是必须的。
4.实现个iBeacon的Demo
文中所用的demo是我们用来展示如何检测和处理来自beacon的广播,但首先我们需要创建一款app来担当beacon的角色--没有其他功能,只是用来广播信号。然后再写个app来担当接受者。最后,我们将有代表双方沟通的两款app。
iBeacons是iOS 7引入的新技术,所以我们需要两部运行iOS 7并支持BLE的设备,比如iPhone 4S以上设备,iPad mini以及iPad 3以后设备。同时,为了在设备上部署app,你还需要是苹果iOS开发者计划(99美元)的成员。
前提准备:打开你的终端,在Finder下的应用程序->实用工具 下,然后输入:uuidgen获取一个UUID的字符串,记住它。
iBeacon广播的是什么?它是一个UUID,类似:C293726B-63BF-420A-9D79-92C71F67536A。beacon会不断地广播该UUID,并且接收方app会用同样的UUID检测信号。所以要准备好一个UUID。
接着在Xcode中创建一个新的Single View Application,命名为BeaconBroadcast,在mainstoryboard里面的ViewContrller的view里面加入一个Button和Label控件,如下图,将button名称改为Broadcast。
然后利用辅助编辑器,在ViewController.h文件里创建Label的
在ViewnController.m文件里再创建一个Button事件
然后,再给工程添加必需的框架,CoreBluetooth.framework和CoreLocation.framework.并在viewcontroller.h文件中#import进去
#import <CoreLocation/CoreLocation.h>
#import <CoreBluetooth/CoreBluetooth.h>
并且定义如下几个变量,结果如图
接着在viewncontroller.m文件的ViewDidLoad方法中写下你刚才创建的UUID
上边的代码中,我们创建了一个新的NSUUID对象。
然后,我们设置了一个CLBeaconRegion,并通过那个UUID进行初始化,major number,minor number 以及identifier。如果你所处的位置内有一大堆数据,major number和minor number就是用来识别你的beacons。在上边百货的例子中,每个department会有一个特定的major number--识别一组beacons,在店内,每个beacon会有一个特定的minor number。
通过major number和minor number ,你将能精确识别哪个beacon被获取了。最后,标识符是该区域唯一的ID。
在之前我们设置的buttonClicked method中,我们添加如下代码:
在上述代码中,我们调用了“peripheralDataWithMeasuredPower:” ,它可以给我们提供即将进行广播的beacon data。
当Bluetooth外围设备状态改变时会触发该方法。所以在该方法中,我们要检查当前设备处于什么状态。如果Bluetooth处于打开状态,我们将会更新我们的标签,调用“startAdvertising”方法,并把传递beacon data进行广播。相反,如果Bluetooth处于关闭状态,我们将会停止广播。如果不熟悉苹果蓝牙API的童鞋,可能不理解这一步,建议先去看下苹果蓝牙接口的文档,熟悉下蓝牙从发现外设并和外设进行通信的整个流程。
现在把app部署至设备,打开Bluetooth并点击按钮,系统就会广播你的UUID!现在我们要创建一个接收方的app来检测和处理广播。注意,模拟器不能使用Bluetooth,所以不能通过模拟器进行广播。为了把app部署至支持BLE的真实设备上(iPhone 4S and up, iPad mini and iPad 3 and up),你需要加入苹果开发者计划。
设置另一个Single View Application,并命名为“BeaconReceiver”
打开Main.storyboard,在view中添加单个UILabel,该Label会显示接收机有没有进入iBeacon广播的范围。
最后打开ViewController.h,在文件顶部添加CoreLocation框架,并调整类声明使之遵从CLLocationManagerDelegate协议,该协议包含一个delegate method,可以让我们知道最新监测到的beacons。
监测Beacons
现在打开ViewController.m,在“viewDidLoad” 方法中,我们将要初始化locationManager,把我们设置为它的委托。我们也将开始监控想要的beacon。
这里那串UUID和identifer要和第一个工程(BeaconBroadcast)的UUID和identifier一致,因为接收机会和broadcast机对这两个参数进行匹配,匹配一致之后,才会进行相应的操作。其实,发送机一直再对这两个参数进行广播,接收机进入这个区域之后会接收到这两个参数,如果发现这两个参数是我感兴趣的,我就可以进行相应的操作了。
在第20和第21行代码中,我们把locationManager初始化为CLLocationManager的新实例,然后把我们设置为它的委托,这样当更新时就会通知我们。
这两个方法是CLLocationManagerDelegate的委托,当设备进入区域或者离开区域时会被调用。当区域被检测,我们通知locationManager开始寻找区域内的beacons。
最后再执行下面的一个方法:
这个委托,就在statusLabel上显示,接收机找到了一个匹配的iBeacon.当一个或者更多beacons被检测时,该方法将会被失效。在上述代码中,你可以看到我们如何获得UUID,来自beacon的major和minor数据。另外,虽然我们上边并未执行,但你可以遍历beacons array,并通过检测近距离的beacon属性来决定哪一个是最近的。
然后在两台iOS7之后和支持BLE的两台iP设备上,分别运行这两个程序,我是用iPad Air作为接收机即(BeaconReceiver的程序),iPhone4s作为广播机
(两个工程的下载地址广播机 http://download.csdn.net/detail/christ_beings/7212101 接收机的:http://download.csdn.net/detail/christ_beings/7212139)