*近在项目中需要做自动定位功能,就是你在参加会议通过扫描二维码签到的时候自动定位并将你的定位信息在签到中上传,这样可以避免我们进行假签到。在这个功能中,主要用到的是系统自带的定位模块,首先我们是需要配置定位功能的参数,然后当我们定位成功时调用特定的方法进行相应操作就可以了,当然,在定位失败时我们也可以进行相应的操作,这些都有对应的一些回调方法,我们只需要重写对应的回调方法就可以实现对应的功能了。

首先,我们用到的系统自带的定位模块是: <CoreLocation/CoreLocation.h> ,定位成功/失败的方法都是通过代理 CLLocationManagerDelegate 来完成的,所以我们在需啊哟进行定位的类中也需要继承自代理,并实现对应的一些方法才能成功完成回调。在定位功能的调用中,主要分为两步:1、定位参数的配置;2、代理回调方法的实现

一 定位参数的配置

定位参数的配置主要是通过系统的定位管理器CLLocationManager进行配置,参数配置的几个要点主要是设置代理,设置寻址精度,然后开启定位。当然,这些参数的配置的前提是我们的手机已经对我们的项目进行了地理位置的授权,所以我们再配置之前需要对当前定位权限进行判断,通过 [CLLocationManager locationServicesEnabled] 方法可以直接得到定位权限是否开启,如果有对应的权限,我们就可以进行对应的配置信息,否则我们无法进行对应的配置,这时候我们可以弹出一个对话框进行提示用户如何开启定位权限,在我们的项目中因为不需要进行提示,所以没有对应的代码模块。

- (void)viewDidLoad {
    [super viewDidLoad];

    //配置定位信息
    [self configLocation];
}

- (void)configLocation{
    self.place = @"";
    //判断定位权限是否打开
    if ([CLLocationManager locationServicesEnabled]) {
        locationManager = [[CLLocationManager alloc] init];
        locationManager.delegate = self;
        //设置寻址精度
        locationManager.desiredAccuracy = kCLLocationAccuracyBest;
        locationManager.distanceFilter = 100.0f;
        //开始定位
        [locationManager startUpdatingLocation];
    } else {
        //如果定位权限没有打开,可以进行相应的提示
        //具体代码省略
    }
}

 二 代理方法的回调

在前面我们说过了,我们的类需要继承CLLocationManagerDelegate代理,并实现其中的一些方法才能在定位成功/失败时能够正确地调用对应的代理方法。主要用到的代理方法有两个,一个是成功时调用,一个是失败时调用,具体代码如下。在定位失败时,我们首先可以弹框提示定位失败的原因,接着我们可以选择重新定位,或者我们也可以选择限制连续定位失败多少次后就不再进行定位了,具体需要实现的方法大家可以根据需要进行配置和开发。

#pragma mark - CLLocationManagerDelegate
//定位成功的回调,在这里我们配置我们的位置信息
-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations{
    [locationManager stopUpdatingLocation];
    CLLocation *currentLoc = [locations lastObject];
    CLGeocoder *geoCoder = [[CLGeocoder alloc] init];
    //利用经纬度进行反编译获取位置信息
    [geoCoder reverseGeocodeLocation:currentLoc completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {
        if (placemarks.count > 0) {
            //获取当前定位信息
            CLPlacemark *placeMark = [placemarks firstObject];
            if (placeMark) {
                self.place = [NSString stringWithFormat:@"%@%@%@%@",placeMark.administrativeArea,placeMark.locality,placeMark.subLocality,ZYIsNullOrEmpty(placeMark.thoroughfare)?@"":placeMark.thoroughfare];
            }
        }
    }];
}

//定位失败时调用
- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error{
    [locationManager startUpdatingLocation];
}