定位服務是不少程序中都用到的,主要使用CoreLocation庫中的CLLocationManager類和CLLocation類。git
實現結果使用彈窗顯示,以下圖:異步
實現步驟:async
首先,咱們須要在Info.plist文件中添加兩個字段:ide
//始終開啓定位的用戶提示信息NSLocationAlwaysUsageDescription//僅在程序使用時開啓定位的用戶提示信息NSLocationWhenInUseUsageDescription
以下圖,Value爲自定義信息,用來顯示在系統的設置界面中:ui
當程序打開時,若是用戶沒有選擇過是否容許App獲取定位信息,會彈出窗口顯示,在窗口中會顯示NSLocationWhenInUseUsageDescription的內容:spa
在系統的設置-定位中,顯示以下(應用程序說明):線程
如今,能夠開始寫代碼了:代理
import UIKitimport CoreLocationclass ViewController: UIViewController,CLLocationManagerDelegate { var locationManager:CLLocationManager! override func viewDidLoad() { super.viewDidLoad() //若是設備沒有開啓定位服務 if !CLLocationManager.locationServicesEnabled(){ dispatch_async(dispatch_get_main_queue()){ SCMessageBox.showquick(self, contentMsg: "沒法定位,由於您的設備沒有啓用定位服務,請到設置中啓用") } return } locationManager = CLLocationManager() //設置精確度 locationManager.desiredAccuracy = kCLLocationAccuracyBest //變化距離 超過50米 從新定位 locationManager.distanceFilter = 50 //在IOS8以上系統中,須要使用requestWhenInUseAuthorization方法才能彈窗讓用戶確認是否容許使用定位服務的窗口 if SCDevice.getVersion() >= 8.0 { //狀態爲,用戶尚未作出選擇,那麼就彈窗讓用戶選擇 if CLLocationManager.authorizationStatus() == CLAuthorizationStatus.NotDetermined { locationManager.requestWhenInUseAuthorization() //locationManager.requestAlwaysAuthorization() } //狀態爲,用戶在設置-定位中選擇了【永不】,就是不容許App使用定位服務 else if(CLLocationManager.authorizationStatus() == CLAuthorizationStatus.Denied){ //須要把彈窗放在主線程才能強制顯示 dispatch_async(dispatch_get_main_queue()){ SCMessageBox.showquick(self, contentMsg: "沒法定位,由於您沒有受權本程序使用定位,請至設置中開啓!") return } } } //設置定位獲取成功或者失敗後的代理,Class後面要加上CLLocationManagerDelegate協議 locationManager.delegate = self //開始獲取定位信息,異步方式 locationManager.startUpdatingLocation() } func locationManager(manager: CLLocationManager!, didFailWithError error: NSError!) { SCMessageBox.showquick(self, contentMsg: "定位發生異常:\(error)") } func locationManager(manager: CLLocationManager!, didUpdateLocations locations: [AnyObject]!) { if locations.count > 0{ // 使用last 獲取 最後一個最新的位置, 前面是上一次的位置信息 var locationInfo:CLLocation = locations.last as! CLLocation SCMessageBox.showquick(self, contentMsg: "經度:\(locationInfo.coordinate.longitude),緯度:\(locationInfo.coordinate.latitude)") } } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. }}