iOS核心笔记—CoreLocation框架-基础

1、CoreLocation框架简介:

?了解:在iOS开发中,要想使用地图和定位功能,必须基于2个框架进行开发。CoreLocation框架:主要用于地理定位;MapKit框架:主要用于地图展示。


1-1、CoreLocation框架功能:
功能 作用
地理定位 定位用户所在位置,获取对应的经纬度、海拔等位置信息
区域监听 事先在APP内部通过代码指定一个区域,当用户进入、或离开该区域的时候,可以通过对应的代理方法监听到用户的位置
地理编码 将详细的位置信息转换为对应的经纬度,即:位置信息 ——> 经纬度
反地理编码 将经纬度转换为详细的位置,即:经纬度 ——> 位置信息

?重要:CoreLocation框架着重于功能的实现,只有开发人员可以获取到对应的数据,用户是看不见、摸不着的;CoreLocation框架中所有的数据类型的前缀都是CL开头。


1-2、两个热门术语:
名称 含义
LBS Location Based Service,基于位置的服务
SoLoMo Social Local Mobile(索罗门),社交、本地、移动
社交化 在APP里面假如一些社交元素
本地化 基于LBS的周边搜索,周边签到等服务
移动化 移动网:3G/4G网,相对于有线/无线电脑网络;移动APP:相对于PC端应用

1-3、CoreLocation框架使用主要步骤:
步骤 具体信息
第一步 导入CoreLocation框架,Xcode5.0之后该步骤可以省略
第二步 导入主头文件,#import <CoreLocation/CoreLocation.h>
第三步 使用CLLocationManager对象调用相关方法(startUpdatingLocation —> 开启定位、stopUpdatingLocation —> 停止定位),开启定位功能,实现相关的位置服务
第四步 给CLLocationManager对象设置delegate
第五步 实现相应的代理方法,监听相关位置信息变化

?注意:只有使用了该框架里的某个类创建了一个对象,才会隐式的将该框架导入到项目中。


2、iOS8.0之前 - - - 定位功能:

1、?重要iOS8.0之前,实现定位功能不需要向用户请求授权。

2、?了解iOS8.0之前,版本即将被淘汰,不再做适配;而且iOS8.0以后的定位功能实现的代码可以直接运行在iOS8.0之前的设备上,不需要做任何修改;因为系统版本和Xcode版本问题,此处不再过于详细介绍iOS8.0之前的定位功能;只是列举大致实现步骤,详细步骤可以参阅iOS8.0之后的定为实现。

3、?了解iOS8.0之前,当应用程序使用后台定位功能时,屏幕上方是否会出现蓝色横幅未做验证


2-1、iOS8.0之前 - - - 前台定位:
2-1-1、详细步骤
步骤 详情
第一步 info.plist文件中配置Privacy - Location Usage Description来说明定位目的
第二步 导入CoreLocation框架及对应的主头文件
第三步 创建CLLocationManager对象并设置代理(delegate
第四步 调用startUpdatingLocation方法,开始更新用户的位置信息
第五步 在对应的代理方法中获取位置信息,locationManager:didUpdateLocations:代理方法一旦开始定位之后,将会每隔一秒钟自动调用;调用十分频繁,非常耗电

2-1-2、细节补充:
1、导入CoreLocation框架以及对应的主头文件。
1.  #import <CoreLocation/CoreLocation.h>

2、代理方法中无法定位原因:

?重要:①、CLLocationManager对象为局部变量;②、没有调用相应的方法开启定位功能;③、模拟器出现问题;④、其它未知原因导致。


2-2、iOS8.0之前 - - - 后台定位:
2-1、详细步骤:
步骤 详情
第一步 info.plist文件中配置Privacy - Location Usage Description来说明定位目的
第二步 开启后台模式: ①、选中工程-> 前往target -> capabilities -> Background Modes -> 勾选location updates;②、直接在info.plist文件中增加Required background modes的key,该key为一个数组,在该数组中增加App registers for location updates的值
第三步 导入CoreLocation框架及对应的主头文件
第四步 创建CLLocationManager对象并设置代理(delegate
第五步 调用startUpdatingLocation方法,开始更新用户的位置信息
第六步 在对应的代理方法中获取位置信息,locationManager:didUpdateLocations:代理方法一旦开始定位之后,将会每隔一秒钟自动调用;调用十分频繁,非常耗电

2-2、开启后台模式两种方式:

?重要:其实,两种开启后台模式的方式,本质都是操作info.plist文件。

  • ①、选中工程-> 前往target -> capabilities -> Background Modes -> 勾选location updates


  • ②、配置info.plist文件:

    ?了解:其实,两种开启后台模式的方式,本质都是操作info.plist文件。


2-3、细节补充:

?了解:①、需要使用Xcode7.0之前的版本,模拟器应选择iOS8.0之前的版本;②、iOS8.0之前后台定位,当应用退出到后台时,在屏幕上方应该会出现蓝色横幅(未验证,不过查阅大量资粮都未说明会有蓝色横幅)。


2-4、常见问题:

?注意:如果定位不到,对应的代理方法不执行;4中解决方案:①、检查模拟器是否为iOS8.0之前的系统版本,一定要使用iOS8.0之前的模拟器;②、检查模拟器是否有设置数据;③、检查代码是否存在逻辑错误、是否有设置代理、位置管理对象是否为局部变量;④、模拟器问题,请先将模拟器位置设为None,然后再次设置数据;或者,重置模拟器。


2-5、示例代码:
1.#import "ViewController.h"2.#import <CoreLocation/CoreLocation.h>3.[email protected] ViewController ()<CLLocationManagerDelegate>5.6./** 位置管理者 */[email protected] (nonatomic, strong) CLLocationManager *lM;8.[email protected]10.[email protected] ViewController12.13.#pragma mark - 懒加载14.- (CLLocationManager *)lM15.{16.    if (!_lM) {17.        // 1. 创建位置管理者18.        _lM = [[CLLocationManager alloc] init];19.        // 1.1 代理, 通知, block20.        _lM.delegate = self;21.22.        // 距离筛选器: 每隔多米定位一次23.        _lM.distanceFilter = 100;24.25.        // 精确度越高, 越耗电, 定位时间越长26.        _lM.desiredAccuracy = kCLLocationAccuracyBest;27.    }28.    return _lM;29.}30.31.- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event32.{33.    // 2. 使用位置管理者,开始更新用户位置34.    // 默认只能在前台获取用户位置,35.    // 勾选后台模式 location updates36.    [self.lM startUpdatingLocation];37.}38.39.#pragma mark - CLLocationManagerDelegate40./**41. *  更新到位置之后调用42. *43. *  @param manager   位置管理者44. *  @param locations 位置数组45. */46.-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations47.{48.    NSLog(@"定位到了");49.50.    // 拿到位置,做一些业务逻辑操作51.52.    // 停止更新53.    [manager stopUpdatingLocation];54.}[email protected]

3、iOS8.0 ~ iOS9.0 - - - 定位功能:

3-1、iOS8.0 ~ iOS9.0 - - - 前台定位:
1、详细步骤
步骤 详情
第一步 info.plist文件中配置key为NSLocationWhenInUseUsageDescription的键值对、并调用CLLocationManager对象的requestWhenInUseAuthorization方法请求用户授权
第二步 导入CoreLocation框架及对应的主头文件
第三步 创建CLLocationManager对象并设置代理(delegate
第四步 调用startUpdatingLocation方法,开始更新用户的位置信息
第五步 在对应的代理方法中获取位置信息,locationManager:didUpdateLocations:代理方法一旦开始定位之后,将会每隔一秒钟自动调用;调用十分频繁,非常耗电,在该代理方法中执行相应的逻辑操作

2、细节补充:

?重要:①、从iOS8.0开始,应用开启定位功能需要主动请求前台定位授权;除了使用CLLocationManager对象调用requestWhenInUseAuthorization方法之外,还需要在info.plist文件中配置NSLocationWhenInUseUsageDescription的key(注意:千万不要出现空格),其value用以向用户说明应用程序使用定位功能主要用途(注意:value可以为空);如果没有配置该键值对,将不会弹框获取用户授权。②、需要注意版本适配问题,模拟器运行环境应当为iOS8.0之后,包括iOS8.0


3、示例代码:
1.#import "ViewController.h"2.#import <CoreLocation/CoreLocation.h>3.[email protected] ViewController () <CLLocationManagerDelegate>5./** 定位管理者 */[email protected] (strong, nonatomic) CLLocationManager *mgr;7.[email protected]9.[email protected] ViewController11.12.- (void)viewDidLoad {13.    [super viewDidLoad];14.15.    // 1. 创建定位管理者对象, 创建对象调用init方法初始化时, 如无特殊操作; 可以使用new方法代替16.    self.mgr = [CLLocationManager new];17.18.    // 2. 请求用户授权, 必须在info.plist文件配置键值对19.    // NSLocationWhenInUseUsageDescription : 前台定位授权20.    // requestWhenInUseAuthorization : 前台授权 ,使用应用时授权获取位置信息21.    // NSLocationAlwaysUsageDescription : 前后台授权22.    // requestAlwaysAuthorization : 前后台授权, 总是授权获取位置信息23.    if ([self.mgr respondsToSelector:@selector(requestWhenInUseAuthorization)]) {24.        [self.mgr requestWhenInUseAuthorization];25.    }26.27.    // 3. 设置代理对象28.    self.mgr.delegate = self;29.30.    // 4. 开启定位功能31.    [self.mgr startUpdatingLocation];32.}33.34.#pragma mark - <CLLocationManagerDelegate>35./**36. 第一次成功获取用户位置时便会来到此代理方法, 之后每隔一秒钟调用一次; 调用十分频繁37.38. @param manager 定位管理者对象39. @param locations 用户所有位置对象(数组中每一个元素代表一个位置)40. */41.- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations42.{43.    NSLog(@"%@", locations);44.45.    // 1. 停止定位46.    [self.mgr stopUpdatingLocation];47.}[email protected]

3-2、iOS8.0 ~ iOS9.0 - - - 后台定位:
3-2-1、前台授权 + 开启后台模式:

?重要:①、一定要记得开启后台模式,否则,当应用程序退到后台模式时将不能进行定位操作;②、当APP退到后台,在屏幕上方会出现蓝色横幅,已提醒用户应用程序正在使用定位功能。


1、详细步骤
步骤 详情
第一步 info.plist文件中配置key为NSLocationWhenInUseUsageDescription的键值对、并调用CLLocationManager对象的requestWhenInUseAuthorization方法请求用户授权
第二步 开启后台模式: ①、选中工程-> 前往target -> capabilities -> Background Modes -> 勾选location updates;②、直接在info.plist文件中增加Required background modes的key,该key为一个数组,在该数组中增加App registers for location updates的值
第三步 导入CoreLocation框架及对应的主头文件
第四步 创建CLLocationManager对象并设置代理(delegate
第五步 调用startUpdatingLocation方法,开始更新用户的位置信息
第六步 在对应的代理方法中获取位置信息,locationManager:didUpdateLocations:代理方法一旦开始定位之后,将会每隔一秒钟自动调用;调用十分频繁,非常耗电,在该代理方法中执行相应的逻辑操作

2、开启后台模式两种方式:

?重要:其实,两种开启后台模式的方式,本质都是操作info.plist文件。

    • ①、选中工程-> 前往target -> capabilities -> Background Modes -> 勾选location updates
  • ②、配置info.plist文件:

3、示例代码:

?重要:与前台定位的示例代码一致,只是,应用程序开启后台模式,能够在后台获取用户的位置信息;并在代理方法中执行相应的逻辑操作。


3-2-2、前后台授权:

?重要:①、iOS8.0之后应用程序使用后台定位功能,前后台授权级别高于前台授权级别;当同时使用两种授权方式时会有两次弹框提醒。②、使用前后台授权,无论应用程序是否开启后台模式;应用程序退到后台都能获取位置信息。③、使用前后台授权,当应用退到后台,在屏幕上方不会出现蓝色横幅


1、详细步骤
步骤 详情
第一步 info.plist文件中配置key为NSLocationAlwaysUsageDescription的键值对、并调用CLLocationManager对象的requestAlwaysAuthorization方法请求用户授权
第二步 导入CoreLocation框架及对应的主头文件
第三步 创建CLLocationManager对象并设置代理(delegate
第四步 调用startUpdatingLocation方法,开始更新用户的位置信息
第五步 在对应的代理方法中获取位置信息,locationManager:didUpdateLocations:代理方法一旦开始定位之后,将会每隔一秒钟自动调用;调用十分频繁,非常耗电,在该代理方法中执行相应的逻辑操作

2、细节补充:

?重要:①、注意,在实际应用开发中可能需要版本适配;②、不要忘记配置info.plist文件,否则,将不会出现弹框获取用户授权。


4、iOS9.0之后 - - - 定位功能:

?了解iOS9.0使用前台授权 + 开启后台模式实现后台定位功能有所改变,增加了新的步骤;需要设置CLLocationManager对象的allowsBackgroundLocationUpdates属性,代理对象还必须实现locationManager:didFailWithError:代理方法,以达到监听定位失败的错误信息。


4-1、iOS9.0之后 - - - 前台定位:

?了解:与iOS8.0 ~ iOS9.0前台定位实现步骤一致,并无任何新增变化;一定要注意使用前台定位功能需要获取用户授权,注意:需要配置info.plist文件,否则,将不会出现弹框提醒用户、获取用户授权。


4-2、iOS9.0之后 - - - 后台定位:
4-2-1、前台授权 + 开启后台模式
1、前台授权 + 开启后台模式

?重要:在前台定位授权的基础上,如果勾选了后台模式location updates之后,还需要额外设置属性allowsBackgroundLocationUpdates = YES;代理对象还必须实现locationManager:didFailWithError:代理方法,以达到监听定位失败的错误信息。使用allowsBackgroundLocationUpdates属性注意需要做版本适配,该属性为iOS9.0 ~


2、示例代码:
1.// 5. 获取后台临时定位授权, 记得开启后台定位模式, 否则, 程序将会崩溃2.if ([UIDevice currentDevice].systemVersion.doubleValue >= 9.0) {3.    self.mgr.allowsBackgroundLocationUpdates = YES;4.}

3、必须实现的代理方法:
1./**2. 定位失败调用该代理方法3.4. @param manager 定位管理者对象5. @param error 错误对象6. */7.- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error{8.    if (error != nil) {9.        NSLog(@"%@", error);10.    }11.}

?重要:没有实现该代理方法,程序将会崩溃。


4-2-2、前后台授权

?重要:直接请求前后台定位授权,和iOS8.0 ~ iOS9.0之后一致;没有任何变化。注意:只能运行在iOS9.0之后的设备上,一定要注意版本适配。


时间: 2024-10-07 15:46:26

iOS核心笔记—CoreLocation框架-基础的相关文章

iOS核心笔记—MapKit框架-基础

1.MapKit框架简介: ?了解:MapKit框架使用须知:①.MapKit框架中所有的数据类型的前缀都是MK:②.需要导入#import <MapKit/MapKit.h>头文件:③.MapKit框架中有一个非常重要的UI控件:MKMapView,专门用于地图显示,例如:大头针.路线.覆盖层展示等(着重界面展示). 1-1.地图设置: 1-1-1.设置地图显示类型: 地图类型: 地图枚举 地图类型 MKMapTypeStandard 普通地图 MKMapTypeSatellite 卫星云图

iOS核心笔记—MapKit框架-导航

1.导航简介: ?了解:导航,简单来说,就是根据用户指定的位置,进行路线规划:然后根据用户在行走过程中,实时的给出指引提示. 1-1.iOS导航实现方案: 方案 详细说明 方案一 将需要导航的位置传递给系统的地图APP进行导航 方案二 发送网络请求到Apple服务器/公司服务器获取导航数据,然后,手动绘制导航路线 方案三 利用第三方SDK实现导航功能(百度地图) ?说明:通常如果需要手动绘制导航路线,都是向Apple服务器发送请求.获取导航信息:此处,只对方案一.方案二做详细介绍,方案三将单独说

iOS核心笔记——UICollectionView-布局对象

iOS核心笔记--UICollectionView-布局对象 1.UICollectionView布局对象: 1-1.UICollectionViewLayout: ?了解:1.UICollectionViewLayout没有itemSize属性,而collectionView的cell的大小不能为0或者小于0:所以,通常collectionView使用其子类UICollectionViewFlowLayout布局cell. ?了解:2.UICollectionViewLayout中声明了布局可

iOS核心笔记——UICollectionView-辅助视图

iOS核心笔记--UICollectionView-辅助视图 1.UICollectionView辅助视图: ?了解:UICollectionView中的头部视图.尾部视图都是使用注册机制 + 重用机制,提高程序的执行效率,其头尾部视图类型均为:UICollectionReusableView.注册辅助视图时使用字符串区分注册的视图为头部还是尾部视图,其区分字符串为:UICollectionElementKindSectionHeader(头部视图).UICollectionElementKin

iOS核心笔记——多线程-GCD

1.GCD简介: ?了解:GCD全称为"Grand Central Dispatch",纯C语言,GCD提供了非常多功能强大的函数:GCD中所有的函数都包含于Libdispatch库中. 1-1.使用GCD的优势: ?了解:1.GCD是苹果公司为多核的并行运算提出的解决方案: ?了解:2.GCD会自动利用更多的CPU内核(例如:双核.四核): ?了解:3.GCD会自动管理线程的生命周期(创建线程.调度任务.销毁线程). 1-2.GCD两大核心概念: 名称 作用: 任务 执行什么操作 队

iOS核心笔记——网络编程-网络安全

1.数据安全: 1.01 攻城利器:Charles(公司中一般都使用该工具来抓包,并做网络测试)2.注意:Charles在使用中的乱码问题,可以显示包内容,然后打开info.plist文件,找到java目录下面的VMOptions,在后面添加一项:-Dfile.encoding=UTF-83.02 数据安全的原则4. 1)在网络上"不允许"传输用户隐私数据的"明文"5. 2.)在本地"不允许"保存用户隐私数据的"明文"6.03

iOS核心笔记——RunLoop-基础

1.RunLoop介绍: ?了解:RunLoop从字面意思看就是运行循环.跑圈,通常情况下,一个线程一次只能执行一个任务:任务执行完毕后线程就会进入消亡状态随之退出.有时候我们希望线程执行完任务之后还能随时处理事件且不退出,所以,iOS提供了RunLoop. 1-1.什么是RunLoop? ?重要:RunLoop实际上就是一个对象,RunLoop对象管理其需要处理的事件和消息:RunLoop能够让线程在没有处理消息时进入休眠状态以避免占用资源.在监听到事件源发送的消息时立刻唤醒线程.RunLoo

iOS核心笔记——网络编程-HTTPS协议

1.HTTPS的基本使用: 1.HTTPS简单说明: ?了解:HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版. ?重要:即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL. 它是一个URI scheme(抽象标识符体系),句法类同http:体系.用于安全的HTTP数据传输. ?重要:https:URL:表明它使用了HTTPS,

iOS核心笔记——CALayer-基本使用

1.CALayer简单使用: ※了解: 通过操作CALayer对象,可以很方便的调整UIView的一些界面属性,例如:阴影.圆角大小.边框宽度--等:在iOS 7.0以前使用CALayer需要手动导入QuartzCore框架. 2.通过CALayer修改UIView的界面属性: 1.在storyboard中拖入UIView,并设置相关属性: 如下图所示: 2.设置阴影: 1. // 1. 设置阴影颜色2. self.blueView.layer.shadowColor = [UIColor bl