代码之家  ›  专栏  ›  技术社区  ›  Mike

在第一次加载时请求授权后,viewDidLoad的其余部分不会执行,下一行跳转到委托函数(swift 3)

  •  1
  • Mike  · 技术社区  · 7 年前

    我请求用户授权,我在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)    
            }
    }
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   Dávid Pásztor    7 年前

    你为什么要求授权两件不同的事情?如果您请求并获得always授权,您不需要在使用授权时请求,因为这只是always授权的一个子集。

    此外,这两个函数都是异步函数,因此您不能在它们之后立即执行基于位置的代码,因为如果您尚未获得授权,则代码将在它们之后立即执行 requestAuthorization()

    在调用任何与位置相关的代码之前,您必须检查授权状态,例如 locationManager.startUpdatingLocation() 并且仅在状态为授权的情况下执行位置相关代码。如果未经授权,您必须实施 CLLocationManagerDelegate locationManager(_:didChangeAuthorization:) 函数并在检查更改结果是否为授权状态后调用该函数内与位置相关的调用。