在前一篇文章 iOS关于地图定位基础(一) 中我们主要总结了 iOS 里面利用原生 CoreLocation 框架实现基本定位功能和一些注意点,侧重点主要是iOS8+之后的定位授权与授权状态的使用。接下来本篇文章主要是讲解如何利用 CoreLocation 框架实现地理定位、区域监听、地理编码的具体实现。(PS:下文涉及我自定义的指南针Demo请去我的GitHub仓库查看源码https://github.com/IMLoser/HWCompass,谢谢大家支持。)
(一、定位实现&监听方向)那么我们先来看看这个代理方法:
// 通过位置管理者一旦定位到位置,就会一直调用这个代理方法
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations;
在这个方法中共有两个参数,一个是位置管理者,另一个就是保存有位置对象(CLLocation)的数组,这个数组中位置对象的存放顺序是按照时间排序的,那么最新的定位信息永远是数组最后一个元素。那么 CLLocation 对象又是什么呢?我们看看以下代码:
#pragma mark - CLLocationManagerDelegate
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations {
CLLocation * location = [locations lastObject];
/*
CLLocation 位置对象的重要属性:
coordinate 定位到的经纬度坐标
altitude 海拔
horizontalAccuracy 水平精确度
verticalAccuracy 垂直精确度
course 航向(取值0 ~ 359.9)
speed 速度
*/
}
光看干巴巴的属性来学习始终不够形象,下面我们来看个小案例 : 显示用户每次行走的方向和角度以及针对于上一次定位行走的距离,如 : 北偏东 30度 移动了12米。代码如下 :
{
// 记录上一次位置
CLLocation *_oldLocation;
}
#pragma mark - CLLocationManagerDelegate
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations {
CLLocation * location = [locations lastObject];
NSString * locationInfo = nil;
NSInteger direction = (NSInteger)location.course / 90;
// 获取方向
switch (direction) {
case 0:
locationInfo = @"北偏东";
break;
case 1:
locationInfo = @"东偏南";
break;
case 2:
locationInfo = @"南偏西";
break;
case 3:
locationInfo = @"西偏北";
break;
default:
break;
}
// 获取角度
NSInteger angle = (NSInteger)location.course % 90;
if (!angle) {
locationInfo = [NSString stringWithFormat:@"正%@", [locationInfo substringToIndex:1]];
} else {
locationInfo = [locationInfo stringByAppendingString:[NSString stringWithFormat:@"%zd度", angle]];
}
// 获取移动的距离
NSInteger distance = 0;
if (_oldLocation) {
distance = [location distanceFromLocation:_oldLocation];
}
_oldLocation = location;
// 拼接打印
locationInfo = [locationInfo stringByAppendingString:[NSString stringWithFormat:@"移动了%zd米", distance