本文并不是最终版本,若是想要关注更新或更正的内容请关注文集,联系方式详见文末,若有疏忽和遗漏,欢迎指正。ios
本文相关目录:
================== 所属文集:【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 设备工具 ==================git
勾选后台模式,图解:
github
编译环境:Xcode 8.0
模拟器版本:iOS 10
Swift版本:3.0swift
#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
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() } }
编译环境:Xcode 8.0
模拟器版本:iOS 10
Swift版本:3.0微信
这里只贴主要代码,其他和代码2相同,详见文末 github 地址框架
#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; }
// 懒加载 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 }()
编译环境:Xcode 8.0
模拟器版本:iOS 10
Swift版本:3.0ide
这里只贴主要代码,其他和代码2相同,详见文末 github 地址工具
#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; }
// 懒加载 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
本文版权归做者和本网站共有,欢迎转载,但未经做者赞成必须保留此段声明,且在文章页面明显位置给出原文链接,谢谢合做。
支付宝扫一扫 向我打赏
你也能够微信 向我打赏