CLLocationManager 是iOS系统提供的定位对象,通过该对象可以获取定位信息,包括:经纬度、海拔、方向、速度。通过反向编码可以获取更多详细的地理区域信息:国家(国家码:ex:美国 US)、省份、市县以及具体的街道信息、周边感兴趣地点等。
具体使用步骤如下:
1、导入相关文件
导入CoreLocation.framework到 项目中,并使用#import引入
2、plist 文件配置
在Info.plist文件中添加如下配置:
NSLocationAlwaysUsageDescription
NSLocationWhenInUseUsageDescription
3、具体使用及参考代码如下:
import UIKit
//定位引用
import CoreLocation
/**
* App定位信息类
*/
classAppLocationData: NSObject,CLLocationManagerDelegate {
/** 定位的当前国家 */
privatevar_strCurrentCountry:String? ="中国";
varstrCurrentCountry:String? {
return_strCurrentCountry;
}
/** 定位的当前省份 */
privatevar_strCurrentProvince:String?;
varstrCurrentProvince:String? {
return_strCurrentProvince;
}
/** 定位的当前城市 */
privatevar_strCurrentCity:String? ="上海";
varstrCurrentCity:String? {
return_strCurrentCity;
}
/** 定位的当前城市所在的区(eg:普陀) */
privatevar_strCurrentArea:String?;
varstrCurrentArea:String? {
return_strCurrentArea;
}
/** 定位的当前详细信息 */
privatevar_strCurrentAddress:String?;
varstrCurrentAddress:String? {
return_strCurrentAddress;
}
/**
* 定位信息
*
* 经度:currLocation.coordinate.longitude
* 纬度:currLocation.coordinate.latitude
* 海拔:currLocation.altitude
* 方向:currLocation.course
* 速度:currLocation.speed
* ……
*/
privatevar_currentLocation:CLLocation?
varcurrentLocation:CLLocation? {
if_currentLocation !=nil{
return_currentLocation!;
}
else{
returnnil;
}
}
staticvarmange:AppLocationData?
//定位对象
privatestaticvarllocationManager:CLLocationManager?
//MARK: - 类初始化
override init() {
super.init()
AppLocationData.mange=self;
//单例
ifAppLocationData.llocationManager==nil{
AppLocationData.llocationManager= CLLocationManager.init()
AppLocationData.llocationManager?.delegate=self
//设置精度
/*
kCLLocationAccuracyBest 精确度最佳
kCLLocationAccuracyNearestTenMeters 精确度10m以内
kCLLocationAccuracyHundredMeters 精确度100m以内
kCLLocationAccuracyKilometer 精确度1000m以内
kCLLocationAccuracyThreeKilometers 精确度3000m以内
*/
AppLocationData.llocationManager?.desiredAccuracy= kCLLocationAccuracyBest
//设置间隔距离(单位:m) 内更新定位信息
//定位要求的精度越高,distanceFilter属性的值越小,应用程序的耗电量就越大。
AppLocationData.llocationManager?.distanceFilter=1000.0;
//开启定位
ifAppDelegate.app?.isNetWork().0==true{
AppLocationData.llocationManager?.startUpdatingLocation()
}
}
//权限检测
self.locationPermissionsCheck();
//监听网络通知 K_APP_NET_WORK_NOTICE
NotificationCenter.default.addObserver(self,selector: #selector(networkListenAction(sender:)),name: NSNotification.Name(rawValue: K_APP_NET_WORK_NOTICE),object:nil)
}
//权限检测
privatefunc locationPermissionsCheck(){
ifCLLocationManager.locationServicesEnabled() ==false{
print("请确认已开启定位服务");
return;
}
// 请求用户授权
ifCLLocationManager.authorizationStatus() ==.notDetermined{
AppLocationData.llocationManager?.requestWhenInUseAuthorization()
if#available(8.0, *) {
AppLocationData.llocationManager?.requestAlwaysAuthorization()
}
}
}
//MARK: - 网络监听
func networkListenAction(sender:Notification){
let user = sender.userInfo
let code = Int.init(String.init(format:"%@",user?["code"] as! CVarArg));
ifcode ==200{
//网络已链接,开启定位
AppLocationData.llocationManager?.startUpdatingLocation();
}
}
//MARK: - CLLocationManagerDelegate
//定位失败
func locationManager(_manager: CLLocationManager, didFailWithErrorerror: Error) {
print("定位失败!详见:\(error)");
}
//定位成功
func locationManager(_manager: CLLocationManager, didUpdateLocationslocations: [CLLocation]) {
print("定位成功");
//赋值
self._currentLocation= locations.last;
// [S] 反编码以便获取其他信息
letgeoCoder:CLGeocoder = CLGeocoder.init()
geoCoder.reverseGeocodeLocation(locations.last!,completionHandler: {(placemarks,error) in
// 如果断网或者定位失败
ifplacemarks ==nil{
return
}
letplaceMark:CLPlacemark = placemarks![0];
//当前城市(把"市"过滤掉,否则 和 其他界面城市不匹配)
self._strCurrentCity= placeMark.locality?.replacingOccurrences(of:"市",with:"")
//详细地址
self._strCurrentAddress= placeMark.addressDictionary?["FormattedAddressLines"] as? String
//国家
self._strCurrentCountry= placeMark.addressDictionary?["Country"] as? String;
//省份
self._strCurrentProvince= placeMark.addressDictionary?["State"] as? String
//区
self._strCurrentArea= placeMark.addressDictionary?["SubLocality"] as? String
/*
* region: //地理区域
* addressDictionary:[AnyHashable : Any] //可以使用ABCreateStringWithAddressDictionary格式化为一个地址
* thoroughfare: String? //街道名
* name:String? //地址
* subThoroughfare: String? //大道
* locality: String? //城市
* subLocality: String? // 社区,通用名称
* administrativeArea: String? // state, eg. CA
* subAdministrativeArea: String? // 国家, eg. Santa Clara
* postalCode: String? // zip code, eg. 95014
* isoCountryCode: String? // eg. US
* country: String? // eg. United States
* inlandWater: String? // 湖泊
* ocean: String? // 洋
* areasOfInterest: [String]? // 感兴趣的地方
*/
});
// [E] 反编码以便获取其他信息
}
}
距离计算: CCLocation对象的distanceTo(distanceFrom)方法,可以得到两个坐标间的距离,单位是米,由于 使用的坐标标准不一致 CLLocationManager 在 百度、腾讯、高德等地图上显示会有 偏差,具体原因及分析 和 解决办法见下文:
IOS LocationManager定位国内偏移,火星坐标(GCJ-02)解决方法
原文出自:http://blog.csdn.net/yimiyuangguang/article/details/62419368