引用: import CoreLocation


// 如果是ios8.0以后, 在想请求用户的位置信息, 需要主动的请求授权, 系统不会再自动弹出一个窗口

lazy var locationM: CLLocationManager = {

let locationM = CLLocationManager()

locationM.delegate = self

// 请求的是前台定位授权

// 默认情况, 只能在前台获取用户位置信息 如果想想要在后台也获取用户位 那么必须勾选后台模式location updates


// 效果 在后台确实可以获取到位置信息, 但是屏幕上方会出现一个蓝色的横幅, 不断提醒用户, 当前APP 正在使用你的位置

if #available(iOS 8.0, *) {

locationM.requestWhenInUseAuthorization()

// 如果在ios9.0以后, 想要在后台获取用户位置,

// 如果当前的授权状态是前台定位授权, 那么你需要勾选后台模式 location updates, 还要额外的设置以下属性为true

// 注意: 如果设置这个属性为true, 那么必须勾选后台模式

if #available(iOS 9.0, *) {

locationM.allowsBackgroundLocationUpdates = true

}

// 前后台定位授权

// 如果当前的授权状态是前后台定位授权, 那么默认情况下, 就可以在后台获取用户位置信息, 不需要勾选后台模式location updates

// locationM.requestAlwaysAuthorization()

}

// 设置过滤距离

// 每隔100米定位一次

// 1 111KM/100M

// 如果最新的位置距离上一次的位置之间的物理距离, 大于这个值, 就会通过代理来告诉我们最新的位置数据

locationM.distanceFilter = 100

// 定位精确度

// kCLLocationAccuracyBestForNavigation // 最适合导航

// kCLLocationAccuracyBest; // 最好的

// kCLLocationAccuracyNearestTenMeters; // 附近10米

// kCLLocationAccuracyHundredMeters; // 附近100米

// kCLLocationAccuracyKilometer; // 附近1000米

// kCLLocationAccuracyThreeKilometers; // 附近3000米

// 经验: 如果定位的精确度越高, 那么越耗电, 而且定位时间越长

//

locationM.desiredAccuracy = kCLLocationAccuracyBest

return locationM

}()

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {

locationM.startUpdatingLocation()

}


}



extension ViewController: CLLocationManagerDelegate {

func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {

print("已经获取到位置信息")

// 获取用户当前所在的城市, 切换到奥对应城市 1

// 如果想要定位一次, 那么可以在定位到之后, 停止定位

// locationM.stopUpdatingLocation()

}

/**

授权状态发生改变时调用

- parameter manager: 位置管理者

- parameter status: 状态

*/

func locationManager(manager: CLLocationManager, didChangeAuthorizationStatus status: CLAuthorizationStatus) {

switch status {

case .NotDetermined:

print("用户没有决定")

case .Restricted:

print("受限制")

case .AuthorizedWhenInUse:

print("前台定位授权")

case .AuthorizedAlways:

print("前后台定位授权")

case .Denied:

// print("拒绝")

// 判断当前设备是否支持定位, 并且定位服务是否开启

if CLLocationManager.locationServicesEnabled() {

print("真正被拒绝")

// 手动通过代码, 来跳转到设置界面

if #available(iOS 8.0, *) {

let url = NSURL(string: UIApplicationOpenSettingsURLString)

if UIApplication.sharedApplication().canOpenURL(url!) {

UIApplication.sharedApplication().openURL(url!)

}

}

}else {

// 当我们在app内部想要访问用户位置, 但是当前的定位服务是关闭状态, 那么系统会自动弹出一个窗口, 快捷跳转到设置界面, 让用户设置

print("定位服务应该打开")

}

default:

print("none")

}

}