iOS开发之CoreLocation框架使用
iOS开发之CoreLocation框架使用
CoreLocation框架是iOS开发中比较基础的一个位置信息相关框架,关于定位和地图,之前也有博客多详细的介绍。但是对于CoreLocation框架,并没有完整和细致的记录。本篇博客将剖析这个框架的结构并进行应用示例。下图为CoreLocation框架的相关类布局图:

从图中可以看到,在CoreLocation框架中除了一些数据模型,CLLocationManager作用最为重要,它是整个框架的管理中心,从图中也可以看出,CoreLocation框架功能也非常完善,常规定位,方向信息获取,室内定位,GEO编码等功能都支持。
一、CLLocationManager管理类详解
CLLocationManager作为整个CoreLocation框架的核心管理类,其第一部分功能是获取设备的功能可用性,如下:
1 | //获取位置服务是否可用 |
在使用CLLocationManager的服务之前,首先需要获取用户的授权,在iOS8之后,还需要在info.plist中添加相关的键,如下:

上面标出的3个键,只需要设置一个,根据自己的定位要求来选择即可。
下面列出了与用户授权相关的方法:
1 | //获取当前用户授权类型 |
下面列举了CLLocationManager中核心的属性和方法:
1 | //设置代理 |
二、CLLocationManagerDelegate协议
CLLocationManagerDelegate配合CLLocationManager进行使用,其中定义了管理器在提供服务时进行回调的相关函数。解析如下:
1 | //位置更新后调用的回调 会将原位置和更新后的位置信息传入 |
三、进行GEO编码的工具类CLGeocoder
如前所述,使用CLLocationManager获取到的位置信息是CLLocation对象,这个对象封装了经纬度等基础信息,但是在实际开发中,我们往往需要获取到的是位置的更多实际信息,比如国家,省份,城市等等,GEO编码的作用就是通过经纬度信息发起请求,获取现实意义的更多数据。CLGeocoder类解析如下:
1 | //是否正在进行GEO编码 |
四、位置信息模型CLLocation相关类
首先在CoreLocation框架中,位置的经纬度是由CLLocationCoordinate2D结构体描述的,这个结构体定义如下:
1 | struct CLLocationCoordinate2D { |
使用下面的函数可以快速的检查和创建CLLocationCoordinate2D对象:
1 | //检查经纬度对象是否有效 |
CLFloor类是一个用来描述楼层信息的模型,并不一定精准,是基于地面的粗略计算,其中属性如下:
1 | @interface CLFloor : NSObject <NSCopying, NSSecureCoding> |
下面列举了CLLocation中封装的属性的方法:
1 | //初始化方法 |
五、航向信息模型CLHeading
当使用CLLocationManager进行航向信息的请求时,代理回调中会获取到CLHeading对象,这个对象封装了航向相关数据,解析如下:
1 | //地磁方向0-360 |
六、地标数据模型CLPlacemark
CLPlacemark是进行GEO编码后返回的地标对象,解析如下:
1 | //初始化方法 使用另一个placemark拷贝 |
在CLPlacemark对象中有封装region对象,这个对象封装区域信息,如下:
1 | //通过中心点和半径创建区域 |
CLRegion类还有两个子类,CLCircularRegion类用来创建圆形区域,提供了一个便捷的初始化方法,其作用和CLRegion基本一致。CLBeaconRegion专门用来支持Beacon技术,Beacon技术是室内定位技术的一种,例如商场中有很多店铺,如果有店铺部署了Beacon发射设备,则当iOS设备作为接收设备靠近时会受到通知。CLBeaconRegion除了包含基础的区域信息外,还封装了与Beacon设备相关的设备码等信息。
七、区域访问功能
在iOS8之前,如果我们想获取用户是否在某个区域停留了一段时间是比较困难的,可能要多次定位并进行整理和分析。在iOS8后,CoreLocation框架中提供了方便的方法来处理这个问题。
首先,用户的区域停留可以理解为用户对某个区域进行了访问,开启和关闭访问监听十分方便,如下:
1 | @interface CLLocationManager (CLVisitExtensions) |
开启后,当有相关的访问信息时,会回调代理中的相应函数,并且收到CLVisit对象,这个对象信息如下:
1 | //访问开始时间 |
热爱技术,热爱生活,写代码,交朋友 珲少 QQ:316045346