• OC开发_整理笔记—— CoreLocation(1)基本使用


    一、Core Location介绍

    1、我们经常会用到了地图和定位功能,在iOS开发中,要想加入这2大功能,必须基于2个框架进行开发

         Map Kit :用于地图展示

        Core Location :用于地理定位

    2、所以我们会经常听到2个热门专业术语

        LBS :Location Based Service

        SoLoMo :Social Local Mobile(索罗门)

    3、CoreLocation框架使用须知

      使用Core Location首先导入主头文件 #import <CoreLocation/CoreLocation.h>

      CoreLocation框架中所有数据类型的前缀都是CL

      CoreLocation中使用CLLocationManager对象来做用户定位

    4、而我们调用其实就是三个步骤

      (1 创建CoreLocation的管理者:mgr

        (2 成为Corelocation管理者的代理,监听位置的获取

      (3 开始监听

    二、话不多说,先贴代码

      这是一个简单的获取当前地理位置经纬度的代码:

      1 //
      2 //  ViewController.m
      3 //  地图初识
      4 //
      5 //  Created by zzl on 15/8/27.
      6 //  Copyright (c) 2015年 zzl. All rights reserved.
      7 //
      8 
      9 #import "ViewController.h"
     10 #import <CoreLocation/CoreLocation.h>
     11 
     12 @interface ViewController ()<CLLocationManagerDelegate>
     13 
     14 /**  管理者设置为全局*/
     15 @property(nonatomic,strong) CLLocationManager *mgr;
     16 
     17 @end
     18 
     19 @implementation ViewController
     20 
     21 #pragma mark -- 懒加载
     22 
     23 -(CLLocationManager *)mgr
     24 {
     25     if (!_mgr) {
     26         _mgr = [[CLLocationManager alloc]init];
     27     }
     28     return _mgr;
     29 }
     30 #pragma mark -- life cycle
     31 
     32 - (void)viewDidLoad {
     33     [super viewDidLoad];
     34     
     35     //1、创建CoreLocation的管理者:mgr
     36     
     37     //2、成为Corelocation管理者的代理,监听位置的获取
     38     self.mgr.delegate = self;
     39     
     40     /*
     41         iOS 7 只要开始定位,系统就会自动要求用户对你的应用程序授权,但是从iOS8开始,想要定位必须先主动请求
     42      在iOS8中不仅仅需要自动请求,还需要在info.list中配置属性才能弹出窗口授权
     43      
     44      NSLocationWhenInUserDescription    允许在前台获取GPS描述
     45      NSLocationAlwaysInUserDescription  允许在后台获取GPS描述
     46      */
     47     
     48     //2.1、 判断是不是iOS8
     49     if([[UIDevice currentDevice].systemVersion floatValue] >= 8.0)
     50     {
     51         NSLog(@"8.0+");
     52         
     53         //一授权成功就会改变通知代理
     54         [self.mgr requestAlwaysAuthorization]; // 请求前台和后台定位权限
     55         //[self.mgr requestWhenInUseAuthorization]; // 请求前台定位权限
     56     }
     57     else
     58     {
     59         NSLog(@"7.0-");
     60         [self.mgr startUpdatingLocation];
     61     }
     62     
     63     //3、开始监听
     64 }
     65 
     66 #pragma mark -- CoreLocation Delegate
     67 
     68 /**
     69  *  授权状态改变的时候会被调用
     70  *
     71  *  @param manager 调用者
     72  *  @param status  调用的状态
     73  */
     74 -(void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status
     75 {
     76 
     77     // CLAuthorizationStatus
     78     /*
     79      用户从未选择过权限
     80      kCLAuthorizationStatusNotDetermined
     81      
     82      无法使用定位服务,该状态用户无法改变
     83      kCLAuthorizationStatusRestricted
     84      
     85      用户拒绝该应用使用定位服务,或是定位服务总开关处于关闭状态
     86      kCLAuthorizationStatusDenied
     87      
     88      已经授权(废弃)
     89      kCLAuthorizationStatusAuthorized
     90      
     91      用户允许该程序无论何时都可以使用地理信息
     92      kCLAuthorizationStatusAuthorizedAlways
     93      
     94      用户同意程序在可见时使用地理位置
     95      kCLAuthorizationStatusAuthorizedWhenInUse*/
     96     
     97     if (status == kCLAuthorizationStatusAuthorizedAlways || status == kCLAuthorizationStatusAuthorizedWhenInUse)
     98     {
     99         NSLog(@"授权成功");
    100         
    101         [self.mgr startUpdatingLocation];
    102     }
    103     else if(status == kCLAuthorizationStatusNotDetermined)
    104     {
    105         NSLog(@"等待用户授权");
    106     }
    107     else{
    108         NSLog(@"授权失败");
    109     }
    110 }
    111 
    112 /**
    113  *  获取到位置信息之后就会去调用(如果不做控制会频繁调用,浪费电量)
    114  *
    115  *  @param manager   调用者
    116  *  @param locations 获取到的地理位置信息
    117  */
    118 -(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
    119 {
    120     NSLog(@"%s",__func__);
    121     
    122     CLLocation *local = [locations lastObject];
    123     
    124     //打印经纬度
    125     NSLog(@"%f,%f",local.coordinate.latitude,local.coordinate.longitude);
    126     
    127     
    128 }
    129 @end

    三、一些注意的点

    1、设置管理者、设置代理协议、开始监听三个步骤

    2、iOS8以后因为隐私问题,需要主动去向用户申请地图的使用权限,需要另外判断

      (1 首先要判断是不是iOS8以后

      (2 然后 调用requestAlwaysAuthorization请求用户的同意

      (3 用户同意之后会自动调用代理方法 didChangeAuthorizationStatus

      (4 我们可以在上面的代理方法中判断权限的状态,当权限的状态是成功之后,我们就可以调用 startUpdatingLocation 开始监听了

      (5 同时,我们还是需要在info.list文件中增加一个项:“NSLocationAlwaysUsageDescription”,值可以任意

      (6 当然你以为已经成功的时候可能还有会iOS8独特的BUG在等着你,可能需要设置当前的一些运动状态,才会有不断调用的响应

        

    3、locationManager代理方法一经启动定位会被频繁的调用,需要控制调用的次数

       例如:每隔多少米定位一次, 只有水平方向超过该值时才会重新定位

           // mgr.distanceFilter = 100;

  • 相关阅读:
    没提供编码格式,读文件时要怎么推测文件具体的编码
    Spring系列.@EnableRedisHttpSession原理简析
    程序员必备画图技能之——流程图
    痞子衡嵌入式:第一本Git命令教程(7.1)- 清理之缓存(stash)
    痞子衡嵌入式:第一本Git命令教程(6)- 日志(log/reflog/gitk)
    痞子衡嵌入式:第一本Git命令教程(5)- 提交(commit/format-patch/am)
    痞子衡嵌入式:第一本Git命令教程(4)- 转移(add/rm/mv)
    痞子衡嵌入式:第一本Git命令教程(3)- 变动(status/diff)
    痞子衡嵌入式:第一本Git命令教程(2)- 连接(remote/clone)
    痞子衡嵌入式:第一本Git命令教程(1)- 准备(init/config/.gitignore)
  • 原文地址:https://www.cnblogs.com/daomul/p/2723408.html
Copyright © 2020-2023  润新知