Swift:didExitRegion延迟导致丢失信标事件

问题描述 投票:0回答:2

我正在监视定义为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似乎打算强迫我使用CLRegionCLBeaconRegion作为区域:didEnterRegiondidExitRegion的参数。

代码示例:

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)的两个信标,并且我正在记录每个信标的进入和退出事件(因为我们要计算在房间中花费的时间)。我是...
ios swift cllocationmanager ibeacon
2个回答
0
投票
正如您自己说的那样,不可避免地要延迟区域退出。 iOS检测到区域退出的方式是,自上次检测到信标包以来已过去了约20秒。

0
投票
根据@ Paulw11和@davidgyoung的回复进行了简化和解决。谢谢。如果我使用单个didDetermineState而不是单独的didEnterRegiondidExitRegion方法,则无论输入和退出事件的顺序如何,它都能正确跟踪每个区域的所有输入和退出事件。
© www.soinside.com 2019 - 2024. All rights reserved.