- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在监视定义为 beaconRegion1(房间 1)和 beaconRegion2(房间 2)的两个信标,并且我正在记录每个信标的进入和退出事件(因为我们想要计算在房间中花费的时间)。
由于 didExitRegion
触发时发生轻微延迟,我在记录退出时遇到了挑战。
现实世界:
时间0:00(分:秒):人员进入房间1。
时间10:00:人员退出1号房间。
时间10:15:人员进入2号房间。
时间20:00:人员退出2号房间。
Swift/iOS 世界:
时间 0:00:人员进入房间 1,didEnterRegion 为 beaconRegion1(房间 1)触发
时间 10:00:人员退出 1 号房间。蟋蟀鸣叫。
时间 10:15:人员进入房间 2,didEnterRegion 为 beaconRegion2(房间 2)触发
时间 10:30:didExitRegion 为 beaconRegion1(房间 1)延迟触发
时间 20:00 人员退出房间 2,但未检测到退出,因为退出 1 延迟了约 30 秒,因此在触发房间 2 进入后以编程方式发生。
简而言之,延迟允许第二次进入先于第一次退出,因此第二次退出永远不会触发。
我知道 didExitRegion
延迟是不可避免的。我很好奇是否有解决方法可以捕获此示例中的第二个导出,也许可以通过延迟 didEnterRegion 触发以允许第一个导出“ catch ”,或者可以为每个 beaconRegion 运行单独的 didEnter 和 didExit 函数? Swift 似乎有意强制我使用 CLRegion
或 CLBeaconRegion
作为 didEnterRegion
和 didExitRegion
的区域:参数。
代码示例:
let beaconRegion1 = CLBeaconRegion(uuid: UUID(uuidString: "...")!, major: 12345, minor: 12345, identifier: "Room1")
let beaconRegion2 = CLBeaconRegion(uuid: UUID(uuidString: "...")!, major: 23456, minor: 23456, identifier: "Room2")
func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
if status == .authorizedAlways {
if CLLocationManager.isMonitoringAvailable(for: CLBeaconRegion.self) {
startScanning()
}
}
}
func startScanning() {
locationManager?.startMonitoring(for: beaconRegion1)
locationManager?.startMonitoring(for: beaconRegion2)
}
func locationManager(_ manager: CLLocationManager, didEnterRegion region: CLRegion) {
guard region is CLBeaconRegion else {return}
print("Enter: \(region.identifer)")
}
func locationManager(_ manager: CLLocationManager, didExitRegion region: CLRegion) {
guard region is CLBeaconRegion else {return}
print("Exit: \(region.identifer)")
}
最佳答案
正如您自己所说,区域退出之前的延迟是不可避免的。 iOS 检测区域退出的方式是自上次检测到信标数据包以来已经过去了约 20 秒。
计算机程序的工作是将这些信标事件适应有意义的现实世界事件。 有无数种方法可以实现这一点,哪种解决方案合适完全取决于您尝试用程序解决的现实世界事件(“用例”)。
根据您的描述,听起来您想知道用户何时将手机从一个房间移动到另一个房间。有很多方法可以做到这一点,哪一种最好取决于我们系统的“要求”——房间相距多远?用户从一个房间移动到另一个房间的速度有多快?信标放置在房间内的哪里?您能同时看到两个房间的两个信标吗? 解决您的用例所需的正确算法取决于具体要求。
两个想法:
如果房间相距较远且信标可见性不会重叠:忽略区域导出。根据最后进入的区域确定您所在的房间。如果您的程序认为它已经在同一个房间中获得区域导出,那么您的程序应该确定它根本不在任何房间中。
如果房间足够近,信标可见度重叠:根本不要使用信标监控。相反,请使用信标测距,它每秒为您提供一次更新,其中包含所有可见信标的列表以及以米为单位的估计距离(beacon.accuracy)。您所在的房间由最近的信标决定。使用此方法时,您可能还想在最近的信标确定中添加一些“去抖”,以防止距离估计上的噪声来回跳动。一个简单的“去抖动”算法要求第二个信标比当前跟踪的房间信标至少近 10%,然后才会被认为是最接近的。您可以调整此百分比,以获得弹跳和时间延迟之间的最佳权衡,以确定下一个房间。
关于ios - Swift:didExitRegion 延迟导致错过信标事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59056476/
我是一名优秀的程序员,十分优秀!