主要内容:
一、CLLocationManager定位
二、CLGeocoder地理编码
一、CLLocationManager
定位功能几乎是现在所有应用程序都包含的一个功能,在iOS中通过Core Location框架进行定位操作。Core Location自身可以单独使用,和地图开发框架MapKit完全是独立的,但是往往地图开发要配合定位框架使用。在Core Location中主要包含了定位、地理编码(包括反编码)功能。
使用步骤:
1、定义一个CLLocationManager的对象:
//定位 CLLocationManager *_locationManager;
_locationManager = [[CLLocationManager alloc] init];
if (![CLLocationManager locationServicesEnabled]) { ZMYLog(@"定位服务当前可能尚未打开,请设置打开!"); }
4.1设置代理
4.2设置定位精度
4.3设置定位频率
4.4启动定位服务
//如果没有授权则请求用户授权 if ([CLLocationManager authorizationStatus] == kCLAuthorizationStatusNotDetermined) { [_locationManager requestWhenInUseAuthorization]; } else if ([CLLocationManager authorizationStatus] == kCLAuthorizationStatusAuthorizedWhenInUse) { //设置代理 _locationManager.delegate = self; //设置定位精度,精度越高越耗电 _locationManager.desiredAccuracy = kCLLocationAccuracyBest; //定位频率,每隔多少米定位一次 CLLocationDistance distance = 10.0; _locationManager.distanceFilter = distance; //启动跟踪定位 [_locationManager startUpdatingLocation]; }
@interface AppDelegate ()<CLLocationManagerDelegate>
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_6_0);
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations { //取出第一个位置 CLLocation *location = [locations firstObject]; //获取坐标 CLLocationCoordinate2D coordinate = location.coordinate; //汉字多了之后就不提示 ZMYLog(@"经度:%f 维度:%f 海拔:%f 航向:%f行走速度:%f", coordinate.longitude, coordinate.latitude, location.altitude,location.course,location.speed); //如果不需要实时定位,使用完即使关闭定位服务 [_locationManager stopUpdatingLocation]; }
特别注意:
iOS8之后如果设置对定位操作进行了修改,如果想要获取用户授权需要在工程的info.plist中添加字段NSLocationAlwaysUsageDescription、NSLocationWhenInUseUsageDescription
NSLocationAlwaysUsageDescription 这个是希望在任何时候使用用户位置
NSLocationWhenInUseUsageDescription这个是在应用程序使用期间使用用户位置。
修改如图:
如果不添加这个操作,打开软件后不会弹出那个alert窗口
二、CLGeocoder地理编码
除了提供位置跟踪功能之外,在定位服务中还包含CLGeocoder类用于处理地理编码和逆地理编码(又叫反地理编码)功能。
地理编码:根据给定的位置(通常是地名)确定地理坐标(经、纬度)。
逆地理编码:可以根据地理坐标(经、纬度)确定位置信息(街道、门牌等)。
使用步骤:
1、创建一个CLGeocoder对象:
//地理编码 CLGeocoder *_geocoder;
_geocoder = [[CLGeocoder alloc] init];
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations { //取出第一个位置 CLLocation *location = [locations firstObject]; //获取坐标 CLLocationCoordinate2D coordinate = location.coordinate; //汉字多了之后就不提示 ZMYLog(@"经度:%f 维度:%f 海拔:%f 航向:%f行走速度:%f", coordinate.longitude, coordinate.latitude, location.altitude,location.course,location.speed); [_geocoder reverseGeocodeLocation:location completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) { CLPlacemark *placeMark = [placemarks firstObject]; ZMYLog(@"%@", placeMark.addressDictionary); }]; //如果不需要实时定位,使用完即使关闭定位服务 [_locationManager stopUpdatingLocation]; }