Есть ли способ создать pin-код (аннотацию) в MKMapView на основе текущего местоположения пользователей?

#swift #xcode #mapkit #spotify

#swift #xcode #mapkit #spotify

Вопрос:

В целом, я пытаюсь создать приложение, которое использует Spotify API, цель приложения заключается в том, чтобы на основе текущей песни, которую пользователь слушает на Spotify, нажатием кнопки песня отображалась в виде pin-кода. В настоящее время я застрял в попытке создать pin-код на основе текущего местоположения пользователей, который остается там при нажатии кнопки.

У меня пока есть код, который динамически следует за пользователем в MKMapView

 import UIKit
import MapKit
import CoreLocation

class MapScreen: UIViewController {

    @IBOutlet weak var mapView: MKMapView!

    let locationManager = CLLocationManager()
    let regionInMeters: Double = 1000
    let newPin = MKPointAnnotation()

    override func viewDidLoad() {
        super.viewDidLoad()
        checkLocationServices()
    }


    func setupLocationManager() {
        locationManager.delegate = self
        locationManager.desiredAccuracy = kCLLocationAccuracyBest
    }


    func centerViewOnUserLocation() {
        if let location = locationManager.location?.coordinate {
            let region = MKCoordinateRegion.init(center: location, latitudinalMeters: regionInMeters, longitudinalMeters: regionInMeters)
            mapView.setRegion(region, animated: true)
        }
    }


    func checkLocationServices() {
        if CLLocationManager.locationServicesEnabled() {
            setupLocationManager()
            checkLocationAuthorization()
        } else {
            // Show alert letting the user know they have to turn this on.
        }
    }


    func checkLocationAuthorization() {
        switch CLLocationManager.authorizationStatus() {
        case .authorizedWhenInUse:
            mapView.showsUserLocation = true
            centerViewOnUserLocation()
            locationManager.startUpdatingLocation()
            break
        case .denied:
            // Show alert instructing them how to turn on permissions
            break
        case .notDetermined:
            locationManager.requestWhenInUseAuthorization()
        case .restricted:
            // Show an alert letting them know what's up
            break
        case .authorizedAlways:
            break
        }
    }


    //    class pinedSong: NSObject , MKAnnotation {
    //        let title: String?
    //        let artist: String?
    //        let coordinate: CLLocationCoordinate2D
    //
    //        init(title: String, artist: String, coordinate: CLLocationCoordinate2D)
    //        {
    //            self.title = title
    //            self.artist = artist
    //            self.coordinate = coordinate
    //
    //            super.init()
    //        }
    //    }
    //
    //
    //
    //
    //    @IBAction func btnPinSong(_ sender: UIButton) {
    //
    //
    //
    //
    //}
    //    func pinMaker(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
    //        //Get Current Location
    //        let location = locations.last! as CLLocation
    //        let userLocation:CLLocation = locations[0] as CLLocation
    //        let myAnnotation: MKPointAnnotation = MKPointAnnotation()
    //        myAnnotation.coordinate = CLLocationCoordinate2DMake(userLocation.coordinate.latitude, userLocation.coordinate.longitude)
    //        myAnnotation.title = "Current location"
    //        mapView.addAnnotation(myAnnotation)
    //
    //    }
    //

}

extension MapScreen: CLLocationManagerDelegate {

    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
        guard let location = locations.last else { return }
        let region = MKCoordinateRegion.init(center: location.coordinate, latitudinalMeters: regionInMeters, longitudinalMeters: regionInMeters)
        mapView.setRegion(region, animated: true)
    }


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



}
  

На данный момент все, что мне нужно для работы, — это кнопка, которая устанавливает pin-код на основе текущего местоположения пользователя, который остается.

Комментарии:

1. Когда вы работаете с mapkit, вы определенно можете показать местоположение пользователя. если вы хотите просто закрепить его, возможно, имеет смысл получить координаты местоположения пользователя в определенный момент времени, а затем создать pin-код вместо вызова user location (который может обновляться) Кроме того, если вы используете местоположение пользователя, убедитесь, что вы можете его показать: developer.apple.com/documentation/mapkit/mkmapview /…

Ответ №1:

Вы можете использовать locationManager.location для получения текущего местоположения пользователей.

 @IBAction func btnPinSong(_ sender: UIButton) {
    //Get Current Location
    guard let userLocation = self.locationManager.location else {
        return
    }

    let myAnnotation: MKPointAnnotation = MKPointAnnotation()
    myAnnotation.coordinate = CLLocationCoordinate2DMake(userLocation.coordinate.latitude, userLocation.coordinate.longitude)
    myAnnotation.title = "Current location"
    mapView.addAnnotation(myAnnotation)
}
  

Комментарии:

1. Большое вам спасибо, сделали именно то, что я хотел!

2. Если я собираюсь сохранить эти pin-коды в базе данных, как вы думаете, каким был бы лучший способ сделать это?

3. На вашем месте я бы использовал Firestore: firebase.google.com/docs/reference/android/com/google/firebase /…