iOS开发初学者入门

在这一章节中,你将会学到在您的app中怎么样利用索尼爱立信中的GPS。你将会学会怎样获得用户的义务,同时在地形图上标注出地点。本章内容蕴涵了
地图套件(Map
基特)和苹果集团提供的地形图、方向框架。通过学习本章节的情节,你立刻就足以搞定基于地点一定的选取。

提供用户的任务音讯是支付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的情形,这时Map基特(Kit)框架已经添加到工程中了。现在虽说可以在工程中找到Map基特(Kit),可是导入流程还尚无到位。Map基特还须求导入controller
file中。我们下列一行代码完结导入工作:

import MapKit

如此,MapKit类和协和就导入到controller文件中了。Map基特中的类和协商都是以MK伊始的。

Page 213

Core Location

正如以前所说的,Core Location是一文山会海查找用户地方的类的集结。Core
Location中有多少个检测用户地点的措施。第三个方法是Significant-Change
Location。这么些艺术可以节约电池电量,它只在用户的职责分明改观时才会更新地点。第四个点子是Location
瑟维斯(Service)s,可以自主确定稳定更新的平整。最终一种艺术是Regional
Monitoring方法,使用附近的地理区域边界或者蓝牙beacons来恒定。本书主要介绍第三种方法:Location
Service(Service)s,它是最常用到的点子。

更加多音信请参考苹果企业的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 瑟维斯(Service)s(定位服务)。
  • 用户禁止你的App使用Location Service(Service)s(定位服务)。
  • 设施处于飞行情势或者三番五次不了网络。

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只需提供用户所在城市,像是推特中的定位,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

相关文章