我不清楚苹果启动位置监控的意图。假设我想请求"始终"身份验证,并获得startUpdatingLocation()
启用的位置回调。requestAlwaysAuthorization()
的苹果文档说:
当当前授权状态为.notDetermination或.authorizedWhenUse…时,您可以调用requestAlwaysAuthorization((。用户响应此提示后,您的应用程序将无法再请求Always授权。再次调用此方法将无效。
这意味着我们应该在调用它之前检查状态。然而,authorizationStatus()
上的文档说:
不需要使用authorizationStatus((。相反,实现locationManager(_:didChangeAuthorization:(委托回调以接收最新的授权状态。
那么,即使您已经拥有权限,您是否应该在启动时始终调用requestAlwaysAuthorization()
,然后在didChangeAuthorization
回调中获得"授权"状态时调用startUpdatingLocation()
?回调是否保证会发生?或者,无论是否获得授权回调,您都应该直接调用startUpdatingLocation()
,并在权限允许时开始获取更新?最后一点是我在测试中看到的,但我不想在这方面与苹果的指导方针相冲突。
当你像这样启动时,你应该调用requestAlwaysAuthorization((-
override func viewDidLoad() {
super.viewDidLoad()
locationManager = CLLocationManager()
locationManager?.delegate = self
locationManager?.requestAlwaysAuthorization()
}
然后在得到结果后调用startUpdatingLocation((
func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
if status == .authorizedAlways {
// start updating location here
}
}
总是调用didChangeAuthorization,如果用户已经授予权限,代码将正常执行,否则当用户授予权限时,代码将在匹配条件后执行。