#import "ViewController.h"
#import <CoreLocation/CoreLocation.h>
@interface ViewController () <CLLocationManagerDelegate>
@property (nonatomic, strong) CLLocationManager *manager;
// 记录上一个位置
@property (nonatomic, strong) CLLocation *previousLocation;
// 总距离
@property (nonatomic, assign) CLLocationDistance sumDistance;
// 总时间
@property (nonatomic, assign) NSTimeInterval sumTime;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// 0. 判断系统的定位服务是否打开
BOOL locationServices = [CLLocationManager locationServicesEnabled];
if (locationServices == NO) {
NSLog(@"系统定位服务没有打开");
return;
// 按照需求来解决, 文字提示打开, 截图提示打开
}
// 1. 判断授权是否成功
// 获取当前的授权状态, 判断是否还没有决定
if ([CLLocationManager authorizationStatus] == kCLAuthorizationStatusNotDetermined) {
// 一定要注意Info.plist的配置, 注意不要有空格
//在Info.plist中添加NSLocationAlwaysUsageDescription,输入你想要提示的内容
[self.manager requestAlwaysAuthorization];
}
// 2. 执行相关的操作
// iOS9新增, 只获取一次用户位置
// [self.manager requestLocation];
[self.manager startUpdatingLocation];
}
#pragma mark CLLocationManagerDelegate
#pragma mark 授权状态
// 授权状态改变时
- (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status
{
if (status == kCLAuthorizationStatusAuthorizedAlways) {
NSLog(@"授权成功");
}
}
#pragma mark 错误处理
// 出现错误时触发
- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error
{
/**
kCLErrorLocationUnknown = 0, // 当前位置未知, CL会继续努力
kCLErrorDenied, // 授权失败, 用户拒绝
kCLErrorNetwork, // 网络相关的错误
*/
// 错误信息定义在CLError.h文件里
switch (error.code) {
case kCLErrorLocationUnknown:
NSLog(@"位置未知, 如果是模拟器, 就直接重来");
break;
default:
break;
}
}
#pragma mark 更新位置
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations
{
// 当前位置
CLLocation *currentLocation = locations.lastObject;
if (self.previousLocation != nil) {
// 计算当前与上一个的距离与时间,
CLLocationDistance distance = [currentLocation distanceFromLocation:self.previousLocation];
// 计算两个location之间的距离, 单位米
// 使用NSDate计算两个location之间的时间, 单位秒
NSTimeInterval interval = [currentLocation.timestamp timeIntervalSinceDate:self.previousLocation.timestamp];
self.sumDistance += distance;
self.sumTime += interval;
NSLog(@"总时间: %f, 总距离: %f, 平均速度: %f", self.sumTime, self.sumDistance, (self.sumDistance / 1000) / (self.sumTime / 3600));
}
// 更新上一个位置
self.previousLocation = currentLocation;
}
#pragma mark - Getter & Setter
- (CLLocationManager *)manager
{
if (_manager == nil) {
_manager = [[CLLocationManager alloc] init];
_manager.delegate = self;
/**
CLActivityTypeOther = 1, 其它
CLActivityTypeAutomotiveNavigation, // 开车
CLActivityTypeFitness, // 步行
CLActivityTypeOtherNavigation // 坐船开飞机
*/
// 定位的目的
_manager.activityType = CLActivityTypeFitness;
// 距离过滤, 只有移动的距离达到目标值后, 才会触发代理
// kCLDistanceFilterNone 默认
_manager.distanceFilter = 200;
/**
kCLLocationAccuracyBestForNavigation // 最适合导航
LLocationAccuracy kCLLocationAccuracyBest; // 最好
CLLocationAccuracy kCLLocationAccuracyNearestTenMeters; // 接近10米
kCLLocationAccuracyHundredMeters; // 1百米
CLLocationAccuracy kCLLocationAccuracyKilometer; // 1千米
CLLocationAccuracy kCLLocationAccuracyThreeKilometers; // 3千米
*/
// 精确度, 类型double值, 实际上已经提供好相关的ENUM
_manager.desiredAccuracy = kCLLocationAccuracyHundredMeters;
}
return _manager;
}
@end
实用知识:CoreLocation的使用(计算速度)
最新推荐文章于 2019-06-17 19:26:32 发布