iOS开发初学者入门

在这一章节中,你将会学到在您的app中怎么样使用华为中的GPS。你将会学会怎么得到用户的职分,同时在地形图上标注出地方。本章内容包括了
地图套件(Map
Kit)和苹果公司提供的地形图、方向框架。通过学习本章节的内容,你立即就足以消除基于地方一定的施用。

提供用户的地点消息是付出iOS应用最动人心弦的表征,在地图上体现用户的位供给四个步骤。

第2步用Core Location来采访用户的职责。Core
Location是一层层类的聚集,通过设备的GPS和蜂窝获取地点音讯,还是能够正视WIFI获取用户消息。Core
Location
是由苹果公司提供的数不胜数frameworks中的3个。Frameworks是一组类的聚众,为实际的有些任务而规划的一套工具。大家前几天用Core
Location举3个例证,Core
Location是为着处理用户地方音讯而规划的一个framework。Core
Data是为了处理数据而设计的贰个framework。那么些framework是可选的,因而需求先把这几个框架导入到工程此中后,才能动用这几个框架。

第贰步是在地图中标注出用户的地点。苹果集团提供了Map
Kit框架,协理大家绘制和管制地图。在Xcode
6中程导弹入框架万分简单。首先Project
Navigator中式点心击项目名称,点击名为Capabilities的tab选项按钮,向下滚动找到Maps。将地图的开关键处于On的状态,那时MapKit框架已经添加到工程中了。今后即使能够在工程中找到MapKit,不过导入流程还未曾成功。Map基特还亟需导入controller
file中。我们下列一行代码实现导入工作:

import MapKit

那样,MapKit类和商谈就导入到controller文件中了。MapKit中的类和协议都以以MK伊始的。

Page 213

Core Location

正如在此以前所说的,Core Location是一系列查找用户地点的类的联谊。Core
Location中有八个检查和测试用户地方的艺术。第一个章程是Significant-Change
Location。这几个主意能够节约电池电量,它只在用户的地方明显改动时才会更新地点。第四个方式是Location
Services,能够自主明确稳定更新的规则。最终一种方法是Regional
Monitoring方法,使用附近的地理区域界线大概Bluetoothbeacons来恒定。本书首要介绍第二种格局:Location
Services,它是最常用到的章程。

愈来愈多音讯请参考苹果公司的Location and Maps Programming
Guide

获取用户地方须要选用Core Location框架,当您把Maps
capabilities开关切换到On(开)状态时,Xcode并不曾自动导入Core
Location框架,需求我们手动导入,请看以下多少个步骤:

  1. 点击Project Navigator上的灰褐工程图标;
  2. 艾德itor显示工程的详细新闻,滑倒最下方;
  3. 在Link Binary with Libraries下方点击Add;
  4. 选拔Core Location,然后点击Add。

Core Location框架就会添加到Project
Navigator中,大家还亟需在controller中写一行代码才能取得此框架:

import CoreLocation

手提式有线电话机用户的地方11分费用电量,它比其它的义务须要愈多的电池电量和天线频率,所以确定保障您的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属性是枚举类型,枚举,正是用二个重点词代表三个数字。枚举有点像是多选题,你不可能不从选择中挑选出1个值来。desiredAccuracy属性有下边一些值:

kCLLocationAccuracyBest
最精准的一定,也是最消耗能量的抉择
kCLLocationAccuracyNearestTenMeters
精准度在十米范围内
kCLLocationAccuracyHundredMeters
准确度在一百米范围内
kCLLocationAccuracyKilometer
精确度在一公里限制内
kCLLocationAccuracyThreeKilometers
精确度在贰仟米范围内

精准度越高,电量消耗越大。大家要选拔能够满意最低供给的精准度级别。假若是像谷歌地图之类的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仅限前台运维的时选拔地方音信。
第3种是requestAlwaysAuthorization.
授权App在前台照旧后台运维都足以拿走用户的职分音信,第三个授权都会给app提供追踪用户地点的力量。调用授权的法子是:

locationManager.requestWhenInUseAuthorization()

locationManager.requestAlwaysAuthorization()

获取授权后,调用startUpdatingLocation()方法开启定位服务:

locationManager.startUpdatingLocation()

如此,locationManager会依照有关须求伊始追踪并重返用户地方音信。

Page 216 | Chapter 8 : Maps and Location

locationManager (_:, didUpdateLocations:)方法会提供CLLocation数组,根据出现前后顺序排列。数组中至少会有1个指标。数组中的每三个对象都以是二个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
基特框架提供地图和方向,地图能够显获得马路级其余音信,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对象会更简雀巢(Nestle)(Beingmate)些:

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属性也是字符串,存款和储蓄那些岗位的电话号码。U中华VL属性存款和储蓄地点的网址。

MKMapItem创立后,就足以轻松的把岗位传递到地图应用上,使用导航作用。openMapWithItems: launchOptions办法可接受三个数组,数组中包蕴总结一至多个的MKMapItem。通过launchOptions,这几个items就会被映射到地图应用上。MKLaunchOptionsDirectionsModeKey让地图应用基于五个点来提供设计路线。

Plotting Points (绘制点、标注点)

苹果公司提供了3个在地图上绘制点的法门,叫annotations(注脚)。annotations是足以定义一个地点也许三个点。它日常用于特出感兴趣的地点,提供更加多细节。annotations也拥有1个可选标注气泡(optional
callout
bubble)。气泡代表某个地点的名字和地址那样的消息。气泡也是可点击的,能够像button(按钮)那样接收用户的动作。

annotations由两部分构成,注脚对象(annotation
object)和注释视图(annotation view)。annotation
object是2个轻量级对象,管理annotation中的数据。annotation
object是从MKPointAnnotation类中开创的。annotation
view是从MKPinAnnotationView类中开创的。annotation
view用来在地形图上标明pin(大头针)。

Map Kit | Page 219

多个步将annotation添加到MKMapView中。第2步是为感兴趣的地址创立叁个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

相关文章