在第一次加载 requestAuthorization 之后,viewDidLoad 的其余部分未执行,下一行跳转到委托函数 (swift 3)
After requestAuthorization on first load the rest of viewDidLoad isn't executed and the next line jumps to the delegate functions (swift 3)
我的应用似乎在每次使用时都运行良好,但第一次除外。
我要求用户授权,并且我在 plist 中有适当的键,但是在请求授权的行之后的其余 viewDidLoad 不执行。我在下面附加了断点,第一次使用应用程序时没有命中断点 2。
我很确定在获得授权后它会跳转到扩展中的 func locationManager。
我可以等到最后才请求授权,直到其他一切都设置好,但不确定这是最好的还是唯一的出路。
谢谢,
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)
}
}
您为什么请求对两件不同的事情进行授权?如果你请求并获得always授权,你不需要在使用时请求授权,因为这只是always授权的一个子集。
此外,这些都是异步函数,因此您不能在它们之后立即执行基于位置的代码,因为如果您还没有授权,requestAuthorization()
之后的代码将在您实际获得之前执行授权,因此不会调用函数,因为您还没有授权。
你必须在调用任何位置相关代码之前检查授权状态,例如locationManager.startUpdatingLocation()
,并且只有在状态被授权时才执行位置相关代码。如果未授权,则必须实现CLLocationManagerDelegate
的locationManager(_:didChangeAuthorization:)
函数,并在检查更改结果为授权状态后调用该函数内部的位置相关调用。
我的应用似乎在每次使用时都运行良好,但第一次除外。 我要求用户授权,并且我在 plist 中有适当的键,但是在请求授权的行之后的其余 viewDidLoad 不执行。我在下面附加了断点,第一次使用应用程序时没有命中断点 2。
我很确定在获得授权后它会跳转到扩展中的 func locationManager。
我可以等到最后才请求授权,直到其他一切都设置好,但不确定这是最好的还是唯一的出路。
谢谢,
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)
}
}
您为什么请求对两件不同的事情进行授权?如果你请求并获得always授权,你不需要在使用时请求授权,因为这只是always授权的一个子集。
此外,这些都是异步函数,因此您不能在它们之后立即执行基于位置的代码,因为如果您还没有授权,requestAuthorization()
之后的代码将在您实际获得之前执行授权,因此不会调用函数,因为您还没有授权。
你必须在调用任何位置相关代码之前检查授权状态,例如locationManager.startUpdatingLocation()
,并且只有在状态被授权时才执行位置相关代码。如果未授权,则必须实现CLLocationManagerDelegate
的locationManager(_:didChangeAuthorization:)
函数,并在检查更改结果为授权状态后调用该函数内部的位置相关调用。