【iOS】7.4 定位服务->2.1.3.1 定位 - 官方框架CoreLocation 功能1:地理定位
本文并非最终版本,如果想要关注更新或更正的内容请关注文集,联系方式详见文末,如有疏忽和遗漏,欢迎指正。
本文相关目录:
================== 所属文集:【iOS】07 设备工具 ==================
7.4 定位服务->1.0 简介
7.4 定位服务->2.1.1 定位 - 官方框架CoreLocation: 请求用户授权
7.4 定位服务->2.1.2 定位 - 官方框架CoreLocation: CLLocationManager位置管理器
7.4 定位服务->2.1.3.1 定位 - 官方框架CoreLocation 功能1:地理定位
7.4 定位服务->2.1.3.2 定位 - 官方框架CoreLocation 功能2:地理编码和反地理编码
7.4 定位服务->2.1.3.3 定位 - 官方框架CoreLocation 功能3:区域监听
7.4 定位服务->2.1.4 定位 - 官方框架CoreLocation 案例:指南针效果
7.4 定位服务->2.2 定位 - locationManager框架
7.4 定位服务->3.1 地图框架MapKit 功能1:地图展示
7.4 定位服务->3.2 地图框架MapKit 功能2:路线规划(导航)
7.4 定位服务->3.3 地图框架MapKit 功能3:3D视图
7.4 定位服务->3.4 地图框架MapKit 功能4:地图截图
7.4 定位服务->3.5 地图框架MapKit 功能5:POI检索
================== 所属文集:【iOS】07 设备工具 ==================
定位目录:
官方框架CoreLocation目录:
定位的功能实现:
地理定位的步骤:
详细讨论下步骤5
iOS 8.0- 的定位
勾选后台模式,图解:
代码2:
编译环境:Xcode 8.0
模拟器版本:iOS 10
Swift版本:3.0
【OC语言】
#import "ViewController.h"
#import <CoreLocation/CoreLocation.h>
@interface ViewController () <CLLocationManagerDelegate> // 代理
@property(nonatomic, strong) CLLocationManager *locationM; // 位置管理者
@end
@implementation ViewController
#pragma mark - 懒加载对象,并在懒加载方法中进行部分初始化操作
- (CLLocationManager *)locationM {
if (!_locationM) {
// 1. 创建位置管理者
_locationM = [[CLLocationManager alloc] init];
// 2. 设置代理, 接收位置数据(其他方式:block、通知)
_locationM.delegate = self;
// 3.前台定位,后台定位(在info.plist文件中配置对应的key)
// 4. 设置定位的过滤距离(单位:米), 表示用户位置移动了x米时调用对应的代理方法
_locationM.distanceFilter = 500; //在用户位置改变500米时调用一次代理方法
// 5. 设置定位的精确度 (单位:米),(定位精确度越高, 越耗电, 定位的速度越慢)
_locationM.desiredAccuracy = kCLLocationAccuracyBest;
}
return _locationM;
}
#pragma mark - 点击屏幕,开始更新用户位置
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
// 判断定位服务是否开启
if ([CLLocationManager locationServicesEnabled]) {
NSLog(@"已经开启定位服务,即将开始定位...");
#pragma mark - 开始定位
[self.locationM startUpdatingLocation];
} else {
NSLog(@"没有开启定位服务");
}
}
#pragma mark - 代理方法:当位置管理器获取到用户位置后,就会调用此方法
-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations{
NSLog(@"位置信息:%@", locations);
// 停止定位(代理方法一直调用,会非常耗电,除非特殊需求,如导航)
[manager stopUpdatingLocation];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
【Swift语言】
import UIKit
import CoreLocation
class ViewController: UIViewController {
// 懒加载
lazy var locationM : CLLocationManager = {
// 1. 创建位置管理者
let locationM : CLLocationManager = CLLocationManager()
// 2. 设置代理, 接收位置数据(其他方式:block、通知)
locationM.delegate = self
// 3.前台定位,后台定位(在info.plist文件中配置对应的key)
// 4. 设置过滤距离
// 如果当前位置, 距离上一次的位置之间的物理距离大于以下数值时, 就会通过代理, 将当前位置告诉外界
locationM.distanceFilter = 100 // 每隔100 米定位一次
// 5. 设置定位的精确度(定位精确度越高, 越耗电, 定位的速度越慢)
locationM.desiredAccuracy = kCLLocationAccuracyBest
return locationM
}()
// 点击屏幕,开始更新用户位置
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
locationM.startUpdatingLocation()
}
}
// 类扩展(CLLocationManager的代理方法)
extension ViewController: CLLocationManagerDelegate {
// 代理方法:当位置管理器,获取到位置后,就会调用此方法
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
print("获取到位置")
// 只想获取一次用户位置信息,那么在获取到位置信息之后,停止更新用户的位置信息
// 应用场景: 获取用户所在城市
manager.stopUpdatingLocation()
}
}
iOS 8.0+ 的定位
代码3:
编译环境:Xcode 8.0
模拟器版本:iOS 10
Swift版本:3.0
这里只贴主要代码,其余和代码2相同,详见文末 github 地址
【OC语言】
#pragma mark - 懒加载对象,并在懒加载方法中进行部分初始化操作
- (CLLocationManager *)locationM {
if (!_locationM) {
// 1. 创建位置管理者
_locationM = [[CLLocationManager alloc] init];
// 2. 设置代理, 接收位置数据(其他方式:block、通知)
_locationM.delegate = self;
// 3.定位(在info.plist文件中配置对应的key)
// 如果两个授权都请求,那么先执行前面那个请求弹框,后面那个请求授权 有可能 下次被调用时,才会起作用
// 如果,先请求的是“前后台授权”,那“前台授权”即使被调用,也不会有反应(因为“前后台授权”权限大于“前台授权”)
// 反之,如果先请求的是“前台授权”,而且用户选中的是“允许”,那下次被调用时“前后台授权”会做出请求,但只请求一次
// 本质:1. 两个授权同时请求,先执行前面那个授权请求
// 2. “前后台请求授权”方法,在(当前的授权状态 == 用户未选择状态 or 前台授权状态) 才会起作用
// 3. “前台请求授权”方法,在(当前的授权状态 == 用户未选择状态) 才会起作用
// 判断系统版本,做适配
if ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0) {
// 前台定位
// 配合后台模式,屏幕上方会出现一个蓝色的横幅, 不断提醒用户, 当前APP 正在使用你的位置
[_locationM requestWhenInUseAuthorization];
// 前后台定位
// 无论是否勾选后台模式, 都可以获取位置信息. 而且无论前后台, 都不会出现蓝条
// [_locationM requestAlwaysAuthorization];
}
// 4. 设置定位的过滤距离(单位:米), 表示用户位置移动了x米时调用对应的代理方法
_locationM.distanceFilter = 500; //在用户位置改变500米时调用一次代理方法
// 5. 设置定位的精确度 (单位:米),(定位精确度越高, 越耗电, 定位的速度越慢)
_locationM.desiredAccuracy = kCLLocationAccuracyBest;
}
return _locationM;
}
【Swift语言】
// 懒加载
lazy var locationM : CLLocationManager = {
// 1. 创建位置管理者
let locationM : CLLocationManager = CLLocationManager()
// 2. 设置代理, 接收位置数据(其他方式:block、通知)
locationM.delegate = self
// 3.定位(在info.plist文件中配置对应的key)
// 如果两个授权都请求,那么先执行前面那个请求弹框,后面那个请求授权 有可能 下次被调用时,才会起作用
// 如果,先请求的是“前后台授权”,那“前台授权”即使被调用,也不会有反应(因为“前后台授权”权限大于“前台授权”)
// 反之,如果先请求的是“前台授权”,而且用户选中的是“允许”,那下次被调用时“前后台授权”会做出请求,但只请求一次
// 本质:1. 两个授权同时请求,先执行前面那个授权请求
// 2. “前后台请求授权”方法,在(当前的授权状态 == 用户未选择状态 or 前台授权状态) 才会起作用
// 3. “前台请求授权”方法,在(当前的授权状态 == 用户未选择状态) 才会起作用
// 判断系统版本,做适配
if (Float(UIDevice.current.systemVersion)! >= 8.0){
// 前台定位
// 配合后台模式,屏幕上方会出现一个蓝色的横幅, 不断提醒用户, 当前APP 正在使用你的位置
locationM.requestWhenInUseAuthorization()
// 前后台定位
// 无论是否勾选后台模式, 都可以获取位置信息. 而且无论前后台, 都不会出现蓝条
// locationM.requestAlwaysAuthorization()
}
// 4. 设置过滤距离
// 如果当前位置, 距离上一次的位置之间的物理距离大于以下数值时, 就会通过代理, 将当前位置告诉外界
locationM.distanceFilter = 100 // 每隔100 米定位一次
// 5. 设置定位的精确度(定位精确度越高, 越耗电, 定位的速度越慢)
locationM.desiredAccuracy = kCLLocationAccuracyBest
return locationM
}()
iOS 9.0+ 的定位
代码4:
编译环境:Xcode 8.0
模拟器版本:iOS 10
Swift版本:3.0
这里只贴主要代码,其余和代码2相同,详见文末 github 地址
【OC语言】
#pragma mark - 懒加载对象,并在懒加载方法中进行部分初始化操作
- (CLLocationManager *)locationM {
if (!_locationM) {
// 1. 创建位置管理者
_locationM = [[CLLocationManager alloc] init];
// 2. 设置代理, 接收位置数据(其他方式:block、通知)
_locationM.delegate = self;
// 3.定位(在info.plist文件中配置对应的key)
// 如果两个授权都请求,那么先执行前面那个请求弹框,后面那个请求授权 有可能 下次被调用时,才会起作用
// 如果,先请求的是“前后台授权”,那“前台授权”即使被调用,也不会有反应(因为“前后台授权”权限大于“前台授权”)
// 反之,如果先请求的是“前台授权”,而且用户选中的是“允许”,那下次被调用时“前后台授权”会做出请求,但只请求一次
// 本质:1. 两个授权同时请求,先执行前面那个授权请求
// 2. “前后台请求授权”方法,在(当前的授权状态 == 用户未选择状态 or 前台授权状态) 才会起作用
// 3. “前台请求授权”方法,在(当前的授权状态 == 用户未选择状态) 才会起作用
// 判断系统版本,做适配
if ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0) {
// 前台定位
// 配合后台模式,屏幕上方会出现一个蓝色的横幅, 不断提醒用户, 当前APP 正在使用你的位置
[_locationM requestWhenInUseAuthorization];
// 前后台定位
// 无论是否勾选后台模式, 都可以获取位置信息. 而且无论前后台, 都不会出现蓝条
// [_locationM requestAlwaysAuthorization];
// 如果是iOS9.0之后, 当前授权状态是前台定位授权状态, 也想在后台获取用户的位置信息,那么需要满足以下条件
// 1. 勾选后台模式 2. 设置以下属性为YES(Swift, 里面是true)
if ([[UIDevice currentDevice].systemVersion floatValue] >= 9.0) {
_locationM.allowsBackgroundLocationUpdates = YES;
}
}
// 4. 设置定位的过滤距离(单位:米), 表示用户位置移动了x米时调用对应的代理方法
_locationM.distanceFilter = 500; //在用户位置改变500米时调用一次代理方法
// 5. 设置定位的精确度 (单位:米),(定位精确度越高, 越耗电, 定位的速度越慢)
_locationM.desiredAccuracy = kCLLocationAccuracyBest;
}
return _locationM;
}
【Swift语言】
// 懒加载
lazy var locationM : CLLocationManager = {
// 1. 创建位置管理者
let locationM : CLLocationManager = CLLocationManager()
// 2. 设置代理, 接收位置数据(其他方式:block、通知)
locationM.delegate = self
// 3.定位(在info.plist文件中配置对应的key)
// 如果两个授权都请求,那么先执行前面那个请求弹框,后面那个请求授权 有可能 下次被调用时,才会起作用
// 如果,先请求的是“前后台授权”,那“前台授权”即使被调用,也不会有反应(因为“前后台授权”权限大于“前台授权”)
// 反之,如果先请求的是“前台授权”,而且用户选中的是“允许”,那下次被调用时“前后台授权”会做出请求,但只请求一次
// 本质:1. 两个授权同时请求,先执行前面那个授权请求
// 2. “前后台请求授权”方法,在(当前的授权状态 == 用户未选择状态 or 前台授权状态) 才会起作用
// 3. “前台请求授权”方法,在(当前的授权状态 == 用户未选择状态) 才会起作用
// 判断系统版本,做适配
if (Float(UIDevice.current.systemVersion)! >= 8.0){
// 前台定位
// 配合后台模式,屏幕上方会出现一个蓝色的横幅, 不断提醒用户, 当前APP 正在使用你的位置
locationM.requestWhenInUseAuthorization()
// 前后台定位
// 无论是否勾选后台模式, 都可以获取位置信息. 而且无论前后台, 都不会出现蓝条
// locationM.requestAlwaysAuthorization()
// 如果是iOS9.0之后, 当前授权状态是前台定位授权状态, 也想在后台获取用户的位置信息,那么需要满足以下条件
// 1. 勾选后台模式 2. 设置以下属性为true(OC, 里面是YES)
if (Float(UIDevice.current.systemVersion)! >= 9.0){
locationM.allowsBackgroundLocationUpdates = true
}
}
// 4. 设置过滤距离
// 如果当前位置, 距离上一次的位置之间的物理距离大于以下数值时, 就会通过代理, 将当前位置告诉外界
locationM.distanceFilter = 100 // 每隔100 米定位一次
// 5. 设置定位的精确度(定位精确度越高, 越耗电, 定位的速度越慢)
locationM.desiredAccuracy = kCLLocationAccuracyBest
return locationM
}()
【区别】前台定位 &前后台定位
本文源码 Demo 详见 Github
https://github.com/shorfng/iOS_7.0_Device-Tools
作者:蓝田(Loto)
【作品发布平台】
① 简书
② 博客园
③ Gitbook(如果觉得文章太长,请阅读此平台发布的文章)
【代码托管平台】
【如有疑问,请通过以下方式交流】
① 评论区回复
② 发送邮件
至 shorfng@126.com
本文版权归作者和本网站共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,谢谢合作。
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
支付宝扫一扫 向我打赏
你也可以微信 向我打赏
【iOS】7.4 定位服务->2.1.3.1 定位 - 官方框架CoreLocation 功能1:地理定位的更多相关文章
- 【iOS】7.4 定位服务->2.1.3.2 定位 - 官方框架CoreLocation 功能2:地理编码和反地理编码
本文并非最终版本,如果想要关注更新或更正的内容请关注文集,联系方式详见文末,如有疏忽和遗漏,欢迎指正. 本文相关目录: ================== 所属文集:[iOS]07 设备工具 === ...
- 【iOS】7.4 定位服务->2.1.3.3 定位 - 官方框架CoreLocation 功能3:区域监听
本文并非最终版本,如果想要关注更新或更正的内容请关注文集,联系方式详见文末,如有疏忽和遗漏,欢迎指正. 本文相关目录: ================== 所属文集:[iOS]07 设备工具 === ...
- 【iOS】7.4 定位服务->2.1.1 定位 - 官方框架CoreLocation: 请求用户授权
本文并非最终版本,如果想要关注更新或更正的内容请关注文集,联系方式详见文末,如有疏忽和遗漏,欢迎指正. 本文相关目录: ================== 所属文集:[iOS]07 设备工具 === ...
- 【iOS】7.4 定位服务->2.1.2 定位 - 官方框架CoreLocation: CLLocationManager(位置管理器)
本文并非最终版本,如果想要关注更新或更正的内容请关注文集,联系方式详见文末,如有疏忽和遗漏,欢迎指正. 本文相关目录: ================== 所属文集:[iOS]07 设备工具 === ...
- 【iOS】7.4 定位服务->2.1.4 定位 - 官方框架CoreLocation 案例:指南针效果
本文并非最终版本,如果想要关注更新或更正的内容请关注文集,联系方式详见文末,如有疏忽和遗漏,欢迎指正. 本文相关目录: ================== 所属文集:[iOS]07 设备工具 === ...
- IOS CoreLocation框架的使用(用于地理定位)
● 在移动互联网时代,移动app能解决用户的很多生活琐事,比如 ● 导航:去任意陌生的地方 ● 周边:找餐馆.找酒店.找银行.找电影院 ● 在上述应用中,都用到了地图和定位功能,在iOS开发中 ...
- 【iOS】7.4 定位服务->3.1 地图框架MapKit 功能1:地图展示
> 本文并非最终版本,如果想要关注更新或更正的内容请关注文集,联系方式详见文末,如有疏忽和遗漏,欢迎指正. --- > 本文相关目录: ================== 所属文集:[[ ...
- 【iOS】7.4 定位服务->3.2 地图框架MapKit 功能2:路线规划(导航)
本文并非最终版本,如果想要关注更新或更正的内容请关注文集,联系方式详见文末,如有疏忽和遗漏,欢迎指正. 本文相关目录: ================== 所属文集:[iOS]07 设备工具 === ...
- 【iOS】7.4 定位服务->3.3 地图框架MapKit 功能3:3D视图
本文并非最终版本,如果想要关注更新或更正的内容请关注文集,联系方式详见文末,如有疏忽和遗漏,欢迎指正. 本文相关目录: ================== 所属文集:[iOS]07 设备工具 === ...
随机推荐
- ArcGIS API for JavaScript 4.2学习笔记[2] 显示3D地图
3D地图又叫场景. 由上一篇可知, require入口函数的第一个参数是字符串数组 ["esri/Map", "esri/views/MapView", &qu ...
- [CSS3] 学习笔记--CSS盒子模型
1.CSS盒子模型概述 盒子模型的内容范围包括:margin(外边距).border(边框).padding(内边距).content(内容)部分组成. 2.内边距 内边距在content外,bord ...
- RAS 加密 解密
蚂蚁金服电话面试时,问到了RAS加密解密,感觉回答的有点模糊,遂写个例子加深一下印象 package cheng.test.cipher;import java.io.FileInputStream; ...
- 深入理解DOM事件类型系列第六篇——加载事件
前面的话 提到加载事件,可能想到了window.onload,但实际上,加载事件是一大类事件,本文将详细介绍加载事件 load load事件是最常用的一个事件,当页面完全加载后(包括所有图像.java ...
- 抛砖引玉:探讨网站性能优化之Javascript异步懒加载技术
懒加载技术是现在许多大型网站的都使用的提高网站性能的方式,它的核心思想是当用户想看页面某个区域时,再加载该区域的数据.这在一定程度上减轻了服务器端的压力,也加快了页面的呈现速度. 其实国内很多网站都用 ...
- 腾讯优图及知脸(ZKface)人脸比对接口测试(python)
一.腾讯优图 1.开发者地址:http://open.youtu.qq.com/welcome/developer 2.接入流程:按照开发者页面的接入流程接入之后,创建应用即可获得所需的AppID.S ...
- Spring中LocalSessionFactoryBean与SessionFactory
相信不少人多纠结LocalSessionFactoryBean与SessionFactory到底是什么关系,怎么去进行关联的,正如图所示: transactonManager有一个对sessionFa ...
- 《解决在Word中为汉子插入拼音及音标的问题》
说明:本人使用的是Word2007版本.以下示例都是基于本人电脑操作.如有疑问,欢迎留言交流. [1]为word中的一些文字添加拼音及音标. [2]开始为文字添加拼音及音标. 选中要添加拼音及音标的文 ...
- matlab 嵌套循环的学习
循环嵌套带嵌套的循环一般为两重,举例1: disp('一个简单的二重for循环'); : : result = ii *jj ; fprintf(' %d * %d = %d \n',ii,jj,re ...
- ABP文档 - Quartz 集成
文档目录 本节内容: 简介 安装 创建工作 调度工作 更多 简介 Quartz 是一个功能完整的开源工作调度系统,可用于最小的应用到一个大型的企业系统.Abp.Quartz 包简单地把Quartz集成 ...