(void)viewDidLoad {
[super viewDidLoad];
// 1.创建CoreLocation管理者
// CLLocationManager *mgr = [[CLLocationManager alloc] init];//此处注掉是因为后面写了全局变量懒加载
// 2.成为CoreLocation管理者的代理监听获取到的位置
self.mgr.delegate = self;// 设置多久获取一次
// self.mgr.distanceFilter = 500;
// 设置获取位置的精确度
/*
kCLLocationAccuracyBestForNavigation 最佳导航
kCLLocationAccuracyBest; 最精准
kCLLocationAccuracyNearestTenMeters; 10米
kCLLocationAccuracyHundredMeters; 百米
kCLLocationAccuracyKilometer; 千米
kCLLocationAccuracyThreeKilometers; 3千米
*/
// self.mgr.desiredAccuracy = kCLLocationAccuracyNearestTenMeters;
/*
注意: iOS7只要开始定位, 系统就会自动要求用户对你的应用程序授权. 但是从iOS8开始, 想要定位必须先”自己”“主动”要求用户授权
在iOS8中不仅仅要主动请求授权, 而且必须再info.plist文件中配置一项属性才能弹出授权窗口
NSLocationWhenInUseDescription,允许在前台获取GPS的描述
NSLocationAlwaysUsageDescription,允许在后台获取GPS的描述
*/
// 判断是否是iOS8
if([[UIDevice currentDevice].systemVersion doubleValue] >= 8.0) {
NSLog(@”是iOS8”);
// 主动要求用户对我们的程序授权, 授权状态改变就会通知代理
[self.mgr requestAlwaysAuthorization]; // 请求前台和后台定位权限
}else {
NSLog(@”是iOS7”);
// 3.开始监听(开始获取位置)
[self.mgr startUpdatingLocation];
}
}
/**- 授权状态发生改变时调用
- @param manager 触发事件的对象
- @param status 当前授权的状态
*/
- (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status{
if (status == kCLAuthorizationStatusNotDetermined) {
NSLog(@”等待用户授权”);
}else if (status == kCLAuthorizationStatusAuthorizedAlways ||
status == kCLAuthorizationStatusAuthorizedWhenInUse) {
NSLog(@”授权成功”);
// 开始定位
[self.mgr startUpdatingLocation];
}else{
NSLog(@”授权失败”);
}
}
// CLLocationManagerDelegate
/**
- 获取到位置信息之后就会调用(调用频率非常高)
* - @param manager 触发事件的对象
- @param locations 获取到的位置
*/
- 获取到位置信息之后就会调用(调用频率非常高)
- (void)locationManager:(CLLocationManager )manager didUpdateLocations:(NSArray )locations{
NSLog(@”%s”, func);
// 如果只需要获取一次, 可以获取到位置之后就停止
// [self.mgr stopUpdatingLocation];
// 1.获取最后一次的位置
/*
location.coordinate; 坐标, 包含经纬度
location.altitude; 设备海拔高度 单位是米
location.course; 设置前进方向 0表示北 90东 180南 270西
location.horizontalAccuracy; 水平精准度
location.verticalAccuracy; 垂直精准度
location.timestamp; 定位信息返回的时间
location.speed; 设备移动速度 单位是米/秒, 适用于行车速度而不太适用于不行
*/
/*
可以设置模拟器模拟速度
bicycle ride 骑车移动
run 跑动
freeway drive 高速公路驾车
*/
CLLocation *location = [locations lastObject];
NSLog(@”%f, %f speed = %f”, location.coordinate.latitude , location.coordinate.longitude, location.speed);
}
// 懒加载
- (CLLocationManager *)mgr{
if (!_mgr) {
_mgr = [[CLLocationManager alloc] init];
}
return _mgr;
}