设为首页 加入收藏

TOP

CoreLocation 定位(三)
2017-10-10 12:15:33 】 浏览:8587
Tags:CoreLocation定位
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

首页 上一页 1 2 3 4 5 下一页 尾页 3/5/5
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Swift基础(二) 下一篇swift - 导航栏设置

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目