我们在写程序的时候,一般来说会将定位的实现写进启动程序的文档,也就是AppDelegat.m,当然,这只是一般情况,具体依现实情况而定情况而定;
1.1首先引入证书CoreLocation.fromeWork;
1.2引入头文件,
#import <CoreLocation/CoreLocation.h>
1.3创建对象,此处为了方便,将对象设置为全局变量;
CLLocationManager *_locationManager;
1.4初始化对象;
_locationManager = [[CLLocationManager alloc] init];
1.5判断用户是否已授权定位;
if (![CLLocationManager locationServicesEnabled]) {
YiralLog(@"用户服务不可用。");
}
//如果没有授权,则请求用户授权;
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];
}
/*
定位协议代理方法:
manager:当前使用的定位对象;
locations:返回定位数据,是一个数据对象,里面是CLLocation类型;
*/
-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations{
YiralLog(@"%@",locations);
//从数组中取出一个定位信息;
CLLocation *location = [locations lastObject];
//从CLlocation中取出坐标;
//CLLocationCoordinate2D:经纬度,表示坐标系;
CLLocationCoordinate2D coordinate = location.coordinate;
YiralLog(@"纬度:%f,精度:%f,海拔:%f,行走速度:%f",coordinate.latitude,coordinate.longitude,location.altitude,location.speed);
//如果不需要定位服务的时候,即时关闭定位服务;
[_locationManager stopUpdatingLocation];
}
需要注意的是,在ios8之后对定位的要求做出了修改,需要在info里面添加NSLocationAlwaysUsageDescription ,否则不会出现对应的效果
CLGeocoder 地理编码
地理编码:一般是知道位置(街道,门牌号)等,可以转换出地理坐标(经纬度等)
逆地理编码:知道确切的地理坐标(经纬度)转换成确切的位置(街道,门牌号码等)
创建地理编码对象;
CLGeocoder *_geocoder;
初始化地理编码对象;
_geocoder =[[CLGeocoder alloc] init];
在获取到确切的经纬度之后,通过确切的逆地理编码得出想要的地理位置
[_geocoder reverseGeocodeLocation:location completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {
CLPlacemark *placemark = [placemarks firstObject];
YiralLog(@"%@",placemark.addressDictionary);
}];
此处打印在控制台的是一系列的Unicode码,可以通过简单转换,得出自己想要的结论;