本文并非最终版本,如果想要关注更新或更正的内容请关注文集,联系方式详见文末,如有疏忽和遗漏,欢迎指正。


本文相关目录:

================== 所属文集:【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(如果觉得文章太长,请阅读此平台发布的文章)

【代码托管平台】

Github

【如有疑问,请通过以下方式交流】

评论区回复

发送邮件shorfng@126.com

本文版权归作者和本网站共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,谢谢合作。


如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
  • 支付宝扫一扫 向我打赏

  • 你也可以微信 向我打赏

【iOS】7.4 定位服务->2.1.3.1 定位 - 官方框架CoreLocation 功能1:地理定位的更多相关文章

  1. 【iOS】7.4 定位服务->2.1.3.2 定位 - 官方框架CoreLocation 功能2:地理编码和反地理编码

    本文并非最终版本,如果想要关注更新或更正的内容请关注文集,联系方式详见文末,如有疏忽和遗漏,欢迎指正. 本文相关目录: ================== 所属文集:[iOS]07 设备工具 === ...

  2. 【iOS】7.4 定位服务->2.1.3.3 定位 - 官方框架CoreLocation 功能3:区域监听

    本文并非最终版本,如果想要关注更新或更正的内容请关注文集,联系方式详见文末,如有疏忽和遗漏,欢迎指正. 本文相关目录: ================== 所属文集:[iOS]07 设备工具 === ...

  3. 【iOS】7.4 定位服务->2.1.1 定位 - 官方框架CoreLocation: 请求用户授权

    本文并非最终版本,如果想要关注更新或更正的内容请关注文集,联系方式详见文末,如有疏忽和遗漏,欢迎指正. 本文相关目录: ================== 所属文集:[iOS]07 设备工具 === ...

  4. 【iOS】7.4 定位服务->2.1.2 定位 - 官方框架CoreLocation: CLLocationManager(位置管理器)

    本文并非最终版本,如果想要关注更新或更正的内容请关注文集,联系方式详见文末,如有疏忽和遗漏,欢迎指正. 本文相关目录: ================== 所属文集:[iOS]07 设备工具 === ...

  5. 【iOS】7.4 定位服务->2.1.4 定位 - 官方框架CoreLocation 案例:指南针效果

    本文并非最终版本,如果想要关注更新或更正的内容请关注文集,联系方式详见文末,如有疏忽和遗漏,欢迎指正. 本文相关目录: ================== 所属文集:[iOS]07 设备工具 === ...

  6. IOS CoreLocation框架的使用(用于地理定位)

    ●  在移动互联网时代,移动app能解决用户的很多生活琐事,比如 ●  导航:去任意陌生的地方 ●  周边:找餐馆.找酒店.找银行.找电影院 ●  在上述应用中,都用到了地图和定位功能,在iOS开发中 ...

  7. 【iOS】7.4 定位服务->3.1 地图框架MapKit 功能1:地图展示

    > 本文并非最终版本,如果想要关注更新或更正的内容请关注文集,联系方式详见文末,如有疏忽和遗漏,欢迎指正. --- > 本文相关目录: ================== 所属文集:[[ ...

  8. 【iOS】7.4 定位服务->3.2 地图框架MapKit 功能2:路线规划(导航)

    本文并非最终版本,如果想要关注更新或更正的内容请关注文集,联系方式详见文末,如有疏忽和遗漏,欢迎指正. 本文相关目录: ================== 所属文集:[iOS]07 设备工具 === ...

  9. 【iOS】7.4 定位服务->3.3 地图框架MapKit 功能3:3D视图

    本文并非最终版本,如果想要关注更新或更正的内容请关注文集,联系方式详见文末,如有疏忽和遗漏,欢迎指正. 本文相关目录: ================== 所属文集:[iOS]07 设备工具 === ...

随机推荐

  1. UWP开发技巧:实现SMB协议操作文件服务器文件

    问题来源 文件服务器文件夹操作在PC与Surface端确实还是和传统操作一样没什么区别,但是到了手机端与Surface Hub就没那么方便了,因为文件资源管理器Explorer根本没法添加网路硬盘.对 ...

  2. 应用程序初次运行数据库配置小程序(Java版)

    应用程序初始化数据库配置小程序 之前写过一个Java版的信息管理系统,但部署系统的时候还需要手动的去配置数据库和导入一些初始化的数据才能让系统运行起来,所以我在想是不是可以写一个小程序在系统初次运行的 ...

  3. iOS-直播开发(开发从底层做起)

    一直在忙, 也没写过几次播客! 但一直热衷于直播开发技术, 公司又不是直播方向的, 所以就年前忙里偷袭研究了一下直播开发, 然后翻阅了很多大神的技术博客等, 写了一个简单的Demo, 又根据网上大神们 ...

  4. 一个想法(续三):一份IT技术联盟创业计划书,开启众筹创业征程

    写在创业计划书之前的话: 昨天在闪存里我@了dudu,说:我要借钱,不久dudu回了我:傍个富婆. 当然,dudu以为我是玩笑,其实,我的确是开玩笑的,哈. 不过我正在执行一个创业计划,如果启动,我会 ...

  5. ArcGIS Pro 简明教程(4)工具和模型构建器

    ArcGIS Pro 简明教程(4)工具和模型构建器 by 李远祥 工具箱中的工具 ArcGIS Pro 在1.3版本基本上已经继承了ArcMap的所有工具,而且会不断加入一些它自身才有的工具,例如适 ...

  6. JAVA文件名命名规范

    JAVA语言,有严格的大小写区分要示. JAVA源文件名必须符合以下规则: 1.必须以.java结尾.这样才能被编辑器javac.exe所编辑. 2.源文件中如果只有一个类,文件名必须与该类名相同. ...

  7. php数组排序

    sort() - 以升序对数组排序rsort() - 以降序对数组排序asort() - 根据值,以升序对关联数组进行排序ksort() - 根据键,以升序对关联数组进行排序arsort() - 根据 ...

  8. iOS Foundation框架 -1.常用结构体的用法和输出

    1.安装Xcode工具后会自带开发中常用的框架,存放的地址路径是: /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.plat ...

  9. Swift 2.2 最基本的多线程

    昨天晚上苹果召开了发布会,第二天除了知道 iPhone SE 和 IOS9.3 之外,你还记住了什么,这一天还是老样子,继续着我们的Swift的基本学习,但出现了许多的警告,进去看看文档宝宝才知道 S ...

  10. Python学习--21 电子邮件

    发送邮件 SMTP是发送邮件的协议,Python内置对SMTP的支持,可以发送纯文本邮件.HTML邮件以及带附件的邮件. Python对SMTP支持有smtplib和email两个模块,email负责 ...