国家地理iOS开发新家入门 | 第八段:地图及位置

当这等同段节吃,你拿会学到以公的app中哪使iPhone中的GPS。你以会见学会如何得到用户之岗位,同时以地图上标有位置。本章内容涵盖了
地图套件(Map
Kit)和苹果公司供的地形图、方向框架。通过学习本章节的情,你顿时就好搞定基于位置固定的使。

提供用户的位置信息是开发iOS应用最激动人心的特征,在地图上出示用户之各项需要简单只步骤。

先是步用Core Location来收集用户的位置。Core
Location是平层层类的会师,通过设备的GPS和蜂窝获取位置信息,还会凭WIFI获取用户信息。Core
Location
是由于苹果商店供的多多frameworks中之一个。Frameworks是相同组类的集,为切实的有任务而计划之同样仿工具。我们现在所以Core
Location举一个例,Core
Location是为处理用户位置信息若计划的一个framework。Core
Data是为处理多少而设计的一个framework。这些framework是可选的,因此要事先将这些框架导入到工程中后,才会使这些框架。

其次步是于地形图中标注出用户之岗位。苹果商店提供了Map
Kit框架,帮助我们绘制和治本地图。在Xcode
6中导入框架非常容易。首先Project
Navigator中点击项目名称,点击名为Capabilities的tab选项按钮,向下滚动找到Maps。将地图的开要处On的状态,这时MapKit框架已补给加至工程被了。现在虽说能够在工程中找到MapKit,但是导入流程还尚无就。MapKit还需导入controller
file中。我们下列一行代码完成导入工作:

import MapKit

如此,MapKit类和情商便导入到controller文件中了。MapKit中的类及协议还是因MK开头的。

Page 213

Core Location

无独有偶而之前所说之,Core Location是千篇一律名目繁多查找用户位置的切近的联谊。Core
Location中产生三个检测用户位置的方式。第一只章程是Significant-Change
Location。这个主意能节约电池电量,它仅仅当用户之职明显改观时才见面更新位置。第二单方式是Location
Services,可以自主确定一定更新的条条框框。最后一种植方式是Regional
Monitoring方法,使用附近的地理区域界线或Bluetooth
beacons来定位。本书要介绍第二种植艺术:Location
Services,它是最常用到的计。

再次多信息要参见苹果公司之Location and Maps Programming
Guide。

落用户位置要采取Core Location框架,当你把Maps
capabilities开关切换成On(开)状态时,Xcode并无机关导入Core
Location框架,需要我们手动导入,请圈之下四个步骤:

  1. 点击Project Navigator上的蓝色工程图标;
  2. Editor显示工程的详细信息,滑倒最下方;
  3. 以Link Binary with Libraries下方点击Add;
  4. 选料Core Location,然后点击Add。

Core Location框架就会加加到Project
Navigator中,我们还得在controller中描绘一行代码才会赢得这框架:

import CoreLocation

手机用户的职深耗电量,它于另外的职责需要再行多之电池电量和天线频率,所以确保您的App只有以需要位置时才获得位置,一旦获得到岗位,就管此意义关闭,如果未来还需要地理位置,可以应用期限更新功能

当取用户位置之前,很重点的同样桩事是优先反省一定服务是否可用。定位服务无法以或是由以下几种状况:

  • 用户以安中关闭了Location Services(定位服务)。
  • 用户禁止你的App使用Location Services(定位服务)。
  • 配备处飞行模式或连续不了网。

Page 214 | Chapter 8 : Maps and Location

Core
Location提供了名为也locationServicesEnabled的计来检查设备的恒服务是否可用,locationServicesEnabled方法通过布尔型返回值来确定定位服务是否可用,true可用,false不可用。

Requesting User Location

经过CLLocationManager类来请求用户位置。首字母CL代表Core Location。The
location
manager用于采集参数和开定位服务。创建CLLocationManager对象以及创其他的靶子类似。举例说明:

var locationManager: CLLocationManager = CLLocationManager()

CLLocationManager有一部分特性是须使安装的。

desiredAccuracy属性是枚举类型,枚举,就是用一个要词代表一个数字。枚举有点像是大半选题,你要从选中选择出一个价来。desiredAccuracy属性有下面有价:

kCLLocationAccuracyBest
极致精准的固定,也是最消耗电量的挑三拣四
kCLLocationAccuracyNearestTenMeters
精准度在十米范围外
kCLLocationAccuracyHundredMeters
准确度在一百米克外
kCLLocationAccuracyKilometer
精确度在一千米限外
kCLLocationAccuracyThreeKilometers
精确度在三千米范围外

精准度越强,电量消耗越老。我们若选取会满足低要求的精准度级别。如果是如Google地图之类的App来追踪用户之位置,那么kCLLocationAccuracyNearestTenMeters或者kCLLocationAccuracyHundredMeters哪怕好满足我们的要求。如果App只需要提供用户所在城市,像是Twitter中之稳定,kCLLocationAccuracyKilometer或者kCLLocationAccuracyThreeKilometers纵然足以满足我们的急需。大多数状况下,一般不欲kCLLocationAccuracyBest

装desiredAccuracy属性的主意以及装任何对象的特性一样:

locationManager.desiredAccuracy = kCLLocationAccuracyHundredMeters

Core Location | Page 215

CLLocationManager也要delegate属性。CLLocationManage
delegate遵循CLLocationManagerDelegate协议。无论何时出现了位置更新或者出现谬误,delegate都见面吸收及警示。为了接收这些警告,delegate必须透过CLLocationManagerDelegate协议和警报保持沟通。controller必须声明遵循协议,将CLLocationManagerDelegate添加到类的顶部:

class ViewController: UIViewController, CLLocationManagerDelegate

怀念使收定位警高,要用locationManager(_:,didUpdateLocations:)术。每当定位信息变更的经常,这个点子就见面于调用:

func locationManger(manager: CLLocationManager!,didUpdateLocations locations: [AnyObject]!) {
    println("Location found")
}

顾念只要以任何时刻都能收到Core
Location的谬误警告,需要利用locationManager(_: didFailWithError:)方法:

func locationManager(manager: CLLocationManager!, didFailWithError error:NSError!) {
    println("Error!")
}

倘以协议并应用中的道后,就非得要设置delegate的性能:

locationManager.delegate = self

每当激活定位服务前,
用户必须允许app使用用户的位置信息。定位服务来点儿栽特许项目。第一种植是requestWhenInUseAuthorization;授权App仅限前台运行的常常采取位置信息。
第二栽是requestAlwaysAuthorization.
授权App在前台要后台运行都好获得用户的职信息,第二只授权都见面叫app提供追踪用户位置的力量。调用授权的计是:

locationManager.requestWhenInUseAuthorization()

locationManager.requestAlwaysAuthorization()

获授权后,调用startUpdatingLocation()艺术被定位服务:

locationManager.startUpdatingLocation()

这么,locationManager会根据有关要求开追踪并返回用户位置信息。

Page 216 | Chapter 8 : Maps and Location

locationManager (_:, didUpdateLocations:)方法会提供CLLocation数组,按照出现前后顺序排列。数组中足足会有一个靶。数组中的各个一个对象还是是一个CLLocation。CLLocation这个看似为实际的岗位整理组织CLLocationManager的职务数据。CLLocation跟踪地理坐标,海拔,速度,方向,甚至席卷定位准确度。CLLocation拥有许多得力之性质:

coordinate
CLLocationCoordinate2D, 纬度坐标和经度坐标
altitude
海拔高度,单位:米
timestamp
获得到多少经常之时间和日期
description
故字符串的格式返回CLLocation,可以据此print()打印出

吁牢记,一旦而取了而需要的信息,必须终止定位服务效果。为了停息这些服务,在CLLocationManager中调用stopUpdatingLocation()
:

manager.stopUpdatingLocation()

推个例证,在locationManager( manager: ,didUpdateLocations:)法被获取位置后,常常会停定位服务。之前以CLLocationManager中创造的那些变量非常适合处理当下之这种场面。

**明白了!** iOS 8模拟器在法Core
Location时会出现局部光景未雷同的作为。如果固定服务没有调用,在Info.plist文件中上加三个键:
NSLocationWhenInUsageDescription NSLocationAlwaysUsageDescription
NSLocationUsageDescription 每个键对应的价值设置成Always或者When in Use
这三只键值会帮打开定位服务

Core Location | Page 217

Map Kit

Map
Kit框架提供地图和趋势,地图可以来得暨街道级别之音讯,3D建筑,卫星图像,或者将两端结合起来。地图自动响应缩小、放大、平移、倾斜等手势动作,还会以地形图上标注点同时丰富注解。

MKMapView

Map
Kit提供MKMapView视图类来显示地图,MKMapView可以来得地图,管理用户之输入信息,展示从定义注释。

MKMapView也发出一个delegate属性。和CLLocationManager的delegate属性一样,MKMapView的delegate也会接收updates。MKMapView
delegate需要以MKMapViewDelegate协议。设置delegate的方式是,从Storyboard的Editor中,将Map
View用Control拖动法拖动到Document Outline中之View
Controller文字上,然后弹出一个菜单,点击菜单中之delegate,这样虽以系界面上设置好了delegate。

MKMapView有成千上万方便之习性和方式。举了例子,MKMapView不用添加任何代码就可于地形图上显示用户地理位置。我们管性能设置showsUserLocationtrue,就得在地图上展示用户信息了:

myMapView.showsUserLocation = true

用户的职务将会晤以地形图及用一个蓝点标注出。

貌似我们将用户所在位置设置为地图的中心点。如果想走还设置地图中心点,需要装centerCoordinate属性,centerCoordinate属性需要CLLocationCoordinate2DCLLocationCoordinate2D是经度和纬度的坐标,被起包改成一个独门的变量。通过CLLocationCoordinate2DMake措施创建CLLocationCoordinate2D

var coordinates: CLLocationCoordinate2D = CLLocationCoordinate2DMake(100,100)

奇迹我们会当地图上拓宽位置,当region性设置好后,放大后图像会自行调整。region属性需要MKCoordinateRegion目标,然而,大部分场面下,比从创建新的目标,编辑时底region对象会重复简单有:

var updatedRegion: MKCoordinateRegion = myMapView.region
updatedRegion.span.longitudeDelta = updatedRegion.span.longitudeDelta * 2.0
updatedRegion.span.latitudeDelta = updatedRegion.span.latitudeDelta * 2.0 
myMapView.region = updatedRegion

Page 218 | Chapter 8 : Maps and Location

longitudeDeltalatitudeDelta犹是span的平有,span是面积来差不多充分,以centerCoordinate为基本可兆示的肥瘦与惊人。

Directions (方向)

Map Kit还能当App中提供建议统筹路线导航功能。MKDirections
API可以根据苹果服务器的乘除提供线路方向。有步行线路设计,驾驶线路设计,花费的时光,和其余可选取的路子。地图上的每个点用MKMapItem表示,MKMapItem包含了地图及关于地方的装有消息,这些消息包括地图位置,坐标值,地点名称等数据。MKMapItem还会传入地图应用达到,使用地图应用上再度多高档功能。

始建MKMapItem最简易的方法是运mapItemForCurrentLocation办法,这个方式获得用户的职然后因职务创建MKMapItem:

var mapItem: MKMapItem = MKMapItem.mapItemForCurrentLocation()

MKMapItem类有一些福利之性。name属性是一个字符串,提供地方的描述性名称。phoneNumber属性也是字符串,存储这个职位的电话号码。URL属性存储位置的网址。

MKMapItem创建后,就可以轻松的拿岗位传递及地图应用达到,使用导航功能。openMapWithItems: launchOptions主意可接一个频繁组,数组中包括总括同样届多个的MKMapItem。通过launchOptions,这么来items就会叫射到地图应用达到。MKLaunchOptionsDirectionsModeKey受地图应用基于两个点来提供规划路。

Plotting Points (绘制点、标注点)

苹果商店提供了一个在地形图上绘制点的计,叫annotations(注解)。annotations是足以定义一个地方要一个点。它经常用于突出感兴趣的地址,提供更多细节。annotations也保有一个只是选标注气泡(optional
callout
bubble)。气泡代表有位置的讳和地方那样的消息。气泡也是只是点击的,可以像button(按钮)那样接收用户的动作。

annotations由片片段构成,注解对象(annotation
object)和注释视图(annotation view)。annotation
object是一个轻量级对象,管理annotation中的数量。annotation
object是打MKPointAnnotation类中开创的。annotation
view是从MKPinAnnotationView类中开创的。annotation
view用来当地形图及号pin(大头针)。

Map Kit | Page 219

老三独步将annotation添加到MKMapView中。第一步是啊谢兴趣之地点创建一个MKPointAnnotation:

var point = MKPointAnnotation()
point.coordinate = CLLocationCoordinate2DMake(37.7756, -122.4193)
point.title = "San Francisco"

接下来,遵循MKMapView协议,回应mapView(_: viewForAnnotation:)术,此方可回收利用annotation
view,就比如是table view中也出主意好还利用cell:

func mapView(mapView: MKMapView!, viewForAnnotation annotation: MKAnnotation!)-> MKAnnotationView! {
    var pin = MKPinAnnotationView(annotation: annotation, reuseIdentifier:"pinIdentifier")
    return pin
}

最后,调用addAnnotation艺术,这样,就管annotation添加到地图中了:

mapView.addAnnotation(point)

今天,我们来打定你首先只利用了地图App吧。

Exercise: Adding Maps to the Passport App

练请见之链接

Page 220| Chapter 8 : Maps and Location

相关文章