#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 /…