Swift CoreLocation使用❗️ – 定位與地圖操作教學
Swift CoreLocation 是一個可以讓開發者取得使用者位置的框架,可以讓開發者在 App 中加入定位與地圖操作的功能,讓 App 更加完整。本文將介紹如何使用 Swift CoreLocation 來取得使用者位置,並且將位置顯示在地圖上。
CoreLocation 基本概念
CoreLocation 是一個用來取得使用者位置的框架,可以取得使用者的經緯度,並且可以將經緯度轉換成地址,也可以將地址轉換成經緯度。
CoreLocation 實作
首先,我們需要在 info.plist 中加入 Privacy – Location When In Use Usage Description,這個欄位是用來讓使用者知道 App 將會取得使用者位置,並且讓使用者同意取得位置的訊息。
接著,我們需要在 ViewController 中加入 CLLocationManager,並且設定 delegate,讓 ViewController 可以接收 CLLocationManager 的回傳訊息。
接著,我們需要在 ViewController 中加入 MKMapView,並且設定 delegate,讓 ViewController 可以接收 MKMapView 的回傳訊息。
最後,我們需要在 ViewController 中實作 CLLocationManagerDelegate 與 MKMapViewDelegate 的方法,讓 ViewController 可以接收 CLLocationManager 與 MKMapView 的回傳訊息,並且將取得的位置顯示在地圖上。
CLLocationManagerDelegate 實作
首先,我們需要在 ViewController 中實作 CLLocationManagerDelegate 的方法,讓 ViewController 可以接收 CLLocationManager 的回傳訊息,並且將取得的位置顯示在地圖上。
首先,我們需要在 ViewController 中加入 CLLocationManager,並且設定 delegate,讓 ViewController 可以接收 CLLocationManager 的回傳訊息。
let locationManager = CLLocationManager()
locationManager.delegate = self
接著,我們需要在 ViewController 中實作 CLLocationManagerDelegate 的方法,讓 ViewController 可以接收 CLLocationManager 的回傳訊息,並且將取得的位置顯示在地圖上。
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
guard let location = locations.last else { return }
let center = CLLocationCoordinate2D(latitude: location.coordinate.latitude, longitude: location.coordinate.longitude)
let region = MKCoordinateRegion.init(center: center, latitudinalMeters: regionInMeters, longitudinalMeters: regionInMeters)
mapView.setRegion(region, animated: true)
}
最後,我們需要在 ViewController 中呼叫 CLLocationManager 的 requestWhenInUseAuthorization 方法,讓使用者可以同意取得位置的訊息。
locationManager.requestWhenInUseAuthorization()
MKMapViewDelegate 實作
接著,我們需要在 ViewController 中加入 MKMapView,並且設定 delegate,讓 ViewController 可以接收 MKMapView 的回傳訊息。
let mapView = MKMapView()
mapView.delegate = self
接著,我們需要在 ViewController 中實作 MKMapViewDelegate 的方法,讓 ViewController 可以接收 MKMapView 的回傳訊息,並且將取得的位置顯示在地圖上。
func mapView(_ mapView: MKMapView, regionDidChangeAnimated animated: Bool) {
let center = getCenterLocation(for: mapView)
let geoCoder = CLGeocoder()
guard let previousLocation = self.previousLocation else { return }
guard center.distance(from: previousLocation) > 50 else { return }
self.previousLocation = center
geoCoder.reverseGeocodeLocation(center) { [weak self] (placemarks, error) in
guard let self = self else { return }
if let _ = error {
//TODO: Show alert informing the user
return
}
guard let placemark = placemarks?.first else {
//TODO: Show alert informing the user
return
}
let streetNumber = placemark.subThoroughfare ?? ""
let streetName = placemark.thoroughfare ?? ""
DispatchQueue.main.async {
self.addressLabel.text = "\(streetNumber) \(streetName)"
}
}
}
func getCenterLocation(for mapView: MKMapView) -> CLLocation {
let latitude = mapView.centerCoordinate.latitude
let longitude = mapView.centerCoordinate.longitude
return CLLocation(latitude: latitude, longitude: longitude)
}
結論
本文介紹了如何使用 Swift CoreLocation 來取得使用者位置,並且將位置顯示在地圖上。我們需要在 info.plist 中加入 Privacy – Location When In Use Usage Description,並且在 ViewController 中加入 CLLocationManager 與 MKMapView,並且實作 CLLocationManagerDelegate 與 MKMapViewDelegate 的方法,讓 ViewController 可以接收 CLLocationManager 與 MKMapView 的回傳訊息,並且將取得的位置顯示在地圖上。
推薦閱讀文章
Swift CoreLocation使用教學 – AppCoda
Core Location Tutorial for iOS: Tracking Visited Locations – Ray Wenderlich
How to track a user’s location with Core Location – Hacking with Swift
Core Location Tutorial with Swift – iOScreator
MapKit Tutorial: Getting Started – Ray Wenderlich</a