我的应用程序似乎在每次使用时都能正常工作,除了第一次使用。 我请求用户授权,并且我在 plist 中有适当的键,但在请求授权的行之后的其余部分不会执行。我在下面附加了断点,第一次使用应用程序时不会命中断点 2。
我很确定在获得授权后,它只会跳转到扩展中的 func 位置管理器。
我可以等到最后才请求授权,直到其他一切都设置好,但不确定这是最好的还是唯一的出路。
谢谢
class MapController: UIViewController, GMSMapViewDelegate {
var locationManager = CLLocationManager()
var currentLocation: CLLocation?
@IBOutlet var mapView: GMSMapView!
override func viewDidLoad(){
super.viewDidLoad()
locationManager = CLLocationManager()
--------------------------> breakpoint 1
locationManager.requestAlwaysAuthorization()
locationManager.requestWhenInUseAuthorization()
-------------------------> breakpoint 2
locationManager.desiredAccuracy = kCLLocationAccuracyBest
locationManager.distanceFilter = 50
locationManager.startUpdatingLocation()
locationManager.delegate = self
guard let lat = locationManager.location?.coordinate.latitude else {return}
guard let lng = locationManager.location?.coordinate.longitude else {return}
mapView.settings.compassButton = true
mapView.settings.myLocationButton = true
mapView.isMyLocationEnabled = true
let camera = GMSCameraPosition.camera(withLatitude: lat, longitude: lng, zoom: 1)
mapView.camera = camera
mapView.delegate = self
getData()
}
extension MapController: CLLocationManagerDelegate {
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
guard let location: CLLocation = locations.last else {return}
let camera = GMSCameraPosition.camera(withLatitude: location.coordinate.latitude, longitude: location.coordinate.longitude, zoom: 1)
mapView.animate(to: camera)
}
}
为什么你要求授权两件不同的事情?如果您请求并获得始终授权,则无需在使用授权时请求,因为这只是始终授权的一个子集。
此外,这些都是异步函数,因此您不能在它们之后立即执行基于位置的代码,因为如果您还没有授权,则requestAuthorization()
之后的代码将在您实际获得授权之前执行,因此不会调用函数,因为您还没有授权。
在调用任何与位置相关的代码(例如locationManager.startUpdatingLocation()
(之前,您必须检查授权状态,并且仅在状态为"已授权"时才执行与位置相关的代码。如果未授权,则必须实现CLLocationManagerDelegate
的locationManager(_:didChangeAuthorization:)
函数,并在检查更改结果是否为授权状态后调用该函数内与位置相关的调用。