1.在app的info.plist里添加Privacy - Location Usage Description这个key.
2.导入头文件
#import <CoreLocation/CoreLocation.h>
3.0实例化一个
@property (nonatomic,strong)CLLocationManager*locationManager;
self.locationManager = [[CLLocationManageralloc] init];
self.locationManager.delegate = self;
4.0询问用户是否开启地理位置
// 前台定位授权官方文档中说明info.plist中必须有NSLocationWhenInUseUsageDescription键
[self.locationManagerrequestWhenInUseAuthorization];
// 前后台定位授权官方文档中说明info.plist中必须有NSLocationAlwaysUsageDescription键
[self.locationManagerrequestAlwaysAuthorization];
可以设置定位的精确度
externconst CLLocationAccuracy kCLLocationAccuracyBestForNavigation__OSX_AVAILABLE_STARTING(__MAC_10_7,__IPHONE_4_0);
externconst CLLocationAccuracy kCLLocationAccuracyBest;
externconst CLLocationAccuracy kCLLocationAccuracyNearestTenMeters;
externconst CLLocationAccuracy kCLLocationAccuracyHundredMeters;
externconst CLLocationAccuracy kCLLocationAccuracyKilometer;
externconst CLLocationAccuracy kCLLocationAccuracyThreeKilometers;
self.locationManager.desiredAccuracy = kCLLocationAccuracyThreeKilometers;
系统会根据设置的精确度使用不同的定位方式 gps wifi 蜂窝网
5.0开始定位
[self.locationManagerrequestLocation];
这里只进行一次定位 始终定位等可以参考其他方法
6.实现CLLocationManagerDelegate
#pragma mark代理方法中监听授权的改变,被拒绝有两种情况,一是真正被拒绝,二是服务关闭了
- (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status
{
switch (status) {
case kCLAuthorizationStatusNotDetermined:
{
NSLog(@"用户未决定");
break;
}
// 系统预留字段,暂时还没用到
case kCLAuthorizationStatusRestricted:
{
NSLog(@"受限制");
break;
}
case kCLAuthorizationStatusDenied:
{
// 被拒绝有两种情况 1.设备不支持定位服务 2.定位服务被关闭
if ([CLLocationManagerlocationServicesEnabled]) {
NSLog(@"真正被拒绝");
//跳转到设置界面
NSURL *url = [NSURLURLWithString:UIApplicationOpenSettingsURLString];
if ([[UIApplicationsharedApplication] canOpenURL:url]) {
[[UIApplicationsharedApplication] openURL:url options:@{}completionHandler:^(BOOL success) {
}];
}
}
else {
NSLog(@"没有开启此功能");
}
break;
}
case kCLAuthorizationStatusAuthorizedAlways:
{
NSLog(@"前后台定位授权");
break;
}
case kCLAuthorizationStatusAuthorizedWhenInUse:
{
NSLog(@"前台定位授权");
break;
}
default:
break;
}
}
-(void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error
{
NSLog(@"%@",error);
}
7.0解析获取位置信息
#pragma mark - CLLocationManagerDelegate
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations
{
CLGeocoder * geoCoder = [[CLGeocoderalloc] init];
[geoCoderreverseGeocodeLocation:locations.firstObject completionHandler:^(NSArray<CLPlacemark *> *_Nullable placemarks,NSError * _Nullable error) {
for (CLPlacemark * placein placemarks) {
NSLog(@"国家:%@",place.country);
NSLog(@"城市:%@",place.locality);
NSLog(@"区:%@",place.subLocality);
NSLog(@"街道:%@",place.thoroughfare);
NSLog(@"子街道:%@",place.subThoroughfare);
}
}];
}
精确到街道 非常牛掰