热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开发笔记:iOS核心笔记—CoreLocation框架基础

篇首语:本文由编程笔记#小编为大家整理,主要介绍了iOS核心笔记—CoreLocation框架-基础相关的知识,希望对你有一定的参考价值。1、

篇首语:本文由编程笔记#小编为大家整理,主要介绍了iOS核心笔记—CoreLocation框架-基础相关的知识,希望对你有一定的参考价值。




1、CoreLocation框架简介:


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





1-1、CoreLocation框架功能:























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

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





1-2、两个热门术语:



























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



1-3、CoreLocation框架使用主要步骤:



























步骤具体信息
第一步导入CoreLocation框架,Xcode5.0之后该步骤可以省略
第二步导入主头文件,#import
第三步使用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



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
3.
[email protected] ViewController ()
5.
6./** 位置管理者 */
[email protected] (nonatomic, strong) CLLocationManager *lM;
8.
[email protected]
10.
[email protected] ViewController
12.
13.#pragma mark - 懒加载
14.- (CLLocationManager *)lM
15.{
16. if (!_lM) {
17. // 1. 创建位置管理者
18. _lM = [[CLLocationManager alloc] init];
19. // 1.1 代理, 通知, block
20. _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 *)event
32.{
33. // 2. 使用位置管理者,开始更新用户位置
34. // 默认只能在前台获取用户位置,
35. // 勾选后台模式 location updates
36. [self.lM startUpdatingLocation];
37.}
38.
39.#pragma mark - CLLocationManagerDelegate
40./**
41. * 更新到位置之后调用
42. *
43. * @param manager 位置管理者
44. * @param locations 位置数组
45. */
46.-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
47.{
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
3.
[email protected] ViewController ()
5./** 定位管理者 */
[email protected] (strong, nonatomic) CLLocationManager *mgr;
7.
[email protected]
9.
[email protected] ViewController
11.
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 -
35./**
36. 第一次成功获取用户位置时便会来到此代理方法, 之后每隔一秒钟调用一次; 调用十分频繁
37.
38. @param manager 定位管理者对象
39. @param locations 用户所有位置对象(数组中每一个元素代表一个位置)
40. */
41.- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
42.{
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之后的设备上,一定要注意版本适配。






























































































































推荐阅读
  • javascript  – 概述在Firefox上无法正常工作
    我试图提出一些自定义大纲,以达到一些Web可访问性建议.但我不能用Firefox制作.这就是它在Chrome上的外观:而那个图标实际上是一个锚点.在Firefox上,它只概述了整个 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了logistic回归(线性和非线性)相关的知识,包括线性logistic回归的代码和数据集的分布情况。希望对你有一定的参考价值。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • importjava.util.ArrayList;publicclassPageIndex{privateintpageSize;每页要显示的行privateintpageNum ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • 关键词:Golang, Cookie, 跟踪位置, net/http/cookiejar, package main, golang.org/x/net/publicsuffix, io/ioutil, log, net/http, net/http/cookiejar ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 本文介绍了如何使用python从列表中删除所有的零,并将结果以列表形式输出,同时提供了示例格式。 ... [详细]
author-avatar
LST---诗ting
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有