GPS定位

作者: T92 | 来源:发表于2016-09-24 18:07 被阅读20次

在使用GPS定位时,需要import CoreLocation,还要向用户获取权限之后才能够进行定位。还有很容易遗忘的一点:在定位之前要先在info.plist文件添加一个键值对NSLocationAlwaysUsageDescription:String,其中的字符是要向用户展示的信息

定位增加键值对
import UIKit

//获取位置信息库
import CoreLocation

//注意:所有的iOS应用程序在获取手机位置信息前必须通过用户获得权限

class ViewController: UIViewController {

    //MARK: - 属性
    
    //1.位置管理对象
    lazy var locationManager:CLLocationManager = {
       return CLLocationManager()
    }()
    
    //2.地址解析对象
    lazy var geocoder:CLGeocoder = {
       return CLGeocoder()
    }()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        //获取定位权限
        self.getLocationPermission()
        //设置定位管理者
        self.locationSettings()
        //开始定位
        self.locationManager.startUpdatingLocation()
    }
}

//MARK: - 获取位置权限
extension ViewController{
    func getLocationPermission(){
        
        //1.查看是否有定位服务
        //CLLocationManager:位置管理类
        //返回值bool
        if CLLocationManager.locationServicesEnabled(){
            //2.获取权限
            //a.设置info.plist文件
            //在info.plist文件中添加键值对:[NSLocationAlwaysUsageDescription:String]
            //NSLocationAlwaysUsageDescription
            
            //b.请求权限
            self.locationManager.requestAlwaysAuthorization()
        }
        else{
            print("没有定位服务")
        }
    }
}

//MARK: - 设置定位属性
extension ViewController{
    func locationSettings(){
        //1.设置定位精度
        //kCLLocationAccuracyBest:最高精度,其他的点击名字进去看
        //kCLLocationAccuracyBestForNavigation交通导航最小误差
        self.locationManager.desiredAccuracy = kCLLocationAccuracyBest
        
        //2.设置刷新位置信息的最小距离,单位:米
        self.locationManager.distanceFilter = 100
        
        //3.定位类型
        //.AutomotiveNavigation 自动导航
        //.Fitness步行
        //.OtherNavigation其他交通工具
        //.Other其他
        self.locationManager.activityType = .Other
        
        //4.设置代理(定位结果是通过协议方法获取的)
        self.locationManager.delegate = self
    }
}

//MARK: - 遵循协议
extension ViewController:CLLocationManagerDelegate{
    //每次位置更新都会自动调用这个方法
    //参数2:获取到的位置信息
    func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
        //1.拿到位置对象
        let location = locations.first
        //a.经纬度
        let coord = location?.coordinate
        print("北纬:\(coord?.latitude),经度:\(coord?.longitude)")
        //b.海拔
        let altitude = location?.altitude
        print("海拔\(altitude)")
        //c.楼层
        let floor = location?.floor
        print("楼层:\(floor)")
        //d.方向(范围0-359.9 0->正北)
        let course = location?.course
        print(course)
        
        //2.将拿到的经纬度转换成具体地址
        //参数1:经纬度
        //参数2:位置,将经纬度转换成具体位置后会自动执行的闭包
        //闭包参数1:转换结果对应的数组
        //闭包参数2:错误信息
        self.geocoder.reverseGeocodeLocation(location!) { (marks, error) -> Void in
            //模拟器上有时候会崩溃,真机还没遇到
            for mark in marks!{
                //获取地址
                let dict = mark.addressDictionary
                print(dict)
            }
        }
    }
}

真机测试结果:


真机定位结果

相关文章

网友评论

      本文标题:GPS定位

      本文链接:https://www.haomeiwen.com/subject/spbxyttx.html