CoreLocation,在我們這里討論的是一個最常用的東西,就是用Location Manger獲取用戶當前的位置。
整個的來說非常簡單。只要這樣:
import CoreLocation
需要使用整個框架,那么引入整個框架就是必須的。然后需要在你的類里實現一個protocol。就是CLLocationManagerDelegate,並在代碼中實現protocol里的相關方法。分別是這樣喝這樣:
class ViewController: UIViewController, CLLocationManagerDelegate
//MARK: CoreLocationManagerDelegate func locationManager(manager: CLLocationManager!, didUpdateLocations locations: [AnyObject]!){ println("get location") var location:CLLocation = locations[locations.count-1] as CLLocation if (location.horizontalAccuracy > 0) { self.locationManager.stopUpdatingLocation() println(location.coordinate) self.textLabel.text = "latitude \(location.coordinate.latitude) longitude \(location.coordinate.longitude)" } } func locationManager(manager: CLLocationManager!, didFailWithError error: NSError!) { println(error) self.textLabel.text = "get location error" }
這些代碼的功能也很簡單。獲取用戶的經度和緯度,之后在界面的UILabel中顯示出來。
在viewWillAppear中開始獲取地理位置,在viewDidDisappear里停止。手機費電的幾個地方就包括地理位置過度頻繁的更新這一項。所以,一定要記得不用的時候就不要再請求系統的GPS數據。否則,用戶在設置的費電大戶里是看得到的。
override func viewWillAppear(animated: Bool) { super.viewWillAppear(animated) self.locationManager.startUpdatingLocation() } override func viewDidDisappear(animated: Bool) { super.viewDidDisappear(animated) self.locationManager.stopUpdatingLocation() }
只有這些代碼還是沒有辦法工作的。因為,在iOS8里修改了政策。Look here
if self.locationManager.respondsToSelector("requestAlwaysAuthorization") { println("requestAlwaysAuthorization") self.locationManager.requestAlwaysAuthorization() }
這個是為了兼容iOS7和iOS8的代碼,加入了一個判斷。在iOS8中需要詢問用戶是否同意使用位置信息,否則的話該功能不可用。那么加這個就可以么?NO!!!還需要在,這里就是重點了。在plist文件里配置一個選項。
說到具體的配置有兩個,分別是:requestWhenInUseAuthorization()和requestAlwaysAuthorization()這兩個請求方法。一個是用戶使用的時候才用到定位,一個是一直在后台獲取更新的定位信息。最后的一個在一定的時候會觸發一個系統的提醒,說這個APP一直在后台獲取你的位置信息是否允許之類的。這兩個請求方法對應的plist配置也不一樣,分別是NSLocationAlwaysUsageDescription和NSLocationWhenInUseUsageDescription。至於在plist添加的方法,就是在plist中添加一個鍵值對,然后把請求允許對應的Key值復制粘貼進去就可以了。value值是什么都可以,這個值會在請求允許的對話框中顯示出來給用戶看。總之是你自己定的。
運行你的APP,你會看到請求提示了: