定位
-在iOS开发中想要加入定位和地图功能,那么必须基于CoreLocation
和MapKit
2个框架进行开发
-CoreLocation
:地理定位,地理编码,区域监听
-MapKit
:地图展示,规划路线
定位
-CLLocation对象
-1.coordinate
经纬度数据
-2.altitude
海拔
-3.speed
当前速度
-4.course
航向
-5.- (CLLocationDistance)distanceFromLocation:(CLLocation *)location
可以通过此方法来获取两个位置对象之间的物理距离
-iOS8.0之前的前台定位
//ios 8.0前台定位 CLLocationManager *locM = [[CLLocationManager alloc] init]; locM.delegate = self; //开始跟新 [locM startUpdatingLocation]; //-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations代理方法中可以获取位置请求信息
- iOS8.0之前的后台定位:只需要在前台模式下的基础上勾选后台模式location updatas或者直接设置info.plist文件
-iOS8.0之后的前台定位:
-1.在iOS8.0的前台定位基础上主动请求前台定位授权.并且在info.plist文件中配置对应的key[self.locationM requestWhenInUseAuthorization];//->Nslocationwheninuseusagedescription
-iOS8.0后台定位:只需要在前台定位的基础上,勾选后台模式location updates
-iOS8.0之前的前后台定位授权:
[self.locationM requestAlwaysAuthorization];//强求前后台定位授权 KEY: NSLocationAlwaysUsageDescription//配置对应的key
- iOS9.0之后的前台定位:与iOS8.0保持一致
- iOS9.0之后的后台定位:
-1.前台定位授权
-2.勾选后台模式
-3.设置属性allowsBackgroundLocationUpdates = YES;
- iOS9.0之后的前后台定位:直接请求前后台定位授权,和iOS8.0之后一致
定位-设置定位精确度
-通过 desiredAccuracy
来设置定位精确度,定位本省非常耗电,定位的精确度越高,越耗电,为了省电尽量在满足需求的情况下低精确度
kCLLocationAccuracyBestForNavigation -> 最适合导航 kCLLocationAccuracyBest -> 精度最好的 kCLLocationAccuracyNearestTenMeters -> 附近10米 kCLLocationAccuracyHundredMeters -> 附近100米 kCLLocationAccuracyKilometer -> 附近1000米 kCLLocationAccuracyThreeKilometers -> 附近3000米
定位-监听用户授权状态
-可以在CLLocationManager的代理方法-locationManager: didChangeAuthorizationStatus:
来获取当前的授权状态
kCLAuthorizationStatusNotDetermined 用户未决定
kCLAuthorizationStatusRestricted 访问受限制
kCLAuthorizationStatusDenied 定位被拒绝
kCLAuthorizationStatusAuthorizedAlways 前后台定位授权
kCLAuthorizationStatusAuthorizedWhenInUse 前台定位授权
地理编码/反地理编码
-地理编码:根据地质关键字,将其转换成为对应的经纬度等信息
-1.导入头文件#import <CoreLocation/CoreLocation.h>
-2.创建CLGeocoder对象
-3.根据地址关键字进行地理编码
[self.geocoder geocodeAddressString:地址 completionHandler:^(NSArray<CLPlacemark *> * __nullable placemarks, NSError * __nullable error)
-反地理编码:根据经纬度信息,将其转换成为对应的省市区街道等信息
-1.导入框架#import <CoreLocation/CoreLocation.h>
-2.创建CLGeocoder对象
-3.根据经纬度信息进行反地理编码
[self.geocoder reverseGeocodeLocation:[[CLLocation alloc] initWithLatitude:21 longitude:123] completionHandler:^(NSArray<CLPlacemark *> * __nullable placemarks, NSError * __nullable error)
-CLPlacemark:地址对象
location : CLLocation 类型, 位置对象信息, 里面包含经纬度, 海拔等等 region: CLRegion 类型, 地标对象对应的区域 addressDictionary : NSDictionary 类型, 存放街道,省市等信息 name: NSString 类型, 地址全称 thoroughfare: NSString 类型, 街道名称 locality: NSString 类型, 城市名称 administrativeArea : NSString 类型, 省名称 country: NSString 类型, 国家名称