因为苹果加了用户设置定位状态的功能(启用,使用期间,停用)
1. 要在info.plist中添加两个key:
NSLocationWhenInUseUsageDescription :当app在前台的时候,才可以获取到定位信息
NSLocationAlwaysUsageDescription :app在前台、后台、挂起、结束进程状态时,都可以获取到定位信息
这两个key对应的值都是String,简要填写为何需要定位(可以不写)
比如Location is required to find out how many steps you run.
2,向用户申请获取定位请求:
mgr.requestAlwaysAuthorization() //相对应info.plist中的NSLocationAlwaysUsageDescription键
mgr.requestWhenInUseAuthorization() //相对应info.plist中的NSLocationWhenInUseUsageDescription键
完整代码:
import UIKit
import CoreLocation
class ViewController: UIViewController, CLLocationManagerDelegate {
// 1. 创建CoreLocation管理者
lazy var mgr: CLLocationManager = {
return CLLocationManager()
}()
override func viewDidLoad() {
super.viewDidLoad()
// 2. 成为管理者的代理,监听获取到的位置
self.mgr.delegate = self
// 设置移动多少米获取一次位置信息
// self.mgr.distanceFilter = 100
// 设置获取位置的精确度
/**
kCLLocationAccuracyBestForNavigation 最精确导航
kCLLocationAccuracyBest 最精准导航
kCLLocationAccuracyNearestTenMeters 十米
kCLLocationAccuracyHundredMeters 百米
kCLLocationAccuracyKilometer 千米
kCLLocationAccuracyThreeKilometers 三千米
*/
self.mgr.desiredAccuracy = kCLLocationAccuracyNearestTenMeters
// 这个是为了兼容IOS7不询问,IOS8以上询问
if #available(iOS 8.0, *) {
if self.mgr.respondsToSelector("requestAlwaysAuthorization") {
// 询问用户是否开启定位
self.mgr.requestAlwaysAuthorization()
}
mgr.requestWhenInUseAuthorization() // 请求前台定位权限
}
}
/**
获取到位置信息后就会调用(调用频率非常高)
- parameter manager: 触发事件的对象
- parameter locations: 获取到的位置
*/
func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
// 获取最后一次位置
/*
location.coordinate 坐标,包含经纬度
location.altitde 设备海拔高度,单位米
location.course 设置前进方向,0表示北 90东 180南 270西
location.horizontalAccuracy 水平精准度
location.verticalAccuracy 垂直精准度
location.timetame 定位信息返回的时间
location.speed 设备移动速度,单位是米/秒,适用于行车速度,不太适用于步行
*/
let location = locations.last
location?.verticalAccuracy
print("\(location!.coordinate.latitude), \(location!.coordinate.longitude) speed = \(location!.speed)")
// 如果只需要获取一次,可以获取到位置后就停止
// mgr.stopUpdatingLocation()
}
/**
授权状态发生改变时调用
NotDetermined:用户还没有被请求获取授权
Restricted:用户在设置里关闭了位置服务
Denied:用户收到获取授权的请求,但点击了NO,或者在设置里关闭了
@available(iOS 8.0, *)
Authorized:用户收到获取授权的请求,点击了YES
AuthorizedAlways = 用户授权app在任何时候获取位置信息
AuthorizedWhenInUse:用户授权app在前台获取位置信息
- parameter status: 当前授权状态
*/
func locationManager(manager: CLLocationManager, didChangeAuthorizationStatus status: CLAuthorizationStatus) {
if #available(iOS 8.0, *) {
if status == .NotDetermined {
print("等待用户授权")
} else if status == .AuthorizedAlways || status == .AuthorizedWhenInUse {
print("授权成功")
// 3. 开始监听(开始获取位置)
self.mgr.startUpdatingLocation()
} else {
print("授权失败")
}
} else {
// Fallback on earlier versions
}
}
}