CoreLocation框架(CoreLocation.framework)可用于定位设备当前经纬度,通过该框架,应用程序可通过附近的蜂窝基站、WiFi信号或者GPS等信息计算用户位置。
iOS SDK提供了CLLocationManager、CLLocationManagerDelegate来处理设备的定位信息,包括获取设备的方向以及进行方向检测等。
其中CLLocationManagerDelegate是一个协议,实现该协议的对象可作为CLLocationManager的delegate对象,负责处理CLLocationManager的定位、方向检测、区域检测等相关信息。除此之外,iOS还提供了CLLocation(代表位置信息)、CLHeading(代表设备方向)、CLRegion(代表区域)等API,这些API与CLLocationManager、CLLocationManagerDelegate共同组成了iOS的CoreLocation框架。
1、GPS卫星定位,GPS定位需要能收到卫星信号才行,卫星信号科恩能够会被建筑物(比如高楼)遮挡,因此一般需要在室外进行接收、定位。虽然iPhone4采用了高灵敏度的GPS芯片,但仍然需要在窗户旁或者户外才能进行接收、定位,因为只有这些地方才能确保卫星信号的强度和稳定性。
与基站定位、WiFi定位相比,GPS定位耗电量最大,速度最慢,但是精确度最高。
需要说明的是,iOS的GPS定位与单纯的GPS定位不同,它是一种所谓辅助GPS(简称A-GPS)。A-GPS首先通过基站定位或WiFi定位获得该设备的大概位置,然后通过将设备的大概位置发到远程服务器,由服务器负责进行查询计算,从而获得当前位置的卫星信息,并通过网络将这些卫星信息反馈给iOS设备,这样就避免了iOS设备直接通过GPS扫描、分析天上的卫星信息,如哪些卫星可见、具体在什么位置、时钟是多少等。因此,通常来说A-GPS比单纯的GPS更快。当然这只是一般而论,对于专业级的GPS定位设备,其GPS芯片的灵敏度更好,因此这种GPS定位设备肯定更快。
A-GPS的优点是定位快,缺点是需要网络,但也只是在初次定位时需要网络,一旦卫星信息返回,在一段时间和范围内,这些卫星信息无需改变,接下来的GPS定位就无须联网,直接使用已有的卫星参数即可。
在iOS设备上,iOS系统会综合使用上述定位方式。一般来说,iOS系统可能先按照最快的“无网基站定位”返回一个位置,当有网络连接时,再使用“有网基站定位”来更新位置,然后利用A-GPS查询卫星星图,最后在能收到GPS信号的情况下,转为使用GPS定位。
根据当前卫星信号情况和网络环境,iOS系统可能在上述方式之间反复迭代,不一定按照特定步骤或方式,而且随着iOS系统升级,定位顺序和规则可能改变。
2、基站定位
每个手机基站都有一个标识符,iOS设备可以搜集周围所有收到信号的基站与它们的标识符,通过互联网发送到苹果云端服务器,再由服务器根据这些基站的位置信息查询并计算出当前位置,然后把该定位信息返回给手机。因为基站信号的辐射范围大,所以相对来说误差是比较大的,通常在500米到几公里范围内。
基站定位方式,具有速度快,耗电量比较少,但误差较大。
在没有网络的情况下,iOS4对其进行了优化,可以在没有网络连接时采用无网定位,因为Apple已预先将一些重要基站(几十公里选一个)提前存储在iOS系统中,因此即使不联网,iOS系统也可通过这些本地基站信息定位到设备的位置。这种定位方式的误差更大,通常在10公里到50公里范围内。
无网基站定位的前提是:iOS设备能接收到内置在手机中的那些“重要基站”的信号,不一定是你的手机所属运营商,只要能收到信号就可以了,所以室内、室外一样都可以进行基站定位。
3、WiFi定位
WiFi定位和基站定位的原理大致相似,iOS设备通过无线网卡搜集周围所有的WiFi热点,获得它们的MAC地址,然后通过Apple的云端服务器查询该WiFi热点是否已经登记,如果已经登记,即可获取该WiFi热点的位置,最后通过对多个WiFi热点折中计算得到当前位置并返回给iOS设备。
只要能收到手机信号的地方都可通过WiFi定位,室内、室外的效果相同。
WiFi定位速度、耗电量和精度都介于基站和GPS之间,精度大概在几十米范围内。
传统的WiFi定位是需要网络的,但是iOS系统对其进行了优化,可以实现无网WiFi定位。无网WiFi定位的原理是,iOS设备在联网状态下,会大致定位出设备的位置,并自动将设备所在地周围所有的WiFi热点信息保存到手机系统中。在接下来的时间内,即时当前iOS设备没有联网,iOS系统也可以利用之前保存的本地的WiFi热点信息定位出设备的位置。
根据无网定位的原理不难看出,无网WiFi定位的前提是:该iOS设备之前在该区域附近曾经接入过网络,如果初次到一个陌生的地方,无网WiFi是无法定位的。
获取定位信息,
CoreLocation框架的常用API主要有如下几个:
除此之外,CoreLocation框架还涉及一个CLLocationCoordinate2D结构体变量,该结构体变量包含经度、纬度两个值。其中CLLocation对象的coordinate属性就是一个CLLocationCoordinate2D结构体变量。
1、获取位置信息
2、使用iOS模拟器模拟位置
3、监控行车速度和行车距离
4、方向检测
iPhone设备携带的定位管理器可以返回一个已经计算好的course值,通过这个值我们可以获得当前前进的方向,course值是0~360之间的浮点数,0 表示正北方向,90表示正东方向,180表示正南方向,270表示正西方向。
iOS系统通过heading属性获取设备的真实方向,并不是所有的iOS设备都支持heading属性,在获取方向前需要先检测该设备是否支持heading。
如果定位管理器支持heading属性,那么CLLocationManager的headingAvailable属性将返回YES.
获取方向的基本步骤如下:
当设备的方向改变时,会触发CLLocationManager的delegate对象的locationManager:didUpdateHeading:方法,重写该方法获取设备方向。
iOS允许为检测方向改变设置如下属性:
监听方向时返回的是一个CLHeading对象,该对象包含如下属性。
在启用该功能的iOS设备上,即时用户在Settings应用中关闭了定位更新,磁向更新仍然可以使用。使用heading服务的应用不会提示用户授权问题,因此磁向信息不会泄露用户的隐私,应用程序可以随便使用它