//添加包:CoreLocation.framework
//.plist文件:请求获得应用一直使用定位服务授权,注意使用此方法前要在info.plist中配置NSLocationAlwaysUsageDescription;请求获得应用使用时的定位服务授权,注意使用此方法前在要在info.plist中配置NSLocationWhenInUseUsageDescription,都设置为YES
手动输入
@property
(nonatomic,
retain)
CLLocationManager
*locationManager;
//地理编码/逆地理编码
//地理编码/逆地理编码
@property
(nonatomic,
retain)
CLGeocoder
*geocoder;
- (void)createLocationManager
{
self.locationManager = [[CLLocationManager alloc] init];
self.geocoder = [[CLGeocoder alloc] init];
if (![CLLocationManager locationServicesEnabled]) {
NSLog(@"定位服务当前可能尚未打开,请设置打开");
return ;
}
//如果没有授权则请求用户授权
if ([CLLocationManager authorizationStatus] == kCLAuthorizationStatusNotDetermined) {
[self.locationManager requestWhenInUseAuthorization];
} else if ([CLLocationManager authorizationStatus] == kCLAuthorizationStatusAuthorizedWhenInUse) {
//设置代理
self.locationManager.delegate = self;
//设置定位精度
self.locationManager.desiredAccuracy = kCLLocationAccuracyBest;
//定位频率,每隔多少米定位一次
// CLLocationDistance distance = 1000.0;//十米定位一次
self.locationManager.distanceFilter = kCLDistanceFilterNone;
//启动跟踪定位
[self.locationManager startUpdatingLocation];
}
}
#pragma 跟踪定位代理方法, 每次位置发生变化即执行
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations
{
CLLocation *location=[locations firstObject];//取出第一个位置
CLLocationCoordinate2D coordinate=location.coordinate;//位置坐标
self.locationManager = [[CLLocationManager alloc] init];
self.geocoder = [[CLGeocoder alloc] init];
if (![CLLocationManager locationServicesEnabled]) {
NSLog(@"定位服务当前可能尚未打开,请设置打开");
return ;
}
//如果没有授权则请求用户授权
if ([CLLocationManager authorizationStatus] == kCLAuthorizationStatusNotDetermined) {
[self.locationManager requestWhenInUseAuthorization];
} else if ([CLLocationManager authorizationStatus] == kCLAuthorizationStatusAuthorizedWhenInUse) {
//设置代理
self.locationManager.delegate = self;
//设置定位精度
self.locationManager.desiredAccuracy = kCLLocationAccuracyBest;
//定位频率,每隔多少米定位一次
// CLLocationDistance distance = 1000.0;//十米定位一次
self.locationManager.distanceFilter = kCLDistanceFilterNone;
//启动跟踪定位
[self.locationManager startUpdatingLocation];
}
}
#pragma 跟踪定位代理方法, 每次位置发生变化即执行
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations
{
CLLocation *location=[locations firstObject];//取出第一个位置
CLLocationCoordinate2D coordinate=location.coordinate;//位置坐标
NSLog(@"经度:%f,纬度:%f,海拔:%f,航向:%f,行走速度:%f",coordinate.longitude,coordinate.latitude,location.altitude,location.course,location.speed);
[self
getAddressByLatitude:coordinate.latitude
longitude:coordinate.longitude];
//如果不需要实时定位,使用完即使关闭定位服务
[_locationManager stopUpdatingLocation];
[_locationManager stopUpdatingLocation];
}
//CLGeocoder类用于处理地理编码和逆地理编码(又叫反地理编码)功能.
地理编码:根据给定的位置(通常是地名)确定地理坐标(经、纬度)。
逆地理编码:可以根据地理坐标(经、纬度)确定位置信息(街道、门牌等
#pragma mark
根据坐标取得地名(逆地理编码)
-(void)getAddressByLatitude:(CLLocationDegrees)latitude
longitude:(CLLocationDegrees)longitude{
//反地理编码
CLLocation *location=[[CLLocation alloc]initWithLatitude:latitude longitude:longitude];
[_geocoder reverseGeocodeLocation:location completionHandler:^(NSArray *placemarks, NSError *error) {
CLPlacemark *placemark=[placemarks firstObject];
//反地理编码
CLLocation *location=[[CLLocation alloc]initWithLatitude:latitude longitude:longitude];
[_geocoder reverseGeocodeLocation:location completionHandler:^(NSArray *placemarks, NSError *error) {
CLPlacemark *placemark=[placemarks firstObject];
NSLog(@"%@", placemark.name);//位置名
NSLog(@"thoroughfare,%@",place.thoroughfare);
//
街道
NSLog(@"subThoroughfare,%@",place.subThoroughfare);
//
子街道
NSLog(@"locality,%@",place.locality); // 市
NSLog(@"subLocality,%@",place.subLocality); // 区
NSLog(@"locality,%@",place.locality); // 市
NSLog(@"subLocality,%@",place.subLocality); // 区
NSLog(@"country,%@",place.country);
//
国家
//字典形式输出
// NSLog(@"详细信息:%@",placemark.addressDictionary);
}];
}
//