设为首页 加入收藏

TOP

CoreLocation 定位(四)
2017-10-10 12:15:33 】 浏览:8592
Tags:CoreLocation定位
wift:

// 当定位到位置后调用
func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {

    // 获取用户当前最新位置
    let locationC = locations.last

    // 判断水平数据是否有效
    if locationC?.horizontalAccuracy < 0 { // 负数表示无效
        return
    }

    // 计算行走方向(北偏东,东偏南,南偏西,西偏北)
    let courseAry = ["北偏东", "东偏南", "南偏西", "西偏北"]
    // 将当前航向值/90度会得到相应的值(0,1,2,3)
    let i = Int((locationC?.course)! / 90)
    // 取出对应航向
    var courseStr = courseAry[i]

    // 计算偏移角度
    let angle = Int((locationC?.course)! % 90)
    // 判断是否为正方向
    // 对角度取余,为0就表示正
    if Int(angle) == 0 {
        // 截取字符串第一个字
        courseStr = (courseStr as NSString).substringToIndex(1)
    }

    // 确定移动距离
    let lastLoc = lastLocation ?? locationC
    let distance = locationC?.distanceFromLocation(lastLoc!)
    lastLocation = locationC

    // 拼接字符串
    print("向\(courseStr)方向走了\(distance!)米偏移角度\(angle)")
}

区域监听

  • 区域监听就是根据需求指定一块区域,当用户持设备进入或离开指定区域,我们都可以监听到
  • iOS8开始,想要做区域监听,必须请求位置授权(因为区域监听原理就是获取用户位置,然后判断位置是否在设定的区域内,涉及到用户隐私)

OC:

    - (CLLocationManager *)manager
{
    if (!_manager) {
        _manager = [[CLLocationManager alloc] init];
        _manager.delegate = self;
        
        // 请求用户授权区域监听
        if ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0) {
            [_manager requestAlwaysAuthorization];
        }
    }
    
    return _manager;
}

- (void)viewDidLoad {
    [super viewDidLoad];
    
    // 判断区域监听是否可用
    if ([CLLocationManager isMonitoringAvailableForClass:[CLCircularRegion class]]) {
        return;
    }
    
    // 创建一个区域
    // 确定圆心
    CLLocationCoordinate2D center = CLLocationCoordinate2DMake(21.23, 123.345);
    // 确定半径
    CLLocationDistance distance = 1000.0;
    // 因为监听区域有最大值,所以要判断下是否超过监听的最大值
    if (distance > self.manager.maximumRegionMonitoringDistance) {
        distance = self.manager.maximumRegionMonitoringDistance;
    }
    CLCircularRegion *region = [[CLCircularRegion alloc] initWithCenter:center radius:distance identifier:@"123"];
    
    // 开始监听区域
    [self.manager startMonitoringForRegion:region];
}


// 进入区域时
- (void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region
{
    NSLog(@"进入区域%@",region.identifier);
}

// 离开区域时
- (void)locationManager:(CLLocationManager *)manager didExitRegion:(CLRegion *)region
{
    NSLog(@"离开区域%@",region.identifier);
}

// 但外界调用请求某个指定区域的状态时
- (void)locationManager:(CLLocationManager *)manager didDetermineState:(CLRegionState)state forRegion:(CLRegion *)region
{
    if (state == CLRegionStateUnknown)
    {
        NSLog(@"未识别");
    }
    if (state == CLRegionStateInside) {
        NSLog(@"在区域内");
    }
    if (state == CLRegionStateOutside) {
        NSLog(@"在区域外");
    }
}
    

swift:

lazy var locationMgr : CLLocationManager = {
        
        let locationMgr = CLLocationManager()
        
        locationMgr.delegate = self
        
        // 记得设置相应的授权请求Key
        // 当前版本是8.0及以上
        if #available(iOS 8.0, *) {
            // 请求前后台定位授权
            locationMgr.requestAlwaysAuthorization()
        }
        
        return locationMgr
    
    }()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // 创建一个区域
        // 确定圆心
        let center = CLLocationCoordinate2DMake(21.23, 123.345)
        // 确定半径
        var distance : CLLocationDistance = 1000
        // 因为监听区域有最大值,索引先判断是否超过了监听区域的最大值
        if distance > locationMgr.maximumRegionMonitoringDistance {
            distance = locationMgr.maximumRegionMonitoringDistance
        }
        let region = CLCircularRegion(center: center, radius: distance, identifier: "123")
        
        // 判断取余监听是否可用
        if C
首页 上一页 1 2 3 4 5 下一页 尾页 4/5/5
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Swift基础(二) 下一篇swift - 导航栏设置

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目