CLLocationManager和iBeacons:是否需要requestState(用于:区域)?

时间:2018-10-04 13:12:31

标签: ios swift core-location ibeacon

我正在尝试在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。我想知道这是否与它有关。

1 个答案:

答案 0 :(得分:0)

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

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

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

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

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

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