《iOS组件与框架——iOS SDK高级特性剖析》——第2章,第2.2节获取用户的位置

简介:

本节书摘来自异步社区《iOS组件与框架——iOS SDK高级特性剖析》一书中的第2章,第2.2节获取用户的位置,作者 【美】Kyle Richter , Joe Keeley,更多章节内容可以访问云栖社区“异步社区”公众号查看

2.2 获取用户的位置
iOS组件与框架——iOS SDK高级特性剖析
要使用 Core Location 获取设备的当前位置,需要执行多个步骤。只有在得到用户许可的情况下,应用才能获取设备的当前位置;获取设备位置前,应用还必须确保设备启用了定位服务。满足这些条件后,应用便可启动位置请求,并对Core Location提供的结果进行分析和使用。本节将详细介绍这些步骤。

2.2.1 需求和许可
要在应用中使用Core Location,需要将框架CoreLocation加入项目目标,并根据需要导入CoreLocation头文件:


78729caf3b9a16a0aa3bb4a4e508a7d3888925d5

Core Location尊重用户隐私,仅在用户许可时获取设备的当前位置。在应用“设置”的“隐私”部分,可在设备上关闭或开启定位服务,还可禁止或允许特定应用获取位置信息,如图2.1所示。


1aa5ff311927edf16b300672b2bd5f571c1ab00a

要请求用户允许使用定位服务,应用需要让CLLocationManager开始更新当前位置或将MKMapView实例的属性ShowsUserLocation设置为YES。如果设备关闭了定位服务,Core Location 将提醒用户在应用“设置”中开启定位服务,让应用能够获取当前位置,如图 2.2所示。

如果位置管理器以前未请求用户允许获取设备的位置,它将显示一个提醒框,请求用户许可,如图2.3所示。


2232cf4fc2a659ab7dab7eff5c665eb52efb098f

图2.3 示例应用FavoritePlaces使用提醒框请求用户允许获取设备的位置

如果用户轻按OK按钮,说明得到了用户的许可,位置管理器将获取当前位置。如果用户轻按按钮Don’t Allow禁止获取当前位置,将调用CLLocationManager的委托ICFLocationManager中响应授权状态变化的方法。


ddc4290639537a6214c7ecc655bbee51a4452292

在这个示例应用中,ICFLocationManager存储其他地方的位置请求结束块,以便能够轻松地处理多个位置请求。位置可用或发生错误时,方法getLocationWithCompletionBlock:将执行存储的所有结束块,让调用者能够根据当前的情况以合适的方式使用位置或处理错误。用户禁止获取当前位置时,调用者显示一个提醒框,指出发生了位置获取请求遭拒错误,如图2.4所示。


a352407d8875e5401e50c0aaaabe4f0354e63106

在示例应用中,这个方法是在ICFLocationManager中实现的,它在未获得用户许可时显示错误提示,在得到用户许可时重启位置更新并清除以前的错误。

2.2.2 检查定位服务是否已开启
要直接检查设备是否开启了定位服务,可使用CLLocationManager的类方法location ServicesEnabled。


c46c347a331ad000e41e109239090bea98fe7841

使用这个类方法,可让应用根据能否获取当前位置采取不同的措施。在使用位置的应用中,应在用户禁止获取当前位置时采取妥善的措施,并清楚地告诉用户,如果他想让应用获取当前位置,该如何做。

2.2.3 开始位置请求
获得使用定位服务的许可后,便可使用CLLocationManager实例来获取当前位置了。在示例应用中,ICFLocationManager负责集中管理位置功能,它为应用管理着一个CLLocationManager实例。在ICFLocationManager类的方法init中,创建了一个CLLocationManager实例,并根据定位需求对其进行了定制。


8cb1b4d7be2a4566f74d19ff37ce216548f9dbc8

可设置CLLocationManager的多个属性,以指定它如何管理当前位置。通过设置精度属性desiredAccuracy,应用可告诉CLLocationManager,该以缩短电池续航时间为代价尽可能提高精度,还是为延长电池续航时间而使用较低的精度。使用较低的精度时,还可缩短获取当前位置所需的时间。通过设置属性distanceFilter,可告诉CLLocationManager,移动多长距离后才触发新的位置事件;这对微调基于位置变化的功能很有帮助。最后,给CLLocationManager指定了委托,这使得可以独特的方式响应位置事件和授权状态变化。为获取位置做好准备后,让位置管理器开始更新位置。


30b654b29faef57736ab01bae9df28b37d2e40f3

CLLocationManager将根据指定的参数在需要时利用GPS和/或Wi-Fi确定当前位置。应实现两个委托方法,它们分别处理如下情形:位置管理器更新了当前位置或无法更新当前位置。获取位置后,将调用方法locationManager:didUpdateLocations:。


71170e40f46d048e885fd9e6f1ade8552fc44f45

位置管理器可能通过数组locations提供多个位置,其中最后一个对象是最新的位置。位置管理器还可能在没有开始获取位置时,就快速返回GPS检测到的最后位置;在这种情况下,如果GPS已关闭且设备发生了移动,返回的位置将很不准确。这个方法检查位置的精度,如果精度值为负,就忽略返回的位置。如果返回的位置相当准确,这个方法就存储它并执行结束块。请注意,在逐步获取准确位置期间,位置管理器可能调用这个方法多次,编写这个方法时必须考虑到这一点。


c762dd650d991073bd2a7d52210ac48a4efbef0b

如果位置管理器未能获取位置,它将调用方法locationManager:didFailWithError:。导致错误的原因可能是未得到用户的许可,也可能是由于GPS或Wi-Fi不可用(例如,设备处于飞行模式)。发生错误时,示例应用命令位置管理器停止更新当前位置、捕获错误并执行结束块(让请求当前位置的代码能够妥善地处理错误)。

位置管理器委托可监视航向变化,这很有用。例如,可使用这些信息在地图上标出用户的前进路线相对于正确路线的偏差。要获取航向信息,需要让位置管理器对其进行监视。还可设置一个可选的筛选器,这样航向变化小于指定的度数时就不会获取更新。


c2bc8c074e1a840fd42e91f126c5cd9482e27529

参数newHeading提供了多项重要信息,其中包括相对于磁北的航向和相对于真北的航向,它们的单位都是度。它还提供了精度,这指出了磁北航向可能偏离多少度。这个值为越少的正数,航向就越准确;如果为负数,就说明航向无效,这可能是因为存在磁场干扰。时间戳指出了航向是什么时候获取的,应通过检查它来避免使用过时的航向。

2.2.4 分析和理解位置数据
位置管理器返回的位置是用CLLocation实例表示的。CLLocation包含多项有关位置的重要信息,首先是用CLLocationCoordinate2D表示的经度和维度。


5f08901fa45cfc73e33b7fca4f5f00244f09d676

维度指的是位于赤道以北或以南多少度,其中赤道为0度,北极为90度,而南极为-90度。经度指的是位于本初子午线以东或以西多少度;本初子午线是一条虚构的线条,它从北极出发,经英国格林尼治天文台到达南极。位于本初子午线以西时,经度为负数,最高可达-180度;而位于本初子午线以东时,经度为正数,最高可达180度。

作为经度和维度坐标的补充,还有水平精度,它用CLLocationDistance或米数表示。水平精度指的是实际位置与返回的坐标之间的距离在指定米数内。


29f770294a1f5348e7fee673a35c27fed053a8ed

2.2.5 重大变化通知
Apple强烈建议应用在获取位置后停止位置更新,以延长电池的续航时间。如果应用不要求位置非常准确,可监视重大位置变化,这是一种高效的方式,既让应用获悉设备的位置发生了重大变化,又可避免让GPS和Wi-Fi不断监视当前位置,从而极大地节省电量。


846047e2de78c7a313a07dfbde20b0607d7c6f83

通常,在设备位置变化超过500米或更换了连接的基站时,将发出通知。另外,仅当最后一次通知是在 5 分钟之前时,才会发送新的通知。位置更新时间被交给委托方法 locationManager: didUpdateLocations:进行处理。

2.2.6 使用GPX文件进行位置测试
测试基于位置的应用令人望而却步,需要对不方便的位置进行测试时尤其如此。所幸Xcode使用GPX文件提供了强大的位置测试支持。GPX文件是GPS交换格式(Exchange Format)文档,它使用XML格式,可用于在设备和GPS之间交换信息。在调试模式下,Xcode可使用GPX文件定义的“航点”来设置iOS模拟器或设备的当前位置。

在示例应用中,使用文件DMNS.gpx将当前位置设置为丹佛自然科学博物馆(Denver Museum of Nature and Science)。


3235b073335487dc55f1371316ae3ca45aa2baa7

要让Xcode使用GPX文件进行调试,可从项目窗口左上角的下拉列表Scheme中选择Edit Scheme,再选择标签Options,并选中复选框Allow Location Simulation,如图2.5所示。选择复选框Allow Location Simulation,便可从下拉列表 Default Location中选择一个位置。这个下拉列表包含一些内置位置,还包含添加到项目中的GPX文件指定的位置。


d71ba0fcf3118ddb3e102856b50a2e0e7e7c445a

应用在调试模式下运行时,Core Location将返回GPX文件指定的位置,将其作为设备或模拟器的当前位置。要在调试期间改变模拟位置,可从Xcode菜单中选择Debug>Simulate Location,再选择一个位置,如图 2.6 所示。Core Location将把模拟位置改为选定的位置,导致委托方法locationManager:didUpdateLocations:被调用。


05f6da082b55c0b56253bcbf461d52039fce95f7
相关文章
|
1月前
|
搜索推荐 数据管理 定位技术
iOS应用开发中有多种主流框架
iOS应用开发中有多种主流框架
182 60
|
10天前
|
iOS开发 开发者 MacOS
深入探索iOS开发中的SwiftUI框架
【10月更文挑战第21天】 本文将带领读者深入了解Apple最新推出的SwiftUI框架,这一革命性的用户界面构建工具为iOS开发者提供了一种声明式、高效且直观的方式来创建复杂的用户界面。通过分析SwiftUI的核心概念、主要特性以及在实际项目中的应用示例,我们将展示如何利用SwiftUI简化UI代码,提高开发效率,并保持应用程序的高性能和响应性。无论你是iOS开发的新手还是有经验的开发者,本文都将为你提供宝贵的见解和实用的指导。
93 66
|
1月前
|
iOS开发 开发者
探索iOS开发中的SwiftUI框架
【10月更文挑战第39天】在苹果的生态系统中,SwiftUI框架以其声明式语法和易用性成为开发者的新宠。本文将深入SwiftUI的核心概念,通过实际案例展示如何利用这一框架快速构建用户界面,并探讨其对iOS应用开发流程的影响。
|
1月前
|
开发框架 Dart Android开发
安卓与iOS的跨平台开发:Flutter框架深度解析
在移动应用开发的海洋中,Flutter作为一艘灵活的帆船,正引领着开发者们驶向跨平台开发的新纪元。本文将揭开Flutter神秘的面纱,从其架构到核心特性,再到实际应用案例,我们将一同探索这个由谷歌打造的开源UI工具包如何让安卓与iOS应用开发变得更加高效而统一。你将看到,借助Flutter,打造精美、高性能的应用不再是难题,而是变成了一场创造性的旅程。
|
2月前
|
移动开发 网络协议 小程序
基于开源IM即时通讯框架MobileIMSDK:RainbowChat-iOS端v9.1版已发布
RainbowChat是一套基于开源IM聊天框架 MobileIMSDK 的产品级移动端IM系统。RainbowChat源于真实运营的产品,解决了大量的屏幕适配、细节优化、机器兼容问题
66 5
|
2月前
|
Swift iOS开发 开发者
探索iOS开发中的SwiftUI框架
【10月更文挑战第21天】在苹果生态系统中,SwiftUI的引入无疑为iOS应用开发带来了革命性的变化。本文将通过深入浅出的方式,带领读者了解SwiftUI的基本概念、核心优势以及如何在实际项目中运用这一框架。我们将从一个简单的例子开始,逐步深入到更复杂的应用场景,让初学者能够快速上手,同时也为有经验的开发者提供一些深度使用的技巧和策略。
54 1
|
2月前
|
存储 安全 开发工具
百度公共IM系统的Andriod端IM SDK组件架构设计与技术实现
本文主要介绍了百度公共IM系统的Andriod端IM SDK的建设背景、IM SDK主要结构和工作流程以及建设过程遇到的问题和解决方案。
62 3
|
3月前
|
iOS开发 开发者 UED
探索iOS应用开发中的SwiftUI框架
【9月更文挑战第26天】 在iOS开发的海洋中,SwiftUI犹如一艘现代的快艇,引领着开发者们驶向更加高效与直观的编程体验。本文将带你领略SwiftUI的魅力,从其设计理念到实际应用,我们将一步步揭开它如何简化界面构建过程的面纱。通过对比传统方式,你将看到SwiftUI如何让代码变得像诗一样优美,同时保持强大的功能性和灵活性。准备好让你的iOS开发技能加速升级,一起驾驭这股新潮流吧!
|
1月前
|
开发框架 前端开发 Android开发
安卓与iOS开发中的跨平台策略
在移动应用开发的战场上,安卓和iOS两大阵营各据一方。随着技术的演进,跨平台开发框架成为开发者的新宠,旨在实现一次编码、多平台部署的梦想。本文将探讨跨平台开发的优势与挑战,并分享实用的开发技巧,帮助开发者在安卓和iOS的世界中游刃有余。
|
20天前
|
开发框架 Android开发 iOS开发
安卓与iOS开发中的跨平台策略:一次编码,多平台部署
在移动应用开发的广阔天地中,安卓和iOS两大阵营各占一方。随着技术的发展,跨平台开发框架应运而生,它们承诺着“一次编码,到处运行”的便捷。本文将深入探讨跨平台开发的现状、挑战以及未来趋势,同时通过代码示例揭示跨平台工具的实际运用。

热门文章

最新文章