地图与定位

来源:互联网 发布:淘宝账号出现安全问题 编辑:程序博客网 时间:2024/05/22 06:26

一 地图和定位的简介

1 主要应用场景:

—-> 1.1 周边:找餐馆、找KTV、找电影院等等(大众点评, 美团网)
—-> 1.2 导航:根据用户设定的起点和终点,进行路线规划,并指引用户如何到达(百度地图, 高德地图)

二 实现该功能的必要条件

1. 在iOS开发中,要想加入定位和地图两大功能,必须基于2个框架进行开发

—-> 1.1 CoreLocation(该篇着重介绍)
—-> 1.2 MapKit (下篇做介绍)

三 框架的讲解思路

1 地理定位 : 定位用户所在的位置, 获取对应的经纬度或者海拔等信息

2 地理编码 :

—-> 2.1 地理编码 : 南昌市青山湖区顺外路—–>113.381048 , 23.138369(数字是随便写的) : 地理编码
—-> 2.2 反地理编码 : 113.381048 , 23.138369(数字是随便写的)—-> 南昌市青山湖区顺外路 : 反地理编码

3 区域监听 : 事先在APP内部通过代码,指定一个区域, 那么当用户进入或离开区域的时候, 我们都可以监听到.

四 该部分需要知道的专业术语

1 LBS(Location Based Service) : 基于位置的服务

2 SoLoMo :Social Local Mobile(索罗门):

—-> 2.1 社交化 :在APP里面加入一些社交元素
—-> 2.1 本地化 : 基于LBS的周边搜索, 周边签到等服务
—-> 2.3 移动化 :1>移动网 : 3G/4G网, 相对于有线/无线电脑网络 2>移动app : 相对于”桌面应用”

五 iOS8.0之前的定位(了解即可)

1 只需要了解的原因 :

—-> 1.1 iOS8.0之前的版本慢慢即将被淘汰, 不再做适配
—-> 1.2 只要iOS8.0以后的定位功能实现, 那么直接把代码跑到iOS8.0之前的设备上, 依然是可以运行的, 不需要做任何修改
—-> 1.3 因为系统版本和XCode版本原因, 暂时没法安装iOS8.0之前的模拟器进行测试

2 前台定位

—-> 2.1 包含头文件 import CoreLocation
—-> 2.2 创建位置管理者并且设置代理
//懒加载位置管理者    private lazy var location : CLLocationManager = {        //创建位子管理者        let location = CLLocationManager()        //设置代理        location.delegate = self        //返回位置管理者        return location    }()
—-> 2.3 开始定位 : (这里设计点击屏幕就开始定位)
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {    //开始定位        location.startUpdatingLocation()}
—-> 2.4 采用代理方法实现定位
extension ViewController : CLLocationManagerDelegate {    //当获取到用户的位置信息的时候会调用这个方法    func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {        print("定位到了")        //如果只想获取一次用户位置,可以在获取到位置信息之后,停止获取        manager.stopUpdatingLocation()    }}

3 startUpdatingLocation的注意点

—-> 3.1 如果想要使用位置管理者来开始实现某一个功能:start
—-> 3.2 如果想停止这个功能 : stop
—-> 3.3 一旦调用了这个方法,就会不断的获取用户的位置信息
—-> 3.4 在ios6.0之后,如果想要获取用户的隐私(照片,通信),系统会主动弹框让用户授权
—-> 3.5 一旦用户选择了don’t allow 意味着再也无法获取用户的位置信息.除非用户到设置界面设置允许你的app来获取我的位置
—-> 3.6 为了提高用户点击允许的几率,一般是在plist里面配置一个key,并且写上一个为何获取这个位置的段子Privacy - Location Usage Description

这里写图片描述

4 后台定位

—-> 4.1 基于ios8.0之前的前台定位前提下,我们只需要做一下设置中的一种就可以
—-> 4.2 配置Xcode后台设置

这里写图片描述
这里写图片描述

—-> 4.3 在info.plist文件中配置

这里写图片描述

5 iOS8.0之前的后台定位常见错误

—-> 5.1 定位不到, 对应的代理方法不执行
———> 5.1.1 检查运行的模拟器是否是iOS8.0之前的系统版本
———> 5.1.2 检查模拟器是否设置位置数据
———> 5.1.3 确保代码无问题(一般都是代理没有设置,或者位置管理器对象是局部变量)
———> 5.1.4 可能是模拟器BUG, 请将模拟器位置设为None,然后再次设置数据; 或者,重置模拟器

六 ios8.0之后的定位

1 ios8.0之后的前台定位

—-> 1.1 同样包含头文件import CoreLocation
—-> 1.2 创建位置管理者
//懒加载    private lazy var location : CLLocationManager = {       //创建位置管理者        let location = CLLocationManager()        //设置代理        location.delegate = self        location.requestWhenInUseAuthorization()        //返回        return location    }()
—-> 1.3 同样在代理方法中实现定位
extension ViewController : CLLocationManagerDelegate {    func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {        print("定位到了")    }}
—–> 1.4 点击屏幕开始定位
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {        //点击调用        location.startUpdatingLocation()    }
—-> 1.5 注意点
——–> 5.1.1 在ios8.0之后,当需要获取用户的位置信息时,系统不再主动弹框让用户进行授权
——–> 5.1.2 如果想要获取用户的位置信息,需要主动请求授权
——–> 5.1.3 请求前台定位(默认情况下,只能在前台获取用户的位置信息)
——–> 5.1.4 一定要在info.plist中配置对应的key(点击进入requestWhenInUseAuthorization可以找到key值)
——–> 5.1.5 不要忘记做版本适配

这里写图片描述

2 常见错误(如iOS8.0之前的后台定位常见错误)

3 ios8.0之后的后台定位

—-> 3.1 后台定位方案一 : 在前台定位的基础上, 勾选后台模式location updates

这里写图片描述

—-> 3.2 达到的预想效果 : 当APP退到后台, 会出现一个蓝条, 不断提醒用户,正在定位
—-> 3.3 后台定位方案二 : 在定位时, 直接请求前后台定位授权, 并在info.plist文件中配置对应的key

这里写图片描述

—-> 3.4 达到的预想效果 : 无论是否勾选后台模式, 都可以获取位置信息. 而且无论前后台, 都不会出现蓝条

4 ios8.0前后台定位测试环境 :

—-> 4.1 XCode版本无要求
—-> 4.2 模拟器选择iOS8.0之后, iOS9.0之前的版本

七 ios9.0之后的定位

1 ios9.0前台定位

—-> 1.1 和iOS8.0之后一致,没有变化(只要注意相关设置即可)

2 ios9.0后台定位

—-> 2.1 后台定位方案一 : 在前台定位授权的基础上,如果勾选了后台模式location updates之后, 还需要额外设置属性allowsBackgroundLocationUpdates = true;
—-> 2.2 在后台获取用户信息的时候,依旧会在屏幕的顶部显示蓝条提醒用户app在时时的获取用户的位置信息
—-> 2.3 当点击了这个蓝条,会打开对应的app
—-> 2.4 后台定位方案二 : 直接请求前后台定位授权的情况, 和iOS8.0之后一致, 没有变化

3 注意 : 在前台定位授权的情况下,如果使用代码允许了后台定位,必须开启后台模式,否则程序会崩溃

—-> 3.1 错误信息

这里写图片描述

4 可能会遇到的测试问题

—-> 4.1 如果在测试的时候,获取不到位置,是模拟器的问题,因为模拟器是没有位置的

5 代码

—-> 5.1 导入头文件import CoreLocation
—-> 5.2 创建位置管理者
class ViewController: UIViewController {    private lazy var location : CLLocationManager = {       let location = CLLocationManager()        location.delegate = self        if #available(iOS 8.0, *){            location.requestWhenInUseAuthorization()        }        if #available(iOS 9.0, *){        location.allowsBackgroundLocationUpdates = true        }        return location    }()
—-> 5.3 代理方法
extension ViewController : CLLocationManagerDelegate {    func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {        print("定位到了")    }}
—-> 5.4 开始定位
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {        location.startUpdatingLocation()    }

八 监听用户授权状态

1 实现CLLocationManagerDelegate的代理方法

func locationManager(manager: CLLocationManager, didChangeAuthorizationStatus status: CLAuthorizationStatus) {    //判断用户决定代码}

2 各个授权对应的含义 :

        NotDetermined // 用户未决定        Restricted // 受限制        Denied // 用户拒绝        AuthorizedAlways // 前后台定位授权        AuthorizedWhenInUse // 前台定位授权

3 代理方法中模拟用户选择的状态代码块

//switch判断        switch status {        case .NotDetermined :            print("用户未决定")        case .Restricted :            print("受限制")        case .Denied :            if CLLocationManager.locationServicesEnabled() {                print("用户正在拒绝")                //如果定位服务开启,用户拒绝了,系统不会自动弹框,需要手动给用户提示                if #available(iOS 8.0, *) {                    let url = NSURL(string: UIApplicationOpenSettingsURLString)!                    if UIApplication.sharedApplication().canOpenURL(url){                        UIApplication.sharedApplication().openURL(url)                    }                }else {                        //准备多张图片,用来引导用户去设置界面允许开启定位服务                }            } else {                print("定位服务关闭,建议打开定位服务")                //如果定位服务关闭,用户下次再打开时候,系统会自动弹框,让用户去设置界面打开定位服务            }        case .AuthorizedAlways :            print("前后台定位授权")        case .AuthorizedWhenInUse :            print("前台定位授权")        }    }

4 定位失败也会调用代理方法

//该方法定位失败的时候就会调用error失败信息 CLLocationManager位置管理者    func locationManager(manager: CLLocationManager, didFailWithError error: NSError) {    }

5 可能会用到的额外参数

—-> 5.1 distanceFilter
/*        1 设置每个多少米定位一次?            1.1 一次            1.2 111km / 100次        2 当距离大于100米的时候回调用一次,获取用户的位置信息        */        location.distanceFilter = 100
—-> 5.2 desiredAccuracy
/*        1 定位精确度高,定位越准确,越耗电        2 一般情况下,在能够满足条件情况下,使用精确度比较低的        3 一旦定位到用户的位置之后,如果不需要用户的位置了,建议关闭获取用户位置        */        location.desiredAccuracy = kCLLocationAccuracyBest

6 开发经验

—-> 6.1 定位本身就非常耗电, 定位的精确度越高, 越耗电, 定位时间越长
—-> 6.2 为了省电, 尽量在满足需求的情况下低精确度

7 ios9.0新出的API

if #available(iOS 9.0, *) {            location.requestLocation()        }
—-> 7.1 根据精确度来进行定位,先从最低的精度开始定位,直到定位到最好的,之后返回
—-> 7.2 如果在定位的过程中超时了,那么会返回指定定位到的那个位置,并且只会执行一次
—-> 7.3 该方法不能和stopUpdatingLocation一起用

九 CLLocation对象的使用

1 属性详解 :

—-> 1.1 coordinate : 当前位置所在的经纬度数据(苹果官方解释 : Returns the coordinate of the current location.)
—-> 1.2 altitude : 海拔(苹果官方解释 : Returns the altitude of the location. Can be positive (above sea level) or negative (below sea level).)–> 可以是整数也可以是负数
—-> 1.3 speed : 当前速度 (苹果官方解释 : Returns the speed of the location in m/s. Negative if speed is invalid.)–> 负数是无效的
—-> 1.4 course : 航向(设备移动的方向, 值域范围:0.0 ~ 359.9, 正北方向为0.0)(苹果官方解释 :0.0 - 359.9 degrees, 0 being true North)

2 重要函数 : Returns the lateral distance between two locations.(返回横向两者的距离(物理距离))

func distanceFromLocation(location: CLLocation) -> CLLocationDistance

3 开发经验 :

—-> 3.1 使用之前, 务必判断数据是否有效 : 代码 (判断数据是否可用)
if location.horizontalAccuracy < 0 {return}
—-> 3.2 功能: 如果水平精确度小于零, 代表虽然可以获取位置对象, 但是数据错误, 不可用

4 实例演练 :打印当前用户的行走方向,偏离角度以及对于的行走距离(例如 : 北偏东 30度方向 移动了8米)

—-> 4.1 创建位置管理者
//懒加载    private lazy var location :CLLocationManager = {       //创建位置管理者        var location = CLLocationManager()        //设置代理        location.delegate = self        if #available(iOS 8.0, *) {location.requestAlwaysAuthorization()}        location.desiredAccuracy = kCLLocationAccuracyBest        return location    }()
—-> 4.2 设置一个属性记录用户上一个位置
//定义一个属性用来记录用户的上一个位置    private var lastLocation : CLLocation?
—-> 4.3 实现代理方法
func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {        //在位置数组中,最后一个是最新的        //取出位置        guard let location = locations.last else{return}        //判断位置是否可用        if location.horizontalAccuracy < 0 {return}        //1.确定航向        if location.course < 0 {return}        let angleStrs = ["北偏东","东偏南","南偏西","西偏北"]        //当前偏移方向        let index = Int(location.course / 90)        //取出数组中的方向        var angleStr = angleStrs[index]        //2.确定偏移角度        let angle = location.course % 90        //判断角度        if Int(index) == 0 {            let index = angleStr.startIndex.advancedBy(1)            angleStr = "正" + angleStr.substringToIndex(index)        }        //3.确定移动的距离        let lastLoc = lastLocation ?? location        //计算出两个点之间的物理距离        let distance = location.distanceFromLocation(lastLoc)        //赋值        lastLocation = lastLoc        //4.拼接字符串,打印距离        if Int(index) == 0 {            print("\(angleStr),移动了\(distance)米")        } else {            print("\(angleStr) \(angle)度,移动了\(distance)米")        }        print("定位到了")    }
—-> 4.4 进行相关配置(上面都已经说明了)

5 经验小结

—-> 5.1 定位的应用场景
——–> 5.1.1 导航
——–> 5.1.2 电商APP,获取用户所在城市(需要与(反)地理编码联合使用)
——–> 5.1.3 数据采集用户信息(例如,统计app使用分布)
——–> 5.1.4 查找周边(周边好友, 周边商家等等)
—-> 5.2 开发经验(由于定位非常耗电; 所以为了给用户省电, 你可以遵守以下小经验)
——–> 5.2.1 不需要获取用户位置时,一定要关闭定位服务:
——–> 5.2.2 如果可以,尽可能使用低精度的desiredAccuracy
——–> 5.2.3 如果是数据采集,(一般都是周期性的去轮询用户位置),在轮询期间一定要关闭定位

十 指南针(了解)

1 实现思路 :

—-> 1.1 利用”磁力计”传感器,获取设备朝向
—-> 1.2 根据设备朝向反向旋转”指南针”图片

2 代码实现

—-> 2.1 在storyboard中设置指南针图片,并且通过拖线的方式拿到该对象
//指南针    @IBOutlet weak var compassImageView: UIImageView!
—-> 2.2 导入头文件
import CoreLocation
—-> 2.3 懒加载位置管理者
//懒加载    private lazy var location : CLLocationManager = {        //创建位置管理者        var location = CLLocationManager()        //设置代理        location.delegate = self        //返回位置管理者        return location    }()
—-> 2.4 实现代理方法
//代理方法的实现extension ViewController : CLLocationManagerDelegate {    func locationManager(manager: CLLocationManager, didUpdateHeading newHeading: CLHeading) {        //判断朝向是否可用        if newHeading.headingAccuracy < 0 {return}        //获取朝向设备和角度        let magneticHeading = newHeading.magneticHeading        //将角度转化为弧度        let  radian = CGFloat(magneticHeading / 180 * M_PI)        //反转图片弧度        UIView.animateWithDuration(0.25) { () -> Void in            self.compassImageView.transform = CGAffineTransformMakeRotation(-radian)        }    }}
—-> 2.5 判断设置是否可用
override func viewDidLoad() {        super.viewDidLoad()        //判断设备是否可以用        if CLLocationManager.headingAvailable() { //可用            location.startUpdatingHeading()        } else { //不可用            SVProgressHUD.showErrorWithStatus("指南针不可用,请更换手机")        }    }

3 注意事项

—-> 3.1 获取设备朝向前, 先判断”磁力计”是否可用
—-> 3.2 获取朝向信息前, 判断当前朝向信息是否有效
—-> 3.3 注意”设备朝向”与”航向”的区别
—-> 3.4 使用”磁力计”传感器获取设备朝向, 不需要请求用户授权

4 测试环境

—-> 4.1 XCode版本无要求(建议:XCode7.0+ 不需要开发者账号也可以进行真机调试)
—-> 4.2 必须要求真机设备(只有真机设备才有”磁力计”传感器)

十一 区域监听(了解)

1 概念 :

—-> 1.1 区域 : 就是指划定的一块地域范围(比如圆形区域, 则由区域中心, 和半径组成)
—-> 1.2 区域监听 : 是指,我们通过代码指定一个区域, 然后当用户持握设备进入或者离开指定区域, 我们都能监听到.

2 注意事项 :

—-> 2.1 想要做区域监听, 在iOS8.0之后, 必须请求位置授权
—-> 2.2 原因 : 区域监听的原理就是获取用户的位置, 然后在判断该位置是否在制定区域内, 所以会涉及到用户隐私(位置), 而在iOS8.0之后, 想要访问用户位置信息, 就需要主动请求授权;

3 代码 :

—-> 3.1 在storyboard中设置一个label,用来显示用户的区域状态
 @IBOutlet weak var noticeLabel: UILabel!
—-> 3.2 懒加载位置管理者
private lazy var location : CLLocationManager = {        //创建位置管理者        let location = CLLocationManager()        //设置代理        location.delegate = self        //允许前后台授权        location.requestAlwaysAuthorization()        //返回位置管理者        return location    }()
—-> 3.3 判断该区域是否可以被监听
override func viewDidLoad() {        super.viewDidLoad()        //判断该区域是否可以被监听        if CLLocationManager.isMonitoringAvailableForClass(CLCircularRegion) {            //创建区域            let center = CLLocationCoordinate2DMake(21.123, 123.456)            //设置半径            var  radius : CLLocationDistance = 10.0            //标识            let identify = "肖锋区域"            //检测是否超过了最大的监听范围            if radius > location.maximumRegionMonitoringDistance {                //如果超过了范围,就让他等于最大值                radius = location.maximumRegionMonitoringDistance            }            let region = CLCircularRegion(center: center, radius: radius, identifier: identify)            //监听区域//            location.startMonitoringForRegion(region)            location.requestStateForRegion(region)        }    }
—-> 3.4 代理方法实现
extension ViewController : CLLocationManagerDelegate {    //离开区域    func locationManager(manager: CLLocationManager, didExitRegion region: CLRegion) {       print("您已经离开该区域")    }     //进入区域    func locationManager(manager: CLLocationManager, didEnterRegion region: CLRegion) {         print("您已经进入该区域")    }    //区域状态发生改变    func locationManager(manager: CLLocationManager, didDetermineState state: CLRegionState, forRegion region: CLRegion) {        //判断状态        switch state {            case .Unknown:            noticeLabel.text = "不知道"            case .Inside:            noticeLabel.text = "进入"            case .Outside:            noticeLabel.text = "离开"        }    }
—-> 3.5 进行info.plist相关配置NSLocationAlwaysUsageDescription
—-> 3.6 模拟器配置 : 将模拟器调整到Debug–>Location –> None–> 将设置的区域填入精度和纬度中

4 常见问题

—-> 4.1 区域监听, 测试没有效果?
——–> 4.1.1 首先, 确定代码没有问题, 是否有请求授权;
——–> 4.1.2 其次, 尝试修改模拟器位置信息, 触发进入区域或离开区域的动作
——–> 4.1.3 最后, 如果模拟器出现BUG, 定位不到, 也会无法判定当前区域状态; 所以, 最后可以尝试重置模拟器.

十二 地理编码和反地理编码

1 概念 :

—-> 1.1 地理编码 : 是指根据地址关键字, 将其转换成为对应的经纬度等信息;
—-> 1.2 反地理编码 : 是指根据经纬度信息, 将其转换成为对应的省市区街道等信息;

2 具体实现步骤 :

—-> 2.1 导入CoreLocation框架以及对应的主头文件
—-> 2.2 创建CLGeocoder对象
—-> 2.3 根据地址关键字, 进行地理编码 (地理编码)
—-> 2.3 根据经纬度信息, 进行反地理编码 (反地理编码)

3 测试环境

—-> 3.1 必须连网
—-> 3.2 XCode版本不限
—-> 3.2 iOS模拟器系统版本不限

4 具体事例代码 :

—-> 4.1 storyboard中相关设置

这里写图片描述

—-> 4.2 导入头文件import CoreLocation
—-> 4.3 通过拖线的方式拿到storyboard中相关对象
    //输入的view    @IBOutlet weak var addressTV: UITextView!    //经度    @IBOutlet weak var longitudeTF: UITextField!    //纬度    @IBOutlet weak var latitudeTF: UITextField!
—-> 4.4 懒加载CLGeocoder对象
//懒加载    private lazy var geoc : CLGeocoder = {        return CLGeocoder()    }()
—-> 4.5 地理编码
//地理编码    @IBAction func geocodingBtnClick()    {        let address = addressTV.text        geoc.geocodeAddressString(address) { (clplas :[CLPlacemark]?,error : NSError?) -> Void in            if error == nil {                //对CLPlacemark的解析                //1. 获取地标对象,取第一个,相关度最高                guard let clplas = clplas else {return}                guard let clpl = clplas.first else {return}                //2. 设置地址                self.addressTV.text = clpl.name!                //设置经度和纬度 (coordinate:当前位置)                self.longitudeTF.text = "\(clpl.location!.coordinate.longitude)"                self.latitudeTF.text = "\(clpl.location!.coordinate.latitude)"            }        }    }
—-> 4.6 反地理编码
//反地理编码    @IBAction func reverGeocodingBtnClick()    {        //获取位置的经度和纬度数据        let latitude = CLLocationDegrees(self.latitudeTF.text!)        let longitude = CLLocationDegrees(self.longitudeTF.text!)        let location = CLLocation(latitude: latitude!, longitude: longitude!)        geoc.reverseGeocodeLocation(location) { (clplas : [CLPlacemark]?,error : NSError?) -> Void in            if error == nil {                //1. 获取地标对象,取第一个,相关度最高                guard let clplas = clplas else {return}                guard let clpl = clplas.first else {return}                //2. 设置地址                self.addressTV.text = clpl.name!                //设置经度和纬度 (coordinate:当前位置)                self.longitudeTF.text = "\(clpl.location!.coordinate.longitude)"                self.latitudeTF.text = "\(clpl.location!.coordinate.latitude)"            }        }    }

5 常见问题 : 测试无数据?

—-> 5.1 首先, 检查是否有联网;
—-> 5.2 其次, 如果是反地理编码,可尝试更换经纬度再次尝试, 有的经纬度没有对应信息

6 该功能具体应用场景

—-> 6.1 发表说说/发微博时来自哪里
—-> 6.2 美团或者大众点评获取用户所在区域

7 定位 + 反地理编码运用(该部分我只讲代码实现写上,具体怎么实现的,大家应该一看就明白)

import UIKitimport CoreLocationclass ViewController: UIViewController {   //懒加载(一)    private lazy var location : CLLocationManager = {       //创建位置管理者        let location = CLLocationManager()        //设置代理        location.delegate = self        //始终获取用户位置        location.requestAlwaysAuthorization()        //返回        return location    }()    //懒加载(二)    private lazy var geco : CLGeocoder = {        return CLGeocoder()    }()    //当点击屏幕的时候开始获取用户的位置    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {        location.startUpdatingLocation()    }}//实现代理方法extension ViewController : CLLocationManagerDelegate {    func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {        //获取用户位置是否可用        guard let location = locations.last else {return}        //判断位置是否可用        if location.horizontalAccuracy < 0 {return}        //获取经度和纬度进行反地理编码        geco.reverseGeocodeLocation(location) {(clplas : [CLPlacemark]?,error : NSError?) -> Void in            //判断错误信息            if error == nil {                guard let clplas = clplas else {return}                guard let clpl : CLPlacemark = clplas.first else {return}                //打印地址                print(clpl.name!)            }        }    }}

十三 使用给第三方框架进行定位

1 使用原因 : 因为使用CoreLocation框架进行获取用户位置信息, 是通过代理进行回调; 而第三方框架将”代理模拟”转换成为”block模式”; 使用起来比较方便, 而且额外增加了超时时间等功能.

2 框架名称 : locationManager

3 框架地址 : https://github.com/intuit/LocationManager

4 注意事项 : 一般集成第三方框架到项目中, 请先确保该框架没有问题, 然后再向项目中集成(导入的时候预先编译下)

5 代码 :

—-> 5.1 获取单例 :
let locationMan = INTULocationManager.sharedInstance()
—-> 5.2 获取一次用户信息
// 获取一次用户信息        let locationRequestID : INTULocationRequestID = locationMan.requestLocationWithDesiredAccuracy(.Room, timeout: 5, delayUntilAuthorized: false) { (location : CLLocation!, _,status : INTULocationStatus) -> Void in            //判断            if status == INTULocationStatus.Success {               print("获取到位置")            } else {                print(status.rawValue)            }        }
—-> 5.3 一直获取用户位置信息
let LocationRequestID: INTULocationRequestID = locationMan.subscribeToLocationUpdatesWithDesiredAccuracy(.Room) { (location : CLLocation!, _,status : INTULocationStatus) -> Void in            if status == INTULocationStatus.Success {                print("获取到位置")            } else {                print(status.rawValue)            }        }

6 其它具体实现请参照该框架对应的 readME

十四 总结

1 地图与定位,知识点还是相对比较简单的,功能也容易实现,不求能理解,只要能运用就行.开发过程中的情况我都写在里面了,希望大家还是抽时间看一下.

2 最后,大家如果觉得我写的博客还行,麻烦大家多多关照,有什么问题可直接给我留言,我一定尽可能的解答,谢谢!!!!

1 0
原创粉丝点击