iOS CLLocationManager定位

声明

因为苹果在不允许使用第三方库进行定位,即使是百度地图的定位也是在苹果API的基础上进行了封装,所以学习下iOS中定位的功能还是有必要的

CoreLocation框架

  • CLLocationManager是一个非常重要的对象

各系统版本的前台跟后台访问权限

  • iOS8之前
    如果想要定位需要在plist文件中位置key Privacy - Location Usage Description(NSLocationUsageDescription),默认只在前台定位,如果想开启后台定位需要在开启后台模式
717775-cc91e37a8c114e7a.png
  • iOS8+
    iOS 8.0开始,苹果进一步加强了对用户隐私的保护
    当APP想访问用户的隐私信息时,系统不再自动弹出一个对话框让用户授权
    我们需要调用iOS 8.0的API,主动请求用户授权

  • (void)requestAlwaysAuthorization // 请求允许在前后台都能获取用户位置的授权

  • (void)requestWhenInUseAuthorization // 请求允许在前台获取用户位置的授权

注意:务必在info.plist文件中配置对应的键值, 否则以上请求授权的方法不生效
● NSLocationAlwaysUsageDescription : 允许在前后台获取GPS的描述
● NSLocationWhenInUseDescription : 允许在前台获取GPS的描述

注意: 如果是前台定位权限,但是开启了后台模式,在后台也是可以定位的,但是屏幕的上边会有蓝条,提示用户是哪个应用在定位

  • iOS 9
    如果想要在后台定位,除了配置NSLocationAlwaysUsageDescription(前后台定位)外,还需要手动设置allowsBackgroundLocationUpdates = YES, 否则 后台不会定位
#pragma mark - CLLocationManager懒加载
- (CLLocationManager *)lM
{
    if (!_lM) {
        // 1. 创建位置管理者
        _lM = [[CLLocationManager alloc] init];
        // 1.1 代理, 通知, block
        _lM.delegate = self;
        
        _lM.desiredAccuracy = kCLLocationAccuracyBest;
        
        if([[UIDevice currentDevice].systemVersion floatValue] >= 8.0)
        {
            
            [_lM requestAlwaysAuthorization];
        }
        // 允许后台获取用户位置(iOS9.0)
        if([[UIDevice currentDevice].systemVersion floatValue] >= 9.0)
        {
            // 一定要勾选后台模式 location updates 否者程序奔溃
            _lM.allowsBackgroundLocationUpdates = YES;
        }

    }
    return _lM;
}
注意:只要是想后台获取用户的位置,就必须开启后台模式 项目->TARGETS->Capabilities-> Background Modes 勾线 Location updates

CLLocationManager的一些属性

           kCLLocationAccuracyBestForNavigation // 最适合导航
           kCLLocationAccuracyBest; // 最好的
           kCLLocationAccuracyNearestTenMeters; // 10m
           kCLLocationAccuracyHundredMeters; // 100m
           kCLLocationAccuracyKilometer; // 1000m
           kCLLocationAccuracyThreeKilometers; // 3000m
// 设置定位的精确度
@property(assign, nonatomic) CLLocationAccuracy desiredAccuracy;

//  每隔多米定位一次 eg._lM.distanceFilter = 30;
@property(assign, nonatomic) CLLocationDistance distanceFilter;

CLLocationManagerDelegate

#pragma mark - CLLocationManagerDelegate
// 用户的位置更新之后调用
-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations
{
    /*
     经纬度
    @property(readonly, nonatomic) CLLocationCoordinate2D coordinate;
     海拔
    @property(readonly, nonatomic) CLLocationDistance altitude;
     航向
    @property(readonly, nonatomic) CLLocationAccuracy course;
     速度
    @property(readonly, nonatomic) CLLocationSpeed speed
    */
    CLLocation *location = locations.firstObject;
    NSLog(@"%f", location.coordinate.longitude);
}

// 授权状态发生改变时调用
// 第一次弹出请求定位权限会执行该代码块 用户如果点击 "不允许"  执行"定位开启,但被拒", 若点击 "允许" 执行 获取前后台定位授权 或者 获取前后台定位授权 如果在设置 设置隐私 定位服务 "永不" 则执 "行定位开启,但被拒"
// 注意:在设置点击了"永不"之后不返回应用在切换后台跟前台选项是不会执行该代理方法的 当返回应用之后 才会对做出的改变执行代理方法
// 关闭定位服务会执行 定位关闭,"不可用" 系统默认弹出弹框 提示用户去设置中打开定位服务选项
- (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status
{
    switch (status) {
            // 用户还未决定
        case kCLAuthorizationStatusNotDetermined:
        {
            NSLog(@"用户还未决定");
            
            break;
        }
            // 访问受限
        case kCLAuthorizationStatusRestricted:
        {
            NSLog(@"访问受限");
            break;
        }
            // 定位关闭时和对此APP授权为never时调用
        case kCLAuthorizationStatusDenied:
        {
            // 定位是否可用(是否支持定位或者定位是否开启)
            if([CLLocationManager locationServicesEnabled])
            {
                NSLog(@"定位开启,但被拒");
            }else
            {
                NSLog(@"定位关闭,不可用, 请在设置中打开定位服务选项");
            }
            //            NSLog(@"被拒");
            break;
        }
            // 获取前后台定位授权
        case kCLAuthorizationStatusAuthorizedAlways:
            //        case kCLAuthorizationStatusAuthorized: // 失效,不建议使用
        {
            NSLog(@"获取前后台定位授权");
            break;
        }
            // 获得前台定位授权
        case kCLAuthorizationStatusAuthorizedWhenInUse:
        {
            NSLog(@"获得前台定位授权");
            break;
        }
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,492评论 6 513
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,048评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,927评论 0 358
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,293评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,309评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,024评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,638评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,546评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,073评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,188评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,321评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,998评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,678评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,186评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,303评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,663评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,330评论 2 358

推荐阅读更多精彩内容