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;