iOS中的地理位置的获取及plist设置方法

2020-01-21 04:53:58王振洲

代码示例


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,开始监听之后,当状态改变成允许的状态时,会直接进入监听状态,不必再次调用startUpdateingLocation


func 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
 //kCLLocationAccuracyThreeKilometers

7.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) -> CLLocationDistance