使用CoreLocation定位

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主要有如下几个:


  • CLLocationManager:定位管理类
  • CLLocationManagerdelegate:该协议代表定位管理器的delegate协议。实现该协议的对象可负责处理CLLocationManager的定位事件。
  • CLLocation:该对象代表位置。该对象包含了当前设备的经度、纬度、高度、速度、路线等信息,还包含了该定位信息的水平精确度、垂直精确度以及时间戳信息。
  • CLHeading:该对象代表设备的移动方向。
  • CLRegion:该对象代表一个区域。一般程序不会直接使用该类,而是使用它的两个子类,即CLCircularRegion(圆形区域)和CLBeaconRegion(蓝牙信号区)。

除此之外,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对象,并对该对象设置一些必要的属性
  • 为CLLocationManager指定delegate属性,实现CLLocationManagerDelegate协议时可根据需要实现协议中特定的方法。
  • 调用CLLocationManager 的 startUpdatingHeading方法获取方向信息,获取方向结束时,可以调用stopUpdatingHeading方法结束获取方向信息。

当设备的方向改变时,会触发CLLocationManager的delegate对象的locationManager:didUpdateHeading:方法,重写该方法获取设备方向。

iOS允许为检测方向改变设置如下属性:


  • CLLocationDregrees headingFilter:设置只有当设备方向的改变值超过该属性值时才激发delegate的方法
  • CLDeviceOrientation headingOrientation:设置设备当前方向

监听方向时返回的是一个CLHeading对象,该对象包含如下属性。


  • magneticHeading:该属性返回设备与磁北的相对方向
  • trueHeading:该属性返回设备与真北的相对方向。

    (真北始终指向地理北极点;磁北则对应于随时间变化的地球磁场北极,iOS系统使用一个计算后的偏移量(称为偏差)来确定这两者之间的差异。)
  • headingAccuracy:该属性返回方向值的误差范围
  • timestamp:该属性返回方向值的生成时间
  • x:获取该设备在X方向上监听得到的原始磁力值,该磁力值的强度单位是微特斯拉
  • y:获取该设备在Y方向上监听得到的原始磁力值,该磁力值的强度单位是微特斯拉
  • z:获取该设备在Z方向上监听得到的原始磁力值,该磁力值的强度单位是微特斯拉

在启用该功能的iOS设备上,即时用户在Settings应用中关闭了定位更新,磁向更新仍然可以使用。使用heading服务的应用不会提示用户授权问题,因此磁向信息不会泄露用户的隐私,应用程序可以随便使用它

你可能感兴趣的:(使用CoreLocation定位)