在使用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)
}
}
}
}
真机测试结果:
真机定位结果
网友评论