atus) {
case kCLAuthorizationStatusNotDetermined:
NSLog(@"用户未选择");
break;
// 暂时没用,应该是苹果预留接口
case kCLAuthorizationStatusRestricted:
NSLog(@"受限制");
break;
// 真正被拒绝、定位服务关闭等影响定位服务的行为都会进入被拒绝状态
case kCLAuthorizationStatusDenied:
if ([CLLocationManager locationServicesEnabled]) { // 定位服务开启
NSLog(@"真正被用户拒绝");
// 跳转到设置界面
NSURL *url = [NSURL URLWithString:UIApplicationOpenSettingsURLString];
if ([[UIApplication sharedApplication] canOpenURL:url]) { // url地址可以打开
[[UIApplication sharedApplication] openURL:url];
}
} else {
NSLog(@"服务未开启");
}
break;
case kCLAuthorizationStatusAuthorizedAlways:
NSLog(@"前后台定位授权");
break;
case kCLAuthorizationStatusAuthorizedWhenInUse:
NSLog(@"前台定位授权");
break;
default:
break;
}
}
swift:
func locationManager(manager: CLLocationManager, didChangeAuthorizationStatus status: CLAuthorizationStatus) {
switch status {
case .NotDetermined:
print("用户未选择")
case .Restricted:
print("受限制")
case.Denied:
print("被拒绝")
if CLLocationManager .locationServicesEnabled() { // 定位服务开启
print("用户真正拒绝")
// 跳转到设置界面
if #available(iOS 8.0, *) {
let url = NSURL(string: UIApplicationOpenSettingsURLString)
if UIApplication.sharedApplication().canOpenURL(url!) {
UIApplication.sharedApplication().openURL(url!)
}
}
} else {
print("服务未开启")
}
case .AuthorizedAlways:
print("前后台定位授权")
case .AuthorizedWhenInUse:
print("前台定位授权")
}
}
获取位置信息
// 获取当前位置信息
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations
{
// locations内的元素是按时间顺序排列,所以要获取最新的位置信息直接取locations数组内的最后一个元素即可(苹果官方文档注释)
NSLog(@"%@", [locations lastObject]);
}
结果:维度、经度、海拔(负值表示当前海拔无效)速度(负)航向(从0~359.9) 位置时间
- 根据获取的位置信息计算用户行走方向,行走距离,偏移角度
- coordinate:经纬度信息
- altitude:海拔
- horizontalAccuracy:水平方向精度,值为负数时,表示无效
- verticalAccuracy:判断海拔是否为负数,负数无效
- course:航向(0~359.9)
- floor:楼层(使用的楼层需要注册,否则无法使用)
- distanceFromLocation:计算2点之间的物理直线距离
OC:
// 获取当前位置信息
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations
{
/*
* coordinate:经纬度信息
* altitude:海拔
* horizontalAccuracy:水平方向精确度,值如果小于0,代表位置数据无效
* verticalAccuracy:判断海拔是否为负数,负数无效
* floor:楼层,使用的楼层需要注册,否则无法使用
* course:航向(0~359.9)(这里的0表示的是正北不是磁北)
* distanceFromLocation:计算2各店之间物理直线距离
*/
// 获取当前位置信息
CLLocation *locationC = locations.lastObject;
// 判断水平数据是否有效
if (locationC.horizontalAccuracy < 0) { // 负数表示无效
return;
}
// 计算行走方向(北偏东,东偏南,南偏西,西偏北)
NSArray *courseAry = @[@"北偏东", @"东偏南", @"南偏西", @"西偏北"];
// 将当前航向值/90度会得到对应的值(0,1,2,3)
NSInteger i = locationC.course / 90;
// 取出对应航向
NSString *courseStr = courseAry[i];
// 计算偏移角度
NSInteger angle = (int)locationC.course % 90;
// 判断是否为正方向
// 对角度取余,为0表示正
if (angle == 0) {
// 截取字符串第一个字
courseStr = [courseStr substringToIndex:1];
// 拼接字符串
courseStr = [@"正" stringByAppendingString:courseStr];
}
// 计算移动多少米
CGFloat distance = [locationC distanceFromLocation:self.lastLocation];
// 记录上次距离
self.lastLocation = locationC;
NSLog(@"向 %@ 方向走了 %lf 米偏移角度 %ld 度", courseStr, distance, angle);
}
s