1. 导入框架 <CoreLocation.framework>, 引入头文件 import <CoreLocation/CoreLocation.h>;
2. 创建管理者对象 (strong)
#import "ViewController.h"
@interface ViewController ()<CLLocationManagerDelegate>
/** 定位管理者 ***/
@property (nonatomic, strong) CLLocationManager *mgr;
@end
@implementation ViewController
/** 懒加载 ***/
- (CLLocationManager *)mgr{
if (!_mgr) {
_mgr = [[CLLocationManager alloc] init];
}
return _mgr;
}
- (void)viewDidLoad {
[super viewDidLoad];
// 1. 创建CoreLocation管理者
// 2. 成为CoreLocaltion管理者的代理, 监听获取的位置
self.mgr.delegate = self;
// 3. 设置属性
// 设置多久 获取一次位置
// self.mgr.distanceFilter = 500;
/**
kCLLocationAccuracyBestForNavigation -- 最佳导航
kCLLocationAccuracyBest; -- 最精准
kCLLocationAccuracyNearestTenMeters; -- 十米
kCLLocationAccuracyHundredMeters; -- 百米
kCLLocationAccuracyKilometer; -- 千米
kCLLocationAccuracyThreeKilometers; -- 三千米
*/
// 设置定位精确度
self.mgr.desiredAccuracy = kCLLocationAccuracyBestForNavigation;
/**
* ios7 , 只要开始定位, 系统就会自动要求用户对你的应用程序授权. 但是从ios8开始, 想要定位自己必须主动要求用户授权,而且必须再info.plist文件中配置一项属性, 才能弹出授权窗口.
NSLocationWhenInUseDescription,允许在前台获取GPS的描述
NSLocationAlwaysUsageDescription,允许在后台获取GPS的描述
*/
// 4. 请求授权定位
if(IOS8){
LogRed(@"ios 8");
// 主动要求用户授权, 授权成功以后会调用对应的代理方法.
[self.mgr requestAlwaysAuthorization]; // 请求前台和后台定位权限
// [self.mgr requestWhenInUseAuthorization]; // 请求前台定位权限
}else{
LogMagenta(@"ios 7");
// 3. 开始监听
[self.mgr startUpdatingLocation];
}
}
/**
* 当授权状态改变时, 调用此方法
*
* @param manager 触发事件的对象
* @param status 授权状态
*/
- (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status
{
//
// kCLAuthorizationStatusNotDetermined ---- 等待授权
// kCLAuthorizationStatusRestricted, ---- 受限 -- 未授权
// kCLAuthorizationStatusDenied ---- 拒绝授权
// kCLAuthorizationStatusAuthorizedAlways --- 前台 后台都授权
// kCLAuthorizationStatusAuthorizedWhenInUse - 前台授权
if (status == kCLAuthorizationStatusNotDetermined) {
LogWhite(@"等待用户授权");
}else if (status == kCLAuthorizationStatusAuthorizedAlways ||
status == kCLAuthorizationStatusAuthorizedWhenInUse)
{
LogRed(@"授权成功");
// 开始定位
[self.mgr startUpdatingLocation];
}else
{
LogGreen(@"授权失败");
}
}
#pragma mark - CLLocationManagerDelegate
/**
* 获取到位置信息后就会调用
*
* @param manager 触发事件的对象
* @param locations 获取到的位置
*/
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
{
/**
* // CLLocation
location.coordinate; 坐标, 包含经纬度
location.altitude; 设备海拔高度 单位是米
location.course; 设置前进方向 0表示北 90东 180南 270西
location.horizontalAccuracy; 水平精准度
location.verticalAccuracy; 垂直精准度
location.timestamp; 定位信息返回的时间
location.speed; 设备移动速度 单位是米/秒, 适用于行车速度而不太适用于不行
*/
LogRed(@"%@",locations);
// 1. 获取最后一次定位的位置信息
CLLocation *location = [locations lastObject];
LogYellow(@"%f --- %f ---%f",location.coordinate.latitude,location.coordinate.longitude,location.speed);
// [self.mgr stopUpdatingLocation];
}