【问题标题】:Why does user location in MKMapView shows latitude 0.0 and longitude 0.0?为什么 MKMapView 中的用户位置显示纬度 0.0 和经度 0.0?
【发布时间】:2019-05-04 17:54:26
【问题描述】:

所有与此类似的堆栈溢出问题似乎都是针对Java和Android的。

我有以下使用 MKMapView 控件的代码。

override func viewDidLoad() {
    super.viewDidLoad()

    mapView.showsUserLocation = true
    mapView.setUserTrackingMode(.followWithHeading, animated: true)

    let locationCoordinate = CLLocationCoordinate2D(latitude: mapView.userLocation.coordinate.latitude, longitude: mapView.userLocation.coordinate.longitude)
    currentLocationCoordinateRegion = MKCoordinateRegion(center: locationCoordinate, latitudinalMeters: 200, longitudinalMeters: 200)

    mapView.setRegion(currentLocationCoordinateRegion, animated: true)

    print("latitude:", mapView.userLocation.coordinate.latitude, "longitude:", mapView.userLocation.coordinate.longitude)

}

我使用的是实际设备,因此地图视图应显示我的当前位置,打印语句应打印我当前的位置,但我在地图视图上看到蓝色,打印结果显示纬度 0.0 和调试窗口中0.0的经度:

纬度:0.0 经度:0.0

为什么会这样,我应该怎么做才能解决这个问题?

我在工具栏上还有一个条形按钮项,代码如下:

@IBAction func actionShow(_ sender: UIBarButtonItem) {

    print("latitude:", mapView.userLocation.coordinate.latitude, "longitude:", mapView.userLocation.coordinate.longitude)

    let locationCoordinate = CLLocationCoordinate2D(latitude: mapView.userLocation.coordinate.latitude, longitude: mapView.userLocation.coordinate.longitude)
    currentLocationCoordinateRegion = MKCoordinateRegion(center: locationCoordinate, latitudinalMeters: 200, longitudinalMeters: 200)

    mapView.setRegion(currentLocationCoordinateRegion, animated: true)

}

这会产生相同的结果。

【问题讨论】:

    标签: ios swift mapkit mkmapview currentlocation


    【解决方案1】:

    您必须请求访问用户位置的权限,这是您在viewDidLoad 中执行的第一个操作,然后在获得权限后继续显示用户位置,以下 UIViewController 将让您继续

    class ViewController: UIViewController {
    
        @IBOutlet var mapView: MKMapView!
        var locationManager: CLLocationManager?
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            mapView.delegate = self
            mapView.setUserTrackingMode(.followWithHeading, animated: true)
    
            self.checkLocationAuthorization()
        }
    
        func checkLocationAuthorization(authorizationStatus: CLAuthorizationStatus? = nil) {
            switch (authorizationStatus ?? CLLocationManager.authorizationStatus()) {
            case .authorizedAlways, .authorizedWhenInUse:
                mapView.showsUserLocation = true
            case .notDetermined:
                if locationManager == nil {
                    locationManager = CLLocationManager()
                    locationManager!.delegate = self
                }
                locationManager!.requestWhenInUseAuthorization()
            default:
                print("Location Servies: Denied / Restricted")
            }
        }
    
    }
    
    extension ViewController: MKMapViewDelegate, CLLocationManagerDelegate {
    
        func mapView(_ mapView: MKMapView, didUpdate userLocation: MKUserLocation) {
            let region = MKCoordinateRegion(center: userLocation.coordinate, latitudinalMeters: 200, longitudinalMeters: 200)
            mapView.setRegion(region, animated: true)
        }
    
        func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
            self.checkLocationAuthorization(authorizationStatus: status)
        }
    
    }
    

    您还必须在Info.plist 中包含以下属性,没有这些locationManager 将不会继续请求授权。

    <key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
    <string>Message for AlwaysAndWhenInUseUsageDescription</string>
    
    <key>NSLocationAlwaysUsageDescription</key>
    <string>Message for AlwaysUsageDescription</string>
    
    <key>NSLocationWhenInUseUsageDescription</key>
    <string>Message for WhenInUseUsageDescription</string>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-15
      • 1970-01-01
      相关资源
      最近更新 更多