我正在尝试使用iOS 10中的Swift 4构建iBeacons应用程序。许多资源推荐以下内容:

func locationManager(_ manager: CLLocationManager, didStartMonitoringFor region: CLRegion) {
manager.requestState(for: region)
}


处理应用程序在信标区域内启动时的情况。但是,这种方法在某些情况下似乎会引起副作用和时序错误。

现在,我发现此StackOverflow文章Understanding iBeacons in iOS指出,“ didDetermineState仅在开始监视时才自动调用”。

果不其然,如果我忽略了对requestState(for: region)的呼叫,而只是呼叫locationManager.startMonitoring(for: region),一切都将完美进行!

任何人都可以确认确实如此吗?如果我呼叫startMonitoring,那么是否不需要requestState

注意:在开始监视之前,我将notifyEntryStateOnDisplay设置为true。我想知道这是否与它有关。

最佳答案

是否需要调用locationManager.requestState(for: region)都取决于您的用例。

在以下情况下,回调locationManager(_ manager: CLLocationManager, didDetermineState state: CLRegionState, for region: CLRegion)将被自动调用:


首次开始监视时。
对于所有区域状态更改。这包括.outside-> .inside,.inside-> .outside以及与.unknown之间的转换
每当显示屏亮起时(仅当您设置受监视的BeaconRegion notifyEntryStateOnDisplay=true时)


因此,如果这些情况足以满足您的需要,则您无需请求其他回调。这通常是正确的。

但是,在一些罕见的用例中,显式请求新的回调很有用。也许您的应用提出了一个新的View Controller,然后希望以可视方式向用户显示区域状态。可以在加载视图时调用requestState,然后在进行回调时更新显示,这很方便。

由额外的回调引起的特定副作用和问题实际上取决于您在回调中放置的内容。如果您在这些回调中启动或停止监视,则很容易创建导致问题的反馈循环。

关于ios - CLLocationManager和iBeacons:是否需要requestState(用于:区域)?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52647637/

10-10 06:30