版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
【移动应用开发技术】iOS中如何获取地理位置及设置plist
在下给大家分享一下iOS中如何获取地理位置及设置plist,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!1、在前台的时候获取地理位置信息ios8/9在info.plist中配置NSLocationWhenInUseUsageDescription的值,否则上面的方法无效调用.requestWhenInUseAuthorization()获取前台获取地理位置权限调用.startUpdatingLocation()代码示例class
ViewController:
UIViewController
{
lazy
var
locateM
:
CLLocationManager
=
{
let
locate
=
CLLocationManager()
locate.delegate
=
self
locate.requestWhenInUseAuthorization()
return
locate
}()
override
func
touchesBegan(touches:
Set<UITouch>,
withEvent
event:
UIEvent?)
{
self.locateM.startUpdatingLocation()
}
}
extension
ViewController
:
CLLocationManagerDelegate{
func
locationManager(manager:
CLLocationManager,
didUpdateLocations
locations:
[CLLocation])
{
print("位置信息已经更新")
}
}2、前后台获取,但是后台获取的时候,屏幕上方有蓝框提示用户正在后台获取ios8调用.requestWhenInUseAuthorization()获取前台获取地理位置权限在info.plist中配置NSLocationWhenInUseUsageDescription的值,否则上面的方法无效设置Capabilities>BackgroundModes>LocationUpdates打对勾调用.startUpdatingLocation()ios9调用.requestWhenInUseAuthorization()获取前台获取地理位置权限设置.allowsBackgroundLocationUpdates=true(ios9需要执行)在info.plist中配置NSLocationWhenInUseUsageDescription的值,否则上面的方法无效设置Capabilities>BackgroundModes>LocationUpdates打对勾(如果第二步做了,此步没做,直接crash)调用.startUpdatingLocation()ios8/ios9可以后台蓝框定位的代码示例:class
ViewController:
UIViewController
{
lazy
var
locateM
:
CLLocationManager
=
{
let
locate
=
CLLocationManager()
locate.delegate
=
self
locate.requestWhenInUseAuthorization()
if
#available(iOS
9.0,
*)
{
locate.allowsBackgroundLocationUpdates
=
true
}
return
locate
}()
override
func
touchesBegan(touches:
Set<UITouch>,
withEvent
event:
UIEvent?)
{
self.locateM.startUpdatingLocation()
}
}
extension
ViewController
:
CLLocationManagerDelegate{
func
locationManager(manager:
CLLocationManager,
didUpdateLocations
locations:
[CLLocation])
{
print("位置信息已经更新")
}
}3、后台获取,后台获取的时候,屏幕上方无蓝框提示调用.requestAlwaysAuthorization()获取前台获取地理位置权限在info.plist中配置NSLocationAlwaysUsageDescription的值,否则上面的方法无效设置.allowsBackgroundLocationUpdates=true(ios9需要执行)设置Capabilities>BackgroundModes>LocationUpdates打对勾(本步骤在ios8中可以不做设置,但是在ios9中如果第三步做了,而此步没有做,直接crash)调用.startUpdatingLocation()代码示例class
ViewController:
UIViewController
{
lazy
var
locateM
:
CLLocationManager
=
{
let
locate
=
CLLocationManager()
locate.delegate
=
self
locate.requestAlwaysAuthorization()
if
#available(iOS
9.0,
*)
{
locate.allowsBackgroundLocationUpdates
=
true
}
return
locate
}()
override
func
touchesBegan(touches:
Set<UITouch>,
withEvent
event:
UIEvent?)
{
self.locateM.startUpdatingLocation()
}
}
extension
ViewController
:
CLLocationManagerDelegate{
func
locationManager(manager:
CLLocationManager,
didUpdateLocations
locations:
[CLLocation])
{
print("位置信息已经更新")
}
}4、权限改变的通知注意:在Denied或者NotDetermined的状态下startUpdatingLocation,开始监听之后,当状态改变成允许的状态时,会直接进入监听状态,不必再次调用startUpdateingLocationfunc
locationManager(manager:
CLLocationManager,
didChangeAuthorizationStatus
status:
CLAuthorizationStatus)
{
switch
status
{
case
.AuthorizedAlways:
print("始终")
case
.AuthorizedWhenInUse:
print("使用的时候")
case
.Denied:
print("拒绝")
if
CLLocationManager.locationServicesEnabled()
{
print("真拒绝了")
}else{
print("是关闭了定位服务")
}
case
.NotDetermined:
print("第一次,尚未决定")
case
.Restricted:
print("没有权限的")
}
}5、过滤距离很多时候我们需要监听函数只调用一次来获取用户当前的位置在监听函数中停止监听设置监听的过滤距离//如果监听器已经开启,此值修改之后立即生效
self.locateM.distanceFilter
=
100
//每100米,调用一次监听6、精度注意:越精确越耗电,定位的时间越长,如果要定位城市,没有必要选最精确的self.locateM.desiredAccuracy
=
kCLLocationAccuracyBest
//kCLLocationAccuracyBestForNavigation
//kCLLocationAccuracyBest
//kCLLocationAccuracyNearestTenMeters
//kCLLocationAccuracyHundredMeters
//kCLLocationAccuracyKilometer
//kCLLocationAccuracyThreeKilometers7.CLLocation详解public
var
coordinate:
CLLocationCoordinate2D
{
get
}
//经纬度
public
var
altitude:
CLLocationDistance
{
get
}
//海拔
public
var
horizontalAccuracy:
CLLocationAccuracy
{
get
}
//位置信息是否有效,如果为负数,则无效
public
var
verticalAccuracy:
CLLocationAccuracy
{
get
}
//海拔数据是否有效,如果为负数,则无效
public
var
course:
CLLocationDirection
{
get
}
//当前的角度(0-359.9)
public
var
speed:
CLLocationSpeed
{
get
}
//当前的速度
public
var
timestamp:
NSDate
{
get
}
//位置确定的时间戳
public
var
floor:
CLFloor?
{
get
}
//楼层(前提是已经注册的建筑),如果没有为nil
//计算两个经纬度之间的距离
public
func
distanceFromLocation(location:
CLLocation)
->
CLLocationDistance8、指南针小例子class
ViewController:
UIViewController
{
@IBOutlet
weak
var
mImageView:
UIImageView!
lazy
var
locateM
:
CLLocationManager
=
{
let
locate
=
CLLocationManager()
locate.delegate
=
self
locate.requestAlwaysAuthorization()
if
#available(iOS
9.0,
*)
{
locate.allowsBackgroundLocationUpdates
=
true
}
return
locate
}()
override
func
viewDidLoad()
{
super.viewDidLoad()
if(CLLocationManager.headingAvailable()){
self.locateM.startUpdatingHeading()
}else{
print("当前磁力计有问题")
}
}
}
extension
ViewController
:
CLLocationManagerDelegate{
func
locationManager(manager:
CLLocationManager,
didUpdateHeading
newHeading:
CLHeading)
{
//1.拿到当前设备对正朝向的角度
let
angle
=
newHeading.magneticHeading
//2.把角度转换成弧度
let
hudu
=
CGFloat(angle
/
180
*
M_PI)
//3.反向旋转照片
UIView.animateWithDuration(0.5)
{
self.mImageView.transform
=
CGAffineTransformMakeRotation(-hudu)
}
}
}9、区域的监听class
ViewController:
UIViewController
{
lazy
var
locateM
:
CLLocationManager
=
{
let
locate
=
CLLocationManager()
locate.delegate
=
self
locate.requestAlwaysAuthorization()
if
#available(iOS
9.0,
*)
{
locate.allowsBackgroundLocationUpdates
=
true
}
return
locate
}()
override
func
viewDidLoad()
{
super.viewDidLoad()
//首先应该判断当前是否可以监听某个区域
if
CLLocationManager.isMonitoringAvailableForClass(CLCircularRegion){
//1.创建区域
let
center
=
CLLocationCoordinate2DMake(21.123,
121.345)
var
distance
:
CLLocationDistance
=
1000
//限制监听的范围不能超过最大的范围
if
distance
<
locateM.maximumRegionMonitoringDistance{
distance
=
locateM.maximumRegionMonitoringDistance
}
let
region
=
CLCircularRegion(center:
center,
radius:
distance,
identifier:
"xiaoxiao")
//2.监听区域
self.locateM.startMonitoringForRegion(region)
//3.判断当前状态是否是在区域内还是区域外,
//在`didDetermineState`代理方法中获得结果
self.locateM.requestStateForRegion(region)
}
}
}
extension
ViewController
:
CLLocationManagerDelegate{
func
locationManager(manager:
CLLocationManager,
didEnterRegion
region:
CLRegion)
{
print("进入了区域"+region.identifier)
}
func
locationManager(manager:
CLLocationManager,
didExitRegion
region:
CLRegion)
{
print("出了区域"+region.identifier)
}
func
locationManager(manager:
CLLocationManager,
didDetermineState
state:
CLRegionState,
forRegion
region:
CLRegion)
{
//获取刚开始是否在区域内或者区域外
if
region.identifier
==
"xiaoxiao"{
switch
state
{
case
.Inside:
print("已经是区域内的")
case
.Outside:
print("没有在区域内")
case
.Unknown:
print("不清楚")
}
}
}
}10、地理编码与反地理编码地理编码let
geoCoder
=
CLGeocoder()
geoCoder.geocodeAddressString("广州")
{
(pls:[CLPlacemark]?,
error
:
NSError?)
in
if
error
==
nil{
print("地址编码成功")
print(pls?.last?.location)
}else{
print("错误
\(error)")
}
}打印地址编码成功Optional(<+23.12517800,+113.28063700>
+/-
100.00m
(speed
-1.00
mps
/
course
-1.00)
@
8/14/16,
9:49:22
PM
China
Standard
Time)反地理编码let
geoCoder
=
CLGeocoder()
geoCoder.reverseGeocodeLocation(CLLocation(latitude:23.125,longitude:
113.280))
{
(pls:[CLPlacemark]?,
error:NSError?)
in
if
error
==
nil{
print("地址反编码成功
城市:\(pls?.last?.locality)")
print(pls?.last?.addressDictionary)
}else{
print("错误
\(error)")
}
}打印地址反编码成功城市:Optional("Guangzhou")Optional([SubLocality:
Yuexiu,
Street:
Yunhai
Tongjin
No.11,
State:
Guangdong,
CountryCode:
CN,
Thoroughfare:
Yunhai
Tongjin
No.11,
Name:
Luo
Sangmeidi,
Country:
China,
FormattedAddressLines:
<__NSArrayM
0x7ff1da5652d0>(
Yunhai
Tongjin
No.11
Yuexiu,
Guangzhou,
Guangdong
China
)
,
City:
Guangzhou])注意同一个CLGeocoder对象,不能同时编码与反编码比如let
geoCoder
=
CLGeocoder()
geoCoder.geocodeAddressString("广州")
{
(pls:[CLPlacemark]?,
error
:
NSError?)
in
...
}
geoCoder.reverseGeocodeLocation(CLLocation(latitude:23.125,longitude:
113.280))
{
(pls:[CLPlacemark]?,
error:NSError?)
in
...
}这样只会打印第一个编码成功的结果11、CLPlacemark对象详解@NSCopying
public
var
location:
CLLocation?
{
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 高中世界区域地理省公开课一等奖全国示范课微课金奖课件
- 高考物理总复习第5章机械能及其守恒定律第1讲功和功率市赛课公开课一等奖省名师获奖课件
- 二年级上册语文园地二市公开课一等奖市赛课金奖课件
- 八年级物理上册3光现象复习省公开课一等奖新名师获奖课件
- 百善孝为先感恩父母主题班会省公开课一等奖全国示范课微课金奖课件
- 酒店供货合同格式
- 中考化学专题突破五物质的分类提分省公开课一等奖百校联赛赛课微课获奖课件
- 高二英语Moudle2-2-Reading省公开课金奖全国赛课一等奖微课获奖课件
- Unit4AviewofMountains省公开课金奖全国赛课一等奖微课获奖课件
- 二次结构劳务分包协议
- 部编版小学六年级语文下册二类词读音归纳
- 2022-2023学年河北省沧衡八校联盟高二(下)期中政治试卷(含解析)
- 电子物证专业考试复习题库(含答案)
- SpaceClaim.中文教程完整版
- 送达地址确认书(样本)
- 设计后期服务方案
- 烟月销售表格
- 泰康人寿保险客户入住养老社区确认函自选计划版样本_W
- lammp中文手册
- 一年级音乐下册 第5课《火车波尔卡》课件1 人音版.ppt
- 中国历史文化名城——北京英文版
评论
0/150
提交评论