【移动应用开发技术】iOS中如何获取地理位置及设置plist_第1页
【移动应用开发技术】iOS中如何获取地理位置及设置plist_第2页
【移动应用开发技术】iOS中如何获取地理位置及设置plist_第3页
【移动应用开发技术】iOS中如何获取地理位置及设置plist_第4页
【移动应用开发技术】iOS中如何获取地理位置及设置plist_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

【移动应用开发技术】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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论