gpt4 book ai didi

ios - 需要 iBeacon locationManager :didEnterRegion to trigger at near physical contact when backgrounded

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:25:14 28 4
gpt4 key购买 nike

这是我的挑战。我有一个配置为 iBeacon 的 gimbal 系列 20,我的目标是让我的用户将他们的手机与应用程序后台的信标保持近距离物理接触。想想苹果支付。

我已将发射功率一直设置为 -23,但它仍然太强,并且信标正在触发 DidEnterRegion 委托(delegate)方法,距离可达一英尺。使用测距,我可以通过直接测量 rssi 来进一步设定阈值。该解决方案在应用程序运行时运行良好。我的问题是这个解决方案在后台运行不可靠,因为它在 enterRegion 事件后仅运行几秒钟然后停止。

有没有办法进一步抑制信标的信号强度或其他方式导致 locationManger:DidEnterRegion: 触发较低的 rssi 读数?

最佳答案

一旦您在后台启用了信标测距(见下文),您将在委托(delegate)函数 locationManager(_:didRangeBeacons:inRegion)< 的实现中检查接近度 Immediate 的信标.

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 ...
}
}

如果手机距离小于 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
}
}

此函数通常从派生自 CLLocationManagerDelegate 的类的 init() 函数中调用。如果您的设备完全支持测距,则此功能会请求位置更新授权。然后,它将 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()
}

仅在需要时停止和启动信标测距是延长手机电池生命周期的一种措施。

我已经详细描述了背景中的信标测距in a recent post .以上是我的帖子的简化版本。

关于ios - 需要 iBeacon locationManager :didEnterRegion to trigger at near physical contact when backgrounded,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34685338/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com