#38 打卡位置如何取得?利用CLLocationManager 取得位置
學習如何利用 Xcode debug View 來更正程式碼
每次使用 Facebook 打卡的時候,iphone是如何取得我們的位置的呢?
其實很簡單,可以利用 Core Location 這個框架(Framework)裡的CLLocationManager 類別(Class),這個 Class 就是來啟動和停止交付你的位置給 App的。
我們來看看該怎麼做?
首先我們來開啟一個新的專案,在 ViewController.swift載入CoreLocation 框架.
import UIKit
import CoreLocationclass ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
}
}
然後定義 locationManager 的類別為CLLocationManager
let locationManager = CLLocationManager()
這樣我們就可以使用locationManager來取得位置的動作
再來我們要讓使用者同意APP 可以取得位置的權限
在 專案的 info 頁面加入Privacy — Location When In Use Usage Description的隱私請求,Value 的部分,可以寫為什麼需要取得這個權限。
然後在 viewDidLoad() 裡加上locationManager.requestWhenInUseAuthorization()
這樣打開 App 的時候就會出現請求位置權限的圖示
再來就是加入 locationManager
的 Delegate,我們將要使用 Delegate 裡的function
到目前為止, func viewDidLoad()
裡的程式如下,
override func viewDidLoad() {
super.viewDidLoad()
locationManager.delegate = self
}
再來,我們會用到 CLLocationManagerDelegate
的 didUpdateLocations
function
程式碼如下
extension ViewController: CLLocationManagerDelegate {
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
let coordinate = locations.last!.coordinate
locationLabel.text = "目前位置為\n經度為\(longtitude)\n緯度為\(latitude)"
}
}
let location = locations.last!.coordinate
locations 是一個 Array,因為只要知道最後一個位置,所以定義 location 是 locationManager 取得最後的位置。
locationLabel.text = “目前位置為\n經度為\(location.longitude)\n緯度為\(location.latitude)”
在 locationLabel 顯示經緯度。
我們使用一個 Button,拉@IBAction,使用 locationManager.requestLocation()
按下這個按鈕時便會抓取目前位置。
目前完整程式碼如下
import UIKit
import CoreLocationclass ViewController: UIViewController {
let locationManager = CLLocationManager()@IBOutlet weak var locationLabel: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
locationManager.requestWhenInUseAuthorization()
locationManager.delegate = self
}
@IBAction func checkIn(_ sender: UIButton) {
locationManager.requestLocation()
}
}extension ViewController: CLLocationManagerDelegate {
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
let coordinate = locations.last!.coordinate
locationLabel.text = "目前位置為\n經度為\(longtitude)\n緯度為\(latitude)"
}
}
讓模擬器開始模擬。
結果按下 button 時,出現了錯誤視窗,結果是delegate沒有加locationManager:didFailWithError
這個 function
2022-06-27 23:46:27.176072+0800 CoreLocationPracticeVer2[20092:698786] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Delegate must respond to locationManager:didFailWithError:'
把 Delegate 加上locationManager:didFailWithError
extension ViewController: CLLocationManagerDelegate {
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
let coordinate = locations.last!.coordinate
locationLabel.text = "目前位置為\n經度為\(longtitude)\n緯度為\(latitude)"
}
func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {
print("fail")
}
}
這樣按下button 就可以得到現在的經緯度
補充
1. locationLabel 的高度要多於 3 行,然後 Lines 要設 0
這樣才可以顯示多行
2. 在iPhone 上 模擬可以得到正確的經緯度,在電腦上要自己設定經緯度。
完整程式碼