主要内容:
一、CLLocationManager定位
二、CLGeocoder地理编码
一、CLLocationManager
定位功能几乎是现在所有应用程序都包含的一个功能,在iOS中通过Core Location框架进行定位操作。Core Location自身可以单独使用,和地图开发框架MapKit完全是独立的,但是往往地图开发要配合定位框架使用。在Core Location中主要包含了定位、地理编码(包括反编码)功能。
使用步骤:
1、定义一个CLLocationManager的对象:
//定位
CLLocationManager *_locationManager;
2、初始化CLLocationManager对象:
_locationManager = [[CLLocationManager alloc] init];
3.判断定位服务是否可用:
if (![CLLocationManager locationServicesEnabled]) {
ZMYLog(@"定位服务当前可能尚未打开,请设置打开!");
}
4.如果用户没有授权则请求用户授权定位服务,如果用户已经授权则设置定位相关操作:
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];
}
5、遵循CLLocationManager代理协议:
@interface AppDelegate ()<CLLocationManagerDelegate>
6、实现CLLocationManager代理里边方法:
- (void)locationManager:(CLLocationManager *)manager
didUpdateLocations:(NSArray<CLLocation *> *)locations __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_6_0);
7、在代理方法中获取用户位置:
- (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;
2、初始化CLGeocoder对象:
_geocoder = [[CLGeocoder alloc] init];
3、在获取到用户位置(经纬度)后,通过逆地理编码将经纬度转化为实际的地名、街道等信息:
- (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];
}
4、上一步的addressDictionary中包含了所有的信息,我将他转化为一个plist表更容易看明白,如图: