使用CoreLocation进行定位(Swift版)
2016-09-01 17:29
381 查看
使用CoreLocation进行定位(Swift版)
在应用开发中,很多情况需要我们获取到当前的位置和高度信息,方便搜索周边,查看周边相同应用等,一切与定位有关的都得使用CoreLocation库,而且,系统是不允许第三发定位的,当然可以使用第三方对其封装过的,如百度地图API的定位服务。一.基本知识点
1.CoreLocation :定位核心框架,使用系统定位时需要import CoreLocation,使用第三发封住也要记得添加作为依赖库。 所有定位相关的都要CL前缀。2.CLLocationManager:定位管理
主要属性和方法如下
desiredAccuracy;//定位的精度设置(共6个)常用的值有kCLLocationAccuracyBest;//设备使用电池供电时的最高精度kCLLocationAccuracyNearestTenMeters;//精确到10米
distanceFilter;///设备移动后获得位置信息的最小距离
delegate//CLLocationMangerdelegate的委托协议(可用于返回定位位置信息或失败信息)
requestWhenInUseAuthorization;//弹出用户授权对话框,使用程序期间授权
requestAlwaysAuthorization;//始终授权
startUpdatingLocation;//开始定位
stopUpdatingLocation;//停止定位
具体使用建议参考官方文档及搜索:
CLLocationManager
Class Reference
官网搜索
二.定位配置与注意
在刚入门学习定位时,特别要注重细节和阅读官网文档。1.配置plist文件,
定位时需要权限请求的,需要在相关字段设置权限请求,
否则可能发生错误,在文件中新增以下属性用于用户在使用该应用是授权定位,但是该设置也可以调用CLLocatoinManager的方法实现
iOS 11之前:
NSLocationWhenInUseUsageDescription//打开应用是开启定位
NSLocationAlwaysUsageDescription//一直开启定位
iOS 11之后设置:
添加字段:Privacy - Location Always Usage Description //String 请求时候的描述
和 Privacy - Location When In Use Usage Description //权限请求时的描述
后台定位:Privacy - Location Always and When In Use Usage Description //权限请求时的描述[注意后台定位请求苹果审核应用时比较严格,谨慎使用]
2.除了需要配置plist文件(有时没有导入也可以定位),还需要导入CoreLocation的framework(特别是手动导入第三方定位SDK的时候)
如下图:
3.在使用的swift文件的开始导入头文件->" import CoreLocation"
4.在进行实际开发时,获取定位,可以使用NSlock,运行时不受打扰。
5.扩展
CLLocation类:主要存储定位后的信息(
coordinate.longitude:经度 coordinate.latitude:纬度 altitude:高度)
6.扩展学习参考:使用swift构建带有地理定位功能的APP
7.如果定位失败原因,
请检查配置检查
详细检查二中的配置,是否调用请求权限。
设备检查
a.调试定位功能没有开启。解决:模拟器的Debug->Location是否打开(即不选None)
b.应用地理位置访问权限不够。 解决:初次使用应用先回到模拟器首页(Shift+COM+H),进入设置->privacy->Location Services->下面的应用列表的该应用是否选择Always.
c.还有可能是自定义经纬度不符合(error:kCLErrorDomain的错误,当然得调用协议中的定位失败返回错误方法))
三.使用主要步骤
1.配置好相关,导入头文件,控制器遵守CLLocationManagerDelegate委任代理2.生成CLLocationMananger的对象
3.设置CLLocation属性和某些方法的调用
4.实现CLLocationDelegate的方法回掉,didUpdateLocations获取定位信息或者错误信息
四.代码参考
import UIKit import CoreLocation //导入定位核心库 class ViewController: UIViewController ,CLLocationManagerDelegate{ //遵守定位代理,以获取定位结果。 let locationManager = CLLocationManager() var currentLocation:CLLocation! var lock = NSLock() override func viewDidLoad() { super.viewDidLoad() locationManager.delegate = self locationManager.desiredAccuracy = kCLLocationAccuracyBest //定位精确度(最高)一般有电源接入,比较耗电 //kCLLocationAccuracyNearestTenMeters; //精确到10米 locationManager.distanceFilter = 50 //设备移动后获得定位的最小距离(适合用来采集运动的定位) locationManager.requestWhenInUseAuthorization() //弹出用户授权对话框,使用程序期间授权(ios8后) //requestAlwaysAuthorization; //始终授权 locationManager.startUpdatingLocation() print("开始定位》》》") } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } /** * CLlocationDelegate */ //委托传回定位,获取最后一个 func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { lock.lock() currentLocation = locations.last //注意:获取集合中最后一个位置(最新的位置) print("定位经纬度为:\(currentLocation.coordinate.latitude)") //一直发生定位错误输出结果为0:原因是我输出的是currentLocation.altitude(表示高度的)而不是currentLoction.coordinate.latitude(这个才是纬度) print(currentLocation.coordinate.longitude) lock.unlock() } func locationManager(manager: CLLocationManager, didFailWithError error: NSError) { print("定位出错拉!!\(error)") } }
相关文章推荐
- 使用CoreLocation进行定位(Swift版)
- Swift - 使用CoreLocation实现定位(经纬度、海拔、速度、距离等)
- CoreLocation进行定位(Swift版)
- Swift - 使用CoreLocation实现定位(经纬度、海拔、速度、距离等)
- Swift - 使用CoreLocation实现定位(经纬度、海拔、速度、距离等)
- Swift - 使用CoreLocation实现定位(经纬度、海拔、速度、距离等)
- Swift 使用CoreLocation获取定位与位置信息
- 使用百度地图进行区域搜索与定位
- 使用HTML5进行地理位置定位。误差在+-500m
- 使用CRectTracker类进行对象动态定位(二)
- 使用HTML5进行地理位置定位
- JAVASCRIPT 提示信息 主要是使用了获取控件的位置进行定位
- 使用百度地图进行区域搜索与定位
- ThinkPHP使用UTFWry地址库进行IP定位实例
- 使用百度地图结合GPS进行定位
- 使用百度地图结合GPS进行定位
- selenium中使用css选择器进行元素定位
- 使用ProcMon及windows symbols进行文件操作类API定位
- windows下使用cscope vim对函数进行定位
- ThinkPHP使用UTFWry地址库进行IP定位实例