MapKit 用于地图展示
Core Location 用于地理定位
LBS : location based service 基于定位的服务
CoreLocation
定位所包含的类都在CoreLocation模块中,使用时必须导入。
CLLocationManager:定位管理器,可以理解为定位不能自己工作,需要有个类对它进行全过程管理。
CLLocationManagerDelegate:定位管理代理,不管是定位成功与失败,都会有相应的代理方法进行回调。
CLLocation:表示某个位置的地理信息,包含经纬度、海拔等。
CLPlacemark:位置信息,包含的信息如国家、城市、街道等。
CLGeocoder:地理编码。
使用方式
- 创建CLLocationManager,设置代理并发起定位。
locationManage = CLLocationManager.init()
locationManage?.delegate = self
- 实现CLLocationManagerDelegate中定位成功和失败的代理方法。
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
print(locations)
//获取一次定位即可,获取到之后关闭定位
manager.stopUpdatingLocation()
}
- 在成功的代理方法中获取CLLocation对象并通过CLGeocoder进行反向地理编码获取对应的位置信息CLPlacemark。
- 通过CLPlacemark获取具体的位置信息。
必要配置
info.plist
需要在 Info.plist 中配置Privacy - Location When In Use Usage Description。
这样设置完后,在用户没有授权的时候可以发送一个请求:
locationManage?.requestWhenInUseAuthorization()
这样用户在进入到这个页面的时候就能够看见有关请求定位的申请,用户可以根据自身的情况进行授权。
关于定位授权状态可参考:
CLAuthorizationStatus
let status = locationManage?.authorizationStatus
switch status {
case .notDetermined,.restricted,.denied:
locationTipLabel.text = "未取得定位服务"
case .authorizedAlways,.authorizedWhenInUse,.authorized:
locationTipLabel.text = "在本页定位服务正在使用"
locationManage?.startUpdatingLocation()
case .none,.some(_):
break
}
关于获得定位CLLocation后如何得知定位所在的省市区
定位CLLocation和省市区是不在同一个类里的,可以通过CLLocation来获得省市区等地理信息,这个专门处理省市区的类就是CLPlacemark。
获得省市区信息的示范代码:
private func searchLocationData(withCLLocation location:CLLocation){
let geocoder = CLGeocoder.init()
geocoder.reverseGeocodeLocation(location) { placemarks, error in
if (placemarks?.count != 0){
let placemark = placemarks?.first
let province = placemark?.administrativeArea
for index in 0 ..< self.dataScource.count {
let dicProvinceCity = self.dataScource[index]
let dicProvinceName = dicProvinceCity["province"] as! String
}
}
}
}