// // QXLocationManager.m // YSDTrucksProject // // Created by 党凯 on 2020/7/17. // Copyright © 2020 党凯. All rights reserved. // #import "QXLocationManager.h" @interface QXLocationManager() @property (nonatomic,strong)CLLocationManager *lcManager; @end @implementation QXLocationManager +(instancetype)shareManager{ static QXLocationManager *manager = nil; static dispatch_once_t predicate; dispatch_once(&predicate, ^{ manager = [[QXLocationManager alloc] init]; }); return manager; } - (instancetype)init { self = [super init]; if (self) { // [AMapServices sharedServices].apiKey = mapKey; // _locationManager = [[AMapLocationManager alloc] init]; // // 带逆地理信息的一次定位(返回坐标和地址信息) // [_locationManager setDesiredAccuracy:kCLLocationAccuracyHundredMeters]; // // 定位超时时间,最低2s,此处设置为2s // _locationManager.locationTimeout =2; // // 逆地理请求超时时间,最低2s,此处设置为2s // _locationManager.reGeocodeTimeout = 2; // _locationManager.delegate = self; // if ([CLLocationManager authorizationStatus]) { // 创建位置管理者对象 self.lcManager = [[CLLocationManager alloc] init]; self.lcManager.delegate = self; // 设置代理 // 设置定位距离过滤参数 (当本次定位和上次定位之间的距离大于或等于这个值时,调用代理方法) self.lcManager.distanceFilter = 100; self.lcManager.desiredAccuracy = kCLLocationAccuracyBest; // 设置定位精度(精度越高越耗电) [self.lcManager requestWhenInUseAuthorization];//这句很关键!!! // [self.lcManager startUpdatingLocation]; // 开始更新位置 // }else{ // // //没开启,做其他提醒 // // } } return self; } //-(void)amapLocationManager:(AMapLocationManager *)manager doRequireLocationAuth:(CLLocationManager *)locationManager{ // if ([CLLocationManager authorizationStatus] == kCLAuthorizationStatusNotDetermined) { // [locationManager requestAlwaysAuthorization]; // } //} -(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations{ NSLog(@"定位到了"); __weak typeof(self)weakSelf = self; CLGeocoder *geocoder = [[CLGeocoder alloc]init]; [geocoder reverseGeocodeLocation:[locations firstObject] completionHandler:^(NSArray *_Nullable placemarks, NSError * _Nullable error) { CLPlacemark *place = [placemarks firstObject]; //place包含了地理信息 if (weakSelf.delegate && [weakSelf.delegate respondsToSelector:@selector(locationSuccessWithCity:province:area:address:)]) { /// 省 NSString *province = place.administrativeArea; /// 市 NSString *city = place.locality; /// 县 NSString *area = place.subLocality; [weakSelf.delegate locationSuccessWithCity:place.locality province:province area:area address:place.name]; } }]; } -(void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error{ NSLog(@"获取定位失败"); } -(void)startLoction{ if (![self checkAuthorization]) { UIAlertController *al = [UIAlertController alertControllerWithTitle:@"您没有打开定位权限" message:nil preferredStyle:(UIAlertControllerStyleAlert)]; [al addAction:[UIAlertAction actionWithTitle:@"取消" style:(UIAlertActionStyleCancel) handler:^(UIAlertAction * _Nonnull action) { }]]; [al addAction:[UIAlertAction actionWithTitle:@"去设置" style:(UIAlertActionStyleDefault) handler:^(UIAlertAction * _Nonnull action) { //打开应用的设置界面 NSURL * url = [NSURL URLWithString:UIApplicationOpenSettingsURLString]; if([[UIApplication sharedApplication] canOpenURL:url]) { [[UIApplication sharedApplication] openURL:url options:@{} completionHandler:nil]; } }]]; [KEYWINDOW.rootViewController presentViewController:al animated:YES completion:nil]; // [self.locationManager requestLocationWithReGeocode:YES completionBlock:^(CLLocation *location, AMapLocationReGeocode *regeocode, NSError *error) { // resultBlock(location,regeocode,error); // }]; [self.lcManager startUpdatingLocation]; }else{ // [self.locationManager requestLocationWithReGeocode:YES completionBlock:^(CLLocation *location, AMapLocationReGeocode *regeocode, NSError *error) { // resultBlock(location,regeocode,error); // }]; [self.lcManager startUpdatingLocation]; } } -(void)stopLoction{ [self.lcManager stopUpdatingLocation]; } //检查定位权限 -(BOOL)checkAuthorization{ BOOL result = NO; CLAuthorizationStatus status = [CLLocationManager authorizationStatus]; switch (status) { //用户在设置中关闭定位功能,或者用户明确的在弹框之后选择禁止定位 case kCLAuthorizationStatusDenied: result = NO; break; //用户没有选择是否要使用定位服务(弹框没选择,或者根本没有弹框)注:高德会自动请求权限 case kCLAuthorizationStatusNotDetermined: result = YES; break; //定位服务授权状态受限制,可能由于活动限制了定位服务,并且用户不能改变当前的权限,这个状态有可能不是用户拒绝的,但是也有可能是用户拒绝的。 case kCLAuthorizationStatusRestricted: result = NO; break; //App始终允许使用定位功能 case kCLAuthorizationStatusAuthorizedAlways: result = YES; break; //用户在使用期间允许使用定位功能 case kCLAuthorizationStatusAuthorizedWhenInUse: result = YES; break; default: break; } return result; } @end