iOS开发之定位

栏目: IOS · 发布时间: 6年前

内容简介:在iOS开发中,定位是很多App都需要使用的功能。本文主要对iOS中的定位知识点进行介绍。本文代码环境为:Xcode 10.1 + Swift 4.2。在iOS中,隐私保护特别好,凡事需要定位的时候,第一次必须弹出对话框给用户选择,一共有两种权限注意:上架的App这个原因必须写明确

在iOS开发中,定位是很多App都需要使用的功能。本文主要对iOS中的定位知识点进行介绍。本文代码环境为:Xcode 10.1 + Swift 4.2。

一、模块与常见类

  • 定位所包含的类都在CoreLocation模块中,所以必须导入import CoreLocation

  • CLLocation:表示某个位置的地理信息,比如经纬度、海拔等

  • CLLocationManager:定位管理器,可以理解为定位不能自己工作,需要有个管理者对它进行全过程监督。

  • CLGeocoder:地理编码,分为两种

    • 正向地理编码:根据位置信息,获取具体的经纬度等信息

    • 反向地理编码:根据给定的经纬度等信息,获取位置信息

  • CLPlacemark:位置信息,包含的信息如国家、城市、街道等

  • CLLocationManagerDelegate:定位代理,不管是定位成功与失败,都会有相应的代理方法回调

  • 具体的工作流程

    (1)CLLocationManager发起定位,定位成功或者失败都会回调CLLocationManagerDelegate中相应的代理方法

    (2)在成功的代理方法中获取 CLLocation 对象,进而获取经纬度

    (3)通过 CLGeocoder获取经纬度对应的位置信息CLPlacemark

    (4)通过CLPlacemark获取具体的位置信息

二、权限

在iOS中,隐私保护特别好,凡事需要定位的时候,第一次必须弹出对话框给用户选择,一共有两种权限

  • 使用时才定位权限,使用这种,必须走两步

    (1)程序中发起 requestWhenInUseAuthorization

    (2)在info.plist对应的位置写明申请权限的具体原因

  • 一直可以定位权限,使用这种,也是两步

    (1)程序中发起 requestAlwaysAuthorization

    (2)在info.plist对应的位置写明申请权限的具体原因

iOS开发之定位

权限原因填写

注意:上架的App这个原因必须写明确

三、模拟器定位

由于定位需要GPS,所以一般情况下,都需要真机进行测试,笔者在教学过程中,经常使用的是一种模拟定位,这种定位需要准备一个gpx 的文件,可以取名 XXX.gpx,里面的内容如下:

<gpx version="1.1"
creator="GMapToGPX 6.4j - http://www.elsewhere.org/GMapToGPX/"
xmlns="http://www.topografix.com/GPX/1/1"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd">


<wpt lat="31.2906511800" lon="118.3623587000">
<name>安徽商贸职业技术学院name>
<cmt>中国安徽省芜湖市弋江区文昌西路24号 邮政编码: 241002cmt>
<desc>中国安徽省芜湖市弋江区文昌西路24号 邮政编码: 241002desc>
wpt>gpx>

将自己的定位信息填写进xml对应的位置即可,然后选择Edit Scheme,在Options中选择自己的gpx 的文件,这样模拟器运行的时候就会读取该文件的位置信息。

iOS开发之定位

Edit Scheme

四、后台定位

如果你的App需要后台定位,可以这样做,首先在Capabilities中打开后台模式

iOS开发之定位

后台模式

前面说过定位权限分两种,针对这两种情况,后台定位的代码不一样,效果也不一样

  • 使用时才定位权限需要加上locationManager.allowsBackgroundLocationUpdates = true

    开启后台定位,而一直可以定位权限不需要写任何额外代码

  • 使用时才定位权限退出后,手机顶部会有蓝条提示,而一直可以定位权限则没有

iOS开发之定位

后台定位蓝条提醒

五、开发步骤与示例代码

  1. 导入CoreLocation模块

  2. 创建CLLcationManager对象,设置参数和代理,请求定位授权并配置info.plist

  3. 调用CLLcationManager对象的startUpdatingLocation方法进行定位

  4. 实现代理方法,在定位成功的方法中进行位置信息的处理

import UIKit
import CoreLocation

class ViewController: UIViewController {
//定位需要一个CLLocationManager
lazy var locationManager:CLLocationManager = CLLocationManager()

override func viewDidLoad() {
super.viewDidLoad()
setupManager()
}

func setupManager(){

//默认情况是这样的,每当位置改变时LocationManager就调用一次代理。通过设置distanceFilter可以实现当位置改变超出一定范围时LocationManager才调用相应的代理方法。这样可以达到省电的目的。
locationManager.distanceFilter = 300
//精度 比如为10 就会尽量达到10米以内的精度
locationManager.desiredAccuracy = kCLLocationAccuracyBest
//代理
locationManager.delegate = self
//第一种:能后台定位但是会在顶部出现大蓝条(打开后台定位的开关)
//允许后台定位
locationManager.allowsBackgroundLocationUpdates = true
locationManager.requestWhenInUseAuthorization()
//第二种:能后台定位并且不会出现大蓝条
//locationManager.requestAlwaysAuthorization()

}

override func touchesBegan(_ touches: Set , with event: UIEvent?) {

//发起位置更新(定位)会一直轮询,耗电
self.locationManager.startUpdatingLocation()
}

}


extension ViewController : CLLocationManagerDelegate{

//定位成功
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {

let location = locations.last
//地理编码的类
let gecoder = CLGeocoder()
if let location = location {
//反地理编码 转换成 具体的地址
gecoder.reverseGeocodeLocation(location) { (placeMarks, error) in
//CLPlacemark -- 国家 城市 街道
let placeMark = placeMarks?.first
if let placeMark = placeMark{
print("\(placeMark.country!) -- \(placeMark.name!) -- \(placeMark.locality!)")
}
}
}
self.locationManager.stopUpdatingLocation()
}

//定位失败
func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {
print(error)

}
}

六、代码运行效果

iOS开发之定位

运行效果


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Spark SQL内核剖析

Spark SQL内核剖析

朱锋、张韶全、黄明 / 电子工业出版社 / 2018-8 / 69.00元

Spark SQL 是 Spark 技术体系中较有影响力的应用(Killer application),也是 SQL-on-Hadoop 解决方案 中举足轻重的产品。《Spark SQL内核剖析》由 11 章构成,从源码层面深入介绍 Spark SQL 内部实现机制,以及在实际业务场 景中的开发实践,其中包括 SQL 编译实现、逻辑计划的生成与优化、物理计划的生成与优化、Aggregation 算......一起来看看 《Spark SQL内核剖析》 这本书的介绍吧!

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具