iOS学习——自动定位

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

  首先,我们用到的系统自带的定位模块是: <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];
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏北京马哥教育

10个方法助你轻松完成Linux系统恢复

在Linux中有一些应用程序可以帮助你保存系统快照。大多数应用程序都是针对于新手的,并不需要高级的Linux操作技巧。我们在这里挑选了10个,你可以从中选择适合...

5345
来自专栏乐百川的学习频道

使用内网穿透工具frp

前几天写了篇文章用本机电脑搭建网站(域名、DNS解析),写完第二天发现我的网站访问不上去了。仔细研究了一下,发现我想的太简单了。很早一些时候,运营商会给我们分配...

2.1K11
来自专栏Flutter入门到实战

开发工具总结(3)之Git及GitHub快速入门图文全面详解

版权声明:本文为博主原创文章,未经博主允许不得转载。https://www.jianshu.com/p/3f12bd3ccf2a

1163
来自专栏JAVA高级架构

高并发解决方案--负载均衡

2602
来自专栏腾讯Bugly的专栏

移动 H5 首屏秒开优化方案探讨

导语 随着移动设备性能不断增强,web 页面的性能体验逐渐变得可以接受,又因为 web 开发模式的诸多好处(跨平台,动态更新,减体积,无限扩展),APP 客户端...

8365
来自专栏淡定的博客

总结一下laravel中Hash::make()遇到的坑

==这里遇到的坑就是laravel框架中,每次hash的值都是不一致的,跟之前写过的md5不一样,md5是唯一的,但是只要保存进去了,就算hash以后的值是不一...

8863
来自专栏Rainbond开源「容器云平台」

好雨云帮每周更新日志(2017.02.27-2017.03.12)

1213
来自专栏流柯技术学院

Tomcat性能调优方案

一、操作系统调优  对于操作系统优化来说,是尽可能的增大可使用的内存容量、提高CPU的频率,保证文件系统的读写速率等。经过压力测试验证,在并发连接很多的情况下,...

1212
来自专栏北京马哥教育

能当主力,能入虚拟机,还能随时打包带走,Linux 就是这么强大

这里介绍一下自己管理自己的Linux桌面的一点经验吧,我觉得还是有不少可取之处的。先来说一下大多数人管理Linux桌面的方法有哪些不方便的地方吧:

2800
来自专栏Seebug漏洞平台

DeDeCMS v5.7 密码修改漏洞分析

织梦内容管理系统(DedeCms)以简单、实用、开源而闻名,是国内最知名的PHP开源网站管理系统,也是使用用户最多的PHP类CMS系统,在经历多年的发展,目前的...

4818

扫码关注云+社区

领取腾讯云代金券