Сделать местоположение пользователя видимым на карте не работает - PullRequest
1 голос
/ 18 мая 2019

Если я запускаю свой код, округленная синяя точка не отображается на карте.местоположение пользователя, видимое на карте, не работает.Я не могу найти проблему для этого.Кто-нибудь, кто может найти проблему?

import UIKit
import MapKit
import CoreLocation

class GPSNewBin: UIViewController, CLLocationManagerDelegate {


    @IBOutlet weak var mapView: MKMapView!
    @IBOutlet weak var zurueckButton: UIButton!

    var locationManager = CLLocationManager()

    override func viewDidLoad() {
        super.viewDidLoad()

        // Ask for Authorisation from the User.
        self.locationManager.requestAlwaysAuthorization()

        // For use in foreground
        self.locationManager.requestWhenInUseAuthorization()

        if CLLocationManager.locationServicesEnabled() {
            locationManager.delegate = self
            locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters
            locationManager.startUpdatingLocation()
        }
    }


    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
        //guard let locValue: CLLocationCoordinate2D = manager.location?.coordinate else { return }
        let locValue: CLLocationCoordinate2D = manager.location!.coordinate
        print("locations = \(locValue.latitude) \(locValue.longitude)")
        let userLocation = locations.last
        let viewRegion = MKCoordinateRegion(center: (userLocation?.coordinate)!, latitudinalMeters: 600, longitudinalMeters: 600)
        self.mapView.setRegion(viewRegion, animated: true)
    }

}

Большое спасибо:)

Ответы [ 2 ]

1 голос
/ 18 мая 2019

Вы можете включить местоположение пользователя из раскадровки:

mapView

OR

Вы также можете включить его с помощью кода:

mapView.showsUserLocation = true
0 голосов
/ 18 мая 2019

Вы должны включить следующие свойства в Info.plist, без этого ваш запрос на авторизацию не будет работать.

<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>Message for AlwaysAndWhenInUseUsageDescription</string>

<key>NSLocationAlwaysUsageDescription</key>
<string>Message for AlwaysUsageDescription</string>

<key>NSLocationWhenInUseUsageDescription</key>
<string>Message for WhenInUseUsageDescription</string>

Используйте следующий метод для запроса авторизации в viewDidLoad, он также учитывает, когда местоположениесервисы запрещены приложению.

func checkLocationAuthorization(authorizationStatus: CLAuthorizationStatus? = nil) {
    switch (authorizationStatus ?? CLLocationManager.authorizationStatus()) {
    case .authorizedAlways, .authorizedWhenInUse:
        mapView.showsUserLocation = true
    case .notDetermined:
        locationManager.requestWhenInUseAuthorization()
    default:
        print("Location Servies: Denied / Restricted")
    }
}

checkLocationAuthorization в viewDidLoad

override func viewDidLoad() {
    super.viewDidLoad()

    if CLLocationManager.locationServicesEnabled() {
        locationManager.delegate = self
        locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters
        locationManager.startUpdatingLocation()
    }

    self.checkLocationAuthorization()
}

Вы также должны обновить статус авторизации, когда происходит CLLocationManagerDelegate.locationManager(_:didChangeAuthorization:), вы можете повторно используйте вышеуказанный метод, например так:

extension GPSNewBin: CLLocationManagerDelegate {

    func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
        self.checkLocationAuthorization(authorizationStatus: status)
    }

}

При обновлении местоположения в didUpdateLocations используйте обновленное местоположение пользователя, отправленное в userLocation.coordinate, например:

extension GPSNewBin: MKMapViewDelegate {

    func mapView(_ mapView: MKMapView, didUpdate userLocation: MKUserLocation) {
        let region = MKCoordinateRegion(center: userLocation.coordinate, latitudinalMeters: 600, longitudinalMeters: 600)
        mapView.setRegion(region, animated: true)
    }

}
...