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;

 

posted @ 2012-10-14 22:34  daomul  阅读(1242)  评论(0编辑  收藏  举报