获取定位信息
先导入
然后在 info.plist 文件中添加 Privacy - Location Always and When In Use Usage Description 和 Privacy - Location When In Use Usage Description 两个就可以了。
LocationManager.h
#import <Foundation/Foundation.h> typedef void(^LocationBlock)(NSString *lat, NSString *lon); @interface LocationManager : NSObject + (instancetype)shareManager; - (void)getGps:(LocationBlock)block; @property (nonatomic, copy) NSString *lat; @property (nonatomic, copy) NSString *lon; @end
LocationManager.m
#import "LocationManager.h" #import <CoreLocation/CoreLocation.h> @interface LocationManager ()<CLLocationManagerDelegate> @property (nonatomic, strong) CLLocationManager *locManager; @property (nonatomic, copy) LocationBlock block; @end @implementation LocationManager + (instancetype)shareManager { static LocationManager *_manager; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ _manager = [[LocationManager alloc] init]; }); return _manager; } - (instancetype)init { if (self = [super init]) { _locManager = [[CLLocationManager alloc] init]; // 精确度 [_locManager setDesiredAccuracy:kCLLocationAccuracyBest]; // 精确到米 _locManager.distanceFilter = 100; _locManager.delegate = self; if (![CLLocationManager locationServicesEnabled]) { // 判断当前服务是否开启 NSLog(@"开启定位服务"); } else { // 当前状态 CLAuthorizationStatus status = [CLLocationManager authorizationStatus]; if (status == kCLAuthorizationStatusNotDetermined) { // 未选中状态时候 [_locManager requestWhenInUseAuthorization]; } } } return self; }
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations {
CLLocation *newLocation = locations[0];
// 获取当前所在的城市名
CLGeocoder *geocoder = [[CLGeocoder alloc] init];
// 根据经纬度反向地理编译出地址信息
[geocoder reverseGeocodeLocation:newLocation completionHandler:^(NSArray *array, NSError *error){
if (array.count > 0){
CLPlacemark *placemark = [array objectAtIndex:0];
// 获取城市
NSString *city = placemark.locality;
if (!city) {
// 四大直辖市的城市信息无法通过locality获得,只能通过获取省份的方法来获得(如果city为空,则可知为直辖市)
city = placemark.administrativeArea;
}
NSLog(@"city = %@", city); // 广州市
NSLog(@"--%@",placemark.name);// 黄埔大道西447-5号
NSLog(@"++++%@",placemark.subLocality); // 天河区
NSLog(@"country == %@",placemark.country);// 中国
NSLog(@"administrativeArea == %@",placemark.administrativeArea); // 广东省
}
else if (error == nil && [array count] == 0)
{
NSLog(@"No results were returned.");
}
else if (error != nil)
{
NSLog(@"An error occurred = %@", error);
}
}];
CLLocationCoordinate2D coor = newLocation.coordinate;
NSString *lat = [NSString stringWithFormat:@"%@", @(coor.latitude)];
NSString *lon = [NSString stringWithFormat:@"%@", @(coor.longitude)];
[LocationManager shareManager].lat = lat;
[LocationManager shareManager].lon = lon;
self.block(lat, lon);
// 系统会一直更新数据,直到选择停止更新,因为我们只需要获得一次经纬度即可,所以获取之后就停止更新
[self.locManager stopUpdatingLocation];
}
- (void)getGps:(LocationBlock)block { self.block = block; // 开始定位 [self.locManager startUpdatingLocation]; } @end
调用方法:
[[LocationManager shareManager] getGps:^(NSString *lat, NSString *lon) { NSLog(@"%@, %@", lat, lon); }];