coreLocation位置定位

2017-03-21  本文已影响28人  陈水寒

1、 iOS 7、iOS 8、iOS 9定位都不一样,如果要兼容老版本需要做不同的适配

初始化代码如下:

        CLLocationManager lM = [[CLLocationManager alloc] init];
        // 设置定位精确度
        lM.desiredAccuracy = kCLLocationAccuracyBest;
        lM.delegate = self;
        
        // ios8 适配
        if ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0) {
            [lM requestAlwaysAuthorization];
        }
        
        if ([[UIDevice currentDevice].systemVersion floatValue] >= 9.0) {
            // 需要开启后台权限
            lM.allowsBackgroundLocationUpdates = YES;
        }      

适配ios8 还需要在info.plist文件中添加以下键值:NSLocationAlwaysUsageDescription
适配ios9 还需要开启后台权限,配置如下图

开启后台权限示意图.png

2、指南针

初始化代码如下:

        CLLocationManager lM = [[CLLocationManager alloc] init];
        lM.delegate = self;
        [lM startUpdatingHeading];
// 代理方法
- (void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading
{
     /**
     *  CLHeading
     *  magneticHeading : 磁北角度
     *  trueHeading : 真北角度
     */
    CGFloat angle = newHeading.magneticHeading;
    // 角度转弧度
    CGFloat radian = angle / 180 * M_PI;
    
    [UIView animateWithDuration:0.25 animations:^{
        self.compassImageView.transform = CGAffineTransformMakeRotation(radian);
    }];
}

3、区域监控

给出一个中心点和半径为监控区域,当进入或者离开该区域时,通过代理通知控制器
初始化代码及代理如下

    // 定位管理者
    CLLocationManager lM = [[CLLocationManager alloc] init];
    lM.delegate = self;

    // 给出一个中心位置
    CLLocationCoordinate2D center = {40.905206,116.390356};
    // 设置监控区域的中心位置、监控区域以及标识
    CLCircularRegion *region = [[CLCircularRegion alloc] initWithCenter:center radius:1000 identifier:@"区域监听"];
    // 开启区域监听
    [lM startMonitoringForRegion:region];

    // 第一次进入区域监听的时候不会调用代理方法
    // locationManager:(CLLocationManager *)manager didEnterRegion和
    // locationManager:(CLLocationManager *)manager didExitRegion,
    // 所以需要第一次进入的时候需要判断下当前的区域状态
    [self.lM requestStateForRegion:region];
// 代理方法
- (void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region
{
    NSLog(@"进入了监控区域");
}

- (void)locationManager:(CLLocationManager *)manager didExitRegion:(nonnull CLRegion *)region
{
    NSLog(@"离开了监控区域");
}

- (void)locationManager:(CLLocationManager *)manager didDetermineState:(CLRegionState)state forRegion:(CLRegion *)region
{
    // 当前所在区域状态
    NSLog(@"%zd",state);
}
上一篇下一篇

猜你喜欢

热点阅读