我正在监视定义为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。chi鸣叫。
时间10:15:人员进入房间2,didEnterRegion为beaconRegion2(房间2)开火
[[时间10:30:didExitRegion迟迟为beaconRegion1(1号房间)触发
[时间20:00人员退出2号会议室,但未检测到退出,因为1号出口被延迟了约30秒,因此在触发2号会议室的进入后以编程方式发生。简而言之,延迟允许第二个入口位于第一个出口之前,因此第二个出口永远不会触发。
我知道didExitRegion
延迟是不可避免的。我很好奇在此示例中是否有解决方法来捕获第二个出口,可能是通过延迟didEnterRegion触发时的时间来允许第一个出口“赶上”,或者可能是通过为每个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)")
}
我正在监视定义为beaconRegion1(房间1)和beaconRegion2(房间2)的两个信标,并且我正在记录每个信标的进入和退出事件(因为我们要计算在房间中花费的时间)。我是...
didDetermineState
而不是单独的didEnterRegion
和didExitRegion
方法,则无论输入和退出事件的顺序如何,它都能正确跟踪每个区域的所有输入和退出事件。