CLLocationManager 和 iBeacons:requestState(for: region) 有必要吗?

Posted

技术标签:

【中文标题】CLLocationManager 和 iBeacons:requestState(for: region) 有必要吗?【英文标题】:CLLocationManager and iBeacons: is requestState(for: region) necessary? 【发布时间】:2018-10-04 13:12:31 【问题描述】:

我正在尝试在 ios 10 中使用 Swift 4 构建 iBeacons 应用。许多来源推荐以下内容:

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

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

现在,我发现这篇 *** 文章 Understanding iBeacons in iOS 指出,“didDetermineState 仅在您开始监控时自动调用”。

果然,如果我不打电话给requestState(for: region),只打电话给locationManager.startMonitoring(for: region),一切都会完美!

谁能证实确实如此?如果我打电话给startMonitoring,那么就不需要requestState了吗?

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

【问题讨论】:

【参考方案1】:

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

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

    当您第一次开始监控时。 适用于所有区域状态更改。这包括 .outside -> .inside、.inside -> .outside 以及与 .unknown 之间的转换 只要显示屏亮起(仅当您设置了受监控的BeaconRegionnotifyEntryStateOnDisplay=true

因此,如果这些情况对您来说足够了,那么您不需要请求额外的回调。这通常是正确的。

但是,在一些罕见的用例中,显式请求新回调会很有帮助。也许您的应用程序呈现了一个新的视图控制器,然后想要直观地向用户显示区域状态。方便的是可以在视图加载的时候调用requestState,然后在回调的时候更新显示。

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

【讨论】:

以上是关于CLLocationManager 和 iBeacons:requestState(for: region) 有必要吗?的主要内容,如果未能解决你的问题,请参考以下文章

CLLocationManager 和 iPhone 中的航向度数

CLLocationManager,核心数据和数组

CLLocationManager 和 distanceFilter?

Xcode 6 为啥 CLLocationManager 没有返回纬度和经度

插值和预测 CLLocationManager

HKWorkoutRouteBuilder 和 CLLocationManager 仅增量添加路线更新