一、iBeacon简介
- Core Location框架提供了两种检测用户进入和离开某一区域的方式:
地理区域监测
和信标区域监测
(iOS7.0及以上)。 - 地理区域是由地球表面上的一个已知点和指定半径的圆所定义的区域。相反,信标区域是由设备到蓝牙低耗能信标的距离所定义的区域。
- 信标是指能够广播一种特殊的蓝牙低耗能有效载荷的简单设备——你甚至可以把你的iOS设备变成一个信标。
二、搜索附近iBeacon设备列表
1.与蓝牙设备的不同
- 搜索附近蓝牙设备:打开蓝牙开关,初始化CBCentralManager后,直接调用实例的scanForPeripherals即可开始扫描。
- 搜索附近iBeacon设备:需要指定要搜索的iBeacon的UUID才能开始扫描。
注意:这里需要使用定位模块,而不是蓝牙模块!
2. CLBeaconRegion类与iBeacon
- 一个信标设备iBeacon由proximityUUID、major、minor三个值来确定,可以理解为一级分类、二级分类、三级分类。
- 信标区域监测一般用在由几个小区域组成的大区域中,比如博物馆。假设一共需要5个iBeacon,分别安装在5个不同的展览区。那么5个iBeacon的proximityUUID就可以设置为相同值(比如***),major分别设置为1、2、3、4、5。
- 使用CLBeaconRegion初始化扫描区域(即要监测的iBeacon设备列表),如下:
let beaconRegion1 = CLBeaconRegion(proximityUUID: proximityUUID, identifier: "com.mycompany.myregion")
3.检查信标区域监测的可用性
获取iBeacon设备列表使用authorizedWhenInUse
权限即可。
//设备是否支持使用指定类进行区域监测
let isMonitoringAvailable = CLLocationManager.isMonitoringAvailable(for: CLBeaconRegion.self)
if isMonitoringAvailable == true {
//APP是否取得定位权限
locationManager = CLLocationManager()
locationManager.delegate = self
let authorizationStatus = CLLocationManager.authorizationStatus()
if authorizationStatus == .notDetermined {
locationManager.requestWhenInUseAuthorization()
}
}
4.获取定位权限后,开始扫描指定UUID的iBeacons
locationManager.startRangingBeacons(in: beaconRegion1)
5.在CLLocationManagerDelegate的代理方法中获取扫描到的iBeacons
func locationManager(_ manager: CLLocationManager, didRangeBeacons beacons: [CLBeacon], in region: CLBeaconRegion) {
for beacon in beacons {
print("\(beacon.proximityUUID)+++\(beacon.major)+++\(beacon.minor)+++\(beacon.rssi)+++\(beacon.accuracy)")
}
}
三、监听某一iOS设备进入或离开信标区域
1. 同二、2
2. 同二、3
3. 检查信标区域监测的可用性
监听进入或离开信标区域需要使用authorizedAlways
权限。
4.获取定位权限后,开始监听指定UUID的iBeacons
locationManager.startMonitoring(for: beaconRegion1)
5.CLLocationManagerDelegate的代理方法
- 已经开始监听
func locationManager(_ manager: CLLocationManager, didStartMonitoringFor region: CLRegion) {
// 异步获取region的状态
locationManager.requestState(for: beaconRegion1)
}
- 获取到知道region的状态后,可以执行相应的业务逻辑
func locationManager(_ manager: CLLocationManager, didDetermineState state: CLRegionState, for region: CLRegion) {
if state == .inside {
print("已进入监测区域")
}
else {
//...
}
}
- 进入监测区域回调
func locationManager(_ manager: CLLocationManager, didEnterRegion region: CLRegion) {
print("已进入监测区域")
}
- 离开监测区域回调
func locationManager(_ manager: CLLocationManager, didExitRegion region: CLRegion) {
print("已离开监测区域")
}
如果在iBeacon覆盖范围内或覆盖范围外启动startMonitoring,那么didDetermineState可能不会立即反映出当前所处的位置状态(didEnterRegion和didExitRegion都不会正确调用),需要等待app在当前位置运行一会才会有效。
网友评论