在后台启用信标测距后(见下文),您Immediate
将在委托函数的实现中检查具有接近性的信标locationManager(_:didRangeBeacons:inRegion)
。
func locationManager(manager: CLLocationManager, didRangeBeacons beacons: [CLBeacon], inRegion region: CLBeaconRegion) {
let immediateBeacons = beacons.filter() { $0.proximity == .Immediate }
if !immediateBeacons.isEmpty {
let tappedBeacon = immediateBeacons.first!
// Your code for processing tappedBeacon ...
}
}
Immediate
如果手机距离小于 30 厘米(默认传输功率),信标就会接近。如果进一步降低发射功率,可以降到5-10cm。tappedBeacon
上面代码中的信标是您用手机轻敲或几乎要用手机触摸的信标。
那是容易的部分。在后台保持信标范围内的活动有点棘手。
首先,您必须在项目设置的“功能”部分的“后台模式”下启用“位置更新”。这会在项目的Info.plist文件中产生以下条目:
<key>UIBackgroundModes</key>
<array>
<string>location</string>
<string>audio</string>
</array>
其次,您需要以CLLocationManager
正确的方式初始化一个对象:
func initLocating() {
if CLLocationManager.isRangingAvailable() {
self.locationManager.requestWhenInUseAuthorization()
self.locationManager.desiredAccuracy = kCLLocationAccuracyThreeKilometers
self.locationManager.allowsBackgroundLocationUpdates = true
self.locationManager.delegate = self
}
}
这个函数通常是从init()
你的类的函数中调用的CLLocationManagerDelegate
。如果您的设备完全支持测距,则此功能会请求位置更新授权。然后,它将 设置desiredAccuracy
为kCLLocationAccuracyThreeKilometers
,这将关闭除蜂窝塔三角测量之外的任何定位方法。这不是后台更新所必需的,但它可以使手机的电池寿命更长。
对于后台测距,必须允许后台更新allowsBackgroundLocationUpdates = true
. 函数的最后一行简单地将这个类设为 ,只要可见信标或其属性发生变化,CLLocationManagerDelegate
就会触发该函数。locationManager(_:didRangeBeacons:inRegion)
第三,您必须在需要时开始位置更新。这可能是应用程序的整个生命周期,也可能是由某个条件触发的。
func startLocating() {
self.locationManager.startUpdatingLocation()
self.locationManager.startRangingBeaconsInRegion(CLBeaconRegion(proximityUUID: self.proximityID, identifier: "AllBeacons"))
}
第一次调用通常会开始位置更新。如果没有这个调用,后台的信标测距最终将停止。第二个调用专门为您感兴趣的信标区域启动信标范围。它触发locationManager(_:didRangeBeacons:inRegion)
.
如果您可以停止测距信标一段时间,您可以使用以下功能。它只是 的倒数startLocating()
。
func stopLocating() {
self.locationManager.stopRangingBeaconsInRegion(CLBeaconRegion(proximityUUID: self.proximityID, identifier: "AllBeacons"))
self.locationManager.stopUpdatingLocation()
}
仅在需要时停止和启动信标测距是延长手机电池寿命的一种措施。
我在最近的一篇文章中详细描述了背景中的信标测距。以上是我帖子的精简版。