版本记录
版本号 | 时间 |
---|---|
V1.0 | 2017.11.26 |
前言
很多的app都有定位功能,比如说滴滴,美团等,他们都需要获取客户所在的位置,并且根据位置推送不同的模块数据以及服务,可以说,定位方便了我们的生活,接下来这几篇我们就说一下定位框架
CoreLocation
。感兴趣的可以看我写的上面几篇。
1. CoreLocation框架详细解析 —— 基本概览(一)
2. CoreLocation框架详细解析 —— 选择定位服务的授权级别(二)
3. CoreLocation框架详细解析 —— 确定定位服务的可用性(三)
4. CoreLocation框架详细解析 —— 获取用户位置(四)
5. CoreLocation框架详细解析 —— 监控用户与地理区域的距离(五)
6. CoreLocation框架详细解析 —— 确定接近iBeacon(六)
Overview
了解如何从iOS设备广播iBeacon
信号。
任何支持使用蓝牙低功耗共享数据的iOS设备都可以转换成iBeacon。 使用底层iOS设备作为iBeacon的应用程序必须在前台运行。 因此,无论如何都要使用此功能的point-of-sale apps
或运行在前台的应用程序。 对于其他类型的iBeacon实现,请使用来自第三方制造商的专用信标硬件。 要将iOS设备用作iBeacon,请执行以下操作:
- 为您的设备获取或生成一个128位的UUID。
- 创建一个包含UUID值的
CLBeaconRegion
对象,以及适合您的信标的主要和次要值。 - 使用
Core Bluetooth
框架来发布信标信息。
Get a UUID for Your Device - 获取设备的UUID
识别iBeacon的主要方式是来自其UUID。 在部署一个或多个信标时,您需要为每个信标分配一个UUID,以将信标的用途传达给客户。 一个信标的确切目的是你定义的东西。 例如,department store chain
可能为其所有已部署的信标使用相同的UUID,或者每个商店可能会分配一个不同的UUID。 因为检测涉及使用区域监视来查找具有特定UUID的信标,所以使用更少的UUID更容易管理。
要为iBeacon
部署创建新的UUID,请使用uuidgen
命令行工具。 打开终端并在命令行上键入uuidgen,然后按回车键。 此工具会生成一个唯一的128位值,并将其格式化为由连字符打断的ASCII字符串,如Listing 1
所示。
// Listing 1 Generating a UUID from the command line
$ uuidgen
39ED98FF-2900-441A-802F-9C398FC199D2
Configure the CLBeaconRegion Object - 配置CLBeaconRegion对象
使用CLBeaconRegion
对象来配置您的信标的身份。 您可以使用信标区域生成一个信息字典,您可以稍后通过蓝牙进行宣传。 Listing 2
显示了如何创建一个信标区域对象并填充信息。
// Listing 2 Configuring your beacon's identity
func createBeaconRegion() -> CLBeaconRegion? {
let proximityUUID = UUID(uuidString:
"39ED98FF-2900-441A-802F-9C398FC199D2")
let major : CLBeaconMajorValue = 100
let minor : CLBeaconMinorValue = 1
let beaconID = "com.example.myDeviceRegion"
return CLBeaconRegion(proximityUUID: proximityUUID!,
major: major, minor: minor, identifier: beaconID)
}
UUID,主要值和次要值是特定于您的iBeacon实施的。 您决定这些值的含义,并决定应用程序如何检测您的信标并解释这些值。
Advertise Your Beacon Over Bluetooth - 通过蓝牙广告您的信标
要从iOS设备上广播信标的身份,请使用Core Bluetooth框架将iOS设备配置为Bluetooth外围设备。 当配置为外设时,您的iOS设备将使用蓝牙硬件向其他设备广播其信标信息。 其他设备使用该信息来执行测距并检测其与iOS设备的距离。
将Core Bluetooth
框架添加到您的Xcode项目。 在你的代码中,创建一个CBPeripheralManager
对象并调用它的startAdvertising:
方法来开始广播你的信标数据。 startAdvertising:
方法使用包含信标信息的字典参数。 调用您之前创建的CLBeaconRegion
的peripheralDataWithMeasuredPower:
方法,以获取包含与您的信标相关联的数据的字典。
// Listing 3 Advertising your device over Bluetooth
func advertiseDevice(region : CLBeaconRegion) {
let peripheral = CBPeripheralManager(delegate: self, queue: nil)
let peripheralData = region.peripheralData(withMeasuredPower: nil)
peripheral.startAdvertising(((peripheralData as NSDictionary) as! [String : Any]))
}
调用peripheralDataWithMeasuredPower:
方法获取数据字典时,通常会传递nil来指定与iOS设备关联的默认接收信号强度指示器(RSSI)值。 此参数表示从离设备一米远处测得的信号强度(以分贝为单位)。 如果您需要在某些环境中校准设备以获得更好的测距性能,则可以指定自定义值。
在创建外围管理器peripheral manager
对象时,它会调用其委托对象的peripheralManagerDidUpdateState:
方法。 您必须实施此代表方法,以确保在iOS设备上支持并使用蓝牙低功耗。
重要说明:将您的应用程序广播为信标后,您的应用程序必须继续在前台运行以播放所需的蓝牙信号。 如果用户退出应用程序,则系统停止通过蓝牙将该设备作为外设通告。
在测距期间,可能会有一段短暂的时间,Core Location
为同一个iOS设备创建两个CLBeacon
对象。 出现这种情况的原因是iOS定期更改设备的蓝牙标识以保护用户的隐私,一个信标代表旧的标识,一个信标代表新的标识。 在标识符更改的2秒内,具有旧标识符的信标将其接近度属性设置为CLProximityUnknown
。 在10秒钟之内,旧的标识符不再被报告。
后记
未完,待续~~~