iOS中的定位功能

iOS中的定位功能

CoreLocation框架(CoreLocation.framework)可用于定位设备当前的经纬度,通过该框架,应用程序可通过附近的蜂窝基站、WIFI信号或者GPS等信息计算用户位置。
iOS SDK提供了CLLocationManager、CLLocationManagerDelegate来处理设备的定位信息,包括获取设备的方向以及进行方向检测等。

iOS开发者使用CoreLocation.framework框架进行定位非常简单,CoreLocation框架的常用API主要有如下几个:

  • CLLocationManager:定位管理器类;
  • CLLocationManagerDelegate:该协议代表定位管理器的delegate协议。实现该协议的对象可负责处理CLLocationManager的定位事件;
  • CLLocation:该对象代表位置。该对象包含了当前设备的经度、纬度、高度、速度、路线等信息,还包含了该定位信息的水平精确度、垂直精确度以及时间戳信息;
  • CLHeading:该对象代表设备的移动方向;
  • CLRegion:该对象代表一个区域。一般程序不会直接使用该类,而是使用它的两个子类,即CLCircularRegion(圆形区域)和CLBeaconRegion(蓝牙信号区);
    除此之外,CoreLocation框架还涉及一个CLLocationCoordinate2D结构体变量,该结构体变量包含经度、纬度两个值,其中CLLocation对象的coordinate属性就是一个CLLocationCoordinate2D结构体变量。

通过上述API不难看出,通过定位我们可以做什么?

  • 获取用户当前位置,记录路线轨迹等
  • 监控行车速度和行车距离
  • 方向监测
  • 指南针
  • 区域监听,比如用户进入某个区域时推广某些信息,考勤打卡等

1.定位常用属性和方法

1.0请求定位步骤

  • 导入CoreLocation框架
  • 懒加载CLLocationManager对象
  • 请求授权 (1) 使用期间whenInUse (2) 始终允许always
  • 注意:必须把授权对应的key值 添加到info.plist文件中
  • 设置代理,实现代理方法
  • 开始定位

1.1获取定位权限

定位属于用户的隐私权限,所以当APP需要使用这一权限的时候,需要获取用户的授权.
在获取授权之前,我们必须把授权对应的key值 添加到info.plist文件中,否则可能会引起APP crash或者审核不通过.
跟定位相关的隐私权限主要有两种,

  • NSLocationWhenInUseUsageDescription(使用期间)
  • NSLocationAlwaysUsageDescription(始终允许)

通俗的说,如果只是一次性定位,不需要持续定位的话,这俩实际并无区别.
而持续定位时这俩的差别,会单独在后面讲后台持续定位的时候提及.

1.2定位属性的应用

精确度desiredAccuracy

desiredAccuracy精确度越高,越耗电,属性接收double类型的值,也可以传系统给定好的值
系统给出的枚举类型有以下:

  • kCLLocationAccuracyBestForNavigation: 导航精确度(最精确)
  • kCLLocationAccuracyBest: 最好精确度(默认)
  • kCLLocationAccuracyNearestTenMeters: 10米的误差
  • kCLLocationAccuracyHundredMeters: 100米的误差
  • kCLLocationAccuracyKilometer: 千米误差
  • kCLLocationAccuracyThreeKilometers: 三千米的误差

距离过滤distanceFilter

设置用于移动多少距离,重新进行定位
枚举类型同精确度,也是一个float值.

1.3位置信息的获取

通过代理方法,我们可以获取到更新后的位置信息.以下是位置具体属性的图示.

cllocation.png

1.3后台持续定位

之前产品提了一个需求,想持续上报司导的位置信息,这就需要用到我们的后台持续定位功能了.
使用后台定位需要以下设置:

  • 选中target-->Gapability,打开Background Modes模式,并勾选Location updates,如下图所示:
background.png
  • 设置允许后台更新位置的属性.需注意的是,该属性必须和上一条设置配合使用,否则会crash

     if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"9.0")) {
        // 该模式是抵抗程序在后台被杀,申明不能够被暂停
        self.locationManager.allowsBackgroundLocationUpdates = YES;
        
    }
    self.locationManager.pausesLocationUpdatesAutomatically = NO;

为什么要进行以上设置呢?
因为iOS系统下,当APP进入后台时,过三分钟之后,APP会自动进入挂起模式,也就是说如果不做任何处理的情况下,定位会被系统终止掉.当用户再进入APP的时候,定位又重新开始.所以才说APP使用定位的授权选项,使用应用期间和始终其实区别不大.如果不想被终止,就得通过后台模式设置,向苹果声明,APP在后台需要操作的权限,这样定位功能才得以保留.

使用定位的授权选项,使用应用期间和始终,唯一的区别就是,当APP退到后台并持续定位时,使用应用期间的权限下,APP顶部状态栏会有个蓝色的条,提示用户当前APP一直在使用定位.而始终这个选项则不会.

说到这里,之前GAPP按照以上设置,功能正常,但是在提交appstore的时候被拒绝了,理由是,审核人员不认为我们的APP需要持续定位.后来在笔者申诉加重新提审的情况下,苹果体谅的给我们通过了.

持续定位优化方案,可以从以下几个维度考虑:

  • 精度
  • 过滤距离范围
  • 定时
  • 重大位置变化比如方向等

耗电测试:
1.位置相对固定时,自动更新位置和交替精度(精度非常精确和宽泛时定时切换)的对比实验;
2.位置更新比较频繁情况下,二者的对比

第一种情况下,自动更新位置能坚持8个小时左右,交替精度大概在6小时;
第二种情况下,由于位置变动时间只在一个小时左右,差别不太明显;

针对GAPP产品提出想要定时持续更新司导位置的需求,最终采取了第二种方案.

2.计算经纬度之间的距离

计算经纬度之间的距离所需步骤:

  • 获取当前位置信息
  • 获取另一个位置的经纬度
  • 计算两个位置的距离
distance.png

3.地理编码&反地理编码

地理编码:输入地理名称,地理编码获得该位置的经纬度.

反地理编码:输入经纬度,输出对应位置的地理名称

地理编码步骤

  • 创建 CLGeocoder对象
  • 对地理名称进行地理编码
  • 对闭包中的CLPlacemark数据就行解析(遍历)
    一个地理名称可能对应多个地方,所以编码后的到的结果是一个数组
  • 获取数组中元素的地理位置(经纬度)
  • 将经纬度显示到界面

反地理编码步骤

  • 拿到用户输入的经纬度
  • 对经纬度进行反地理编码
  • 对闭包中的CLPlacemark数据就行解析(遍历)
    一个经纬度可能对应多个位置(苹果这么设计的) 所以编码后返回一个数组
    一个位置包含多个信息(省/市/街道/国家/经纬度/) 编码后的结果是字典数组
  • 取出数组中的一个位置(字典),再获取位置信息(取出字典的元素)
  • 把获取到的地理名称显示到界面

关于地理编码和反地理编码的实例,放到区域监听的demo里做一并说明.

4.区域监听 region

当用户进入或者离开某个区域的时候,对应进行某些操作
实例:打卡

笔者仿照钉钉写的打卡的小demo,大概功能如下:
1.当不在考勤范围内时,打卡显示外勤打卡,颜色区分显示,并提示当前打卡位置
2.当位置更换,进入考勤范围时,颜色改变,打卡显示正常打卡,并提示当前打卡位置

4.1区域监听步骤:

  • 确定区域中心坐标点
  • 确定区域半径
  • 区域监听方法,离开某个区域和进入某个区域时做相应处理

4.2注意点

  • 当之前添加过监听区域时,再次添加新的监听区域,还会对之前的区域进行监听
  • 不想监听之前的区域,必须通过代码移除之前的区域
  • 使用前先判断区域监听是否可用
  • 注意监听区域的个数 (区域监听个数有上限)
  • 注意区域半径是否大于最大监听半径
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,029评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,395评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,570评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,535评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,650评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,850评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,006评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,747评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,207评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,536评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,683评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,342评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,964评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,772评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,004评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,401评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,566评论 2 349

推荐阅读更多精彩内容