最近在整理之前運用到的一些技術(shù) , 關(guān)于定位 我完善了一下知識體系 , 今天跟大家分享一下 關(guān)于定位 CLLocationManager 的那些事 .
基本配置
- 導入架包
#import <CoreLocation/CoreLocation.h>
- 創(chuàng)建對象
//這邊需要注意的是 要用strong 強引用
@property (nonatomic, strong) CLLocationManager *locationManager;
聲明代理
<CLLocationManagerDelegate>
-
plist 文件配置
-
如果要后臺定位娩鹉,需要打開后臺模式
代碼實現(xiàn)
// 判斷是否打開了位置服務
if ([CLLocationManager locationServicesEnabled]) {
self.locationManager = [[CLLocationManager alloc] init];
self.locationManager.delegate = self;
//設(shè)置定位距離過濾參數(shù) (當本次定位和上次定位之間的距離大于或等于這個值時导盅,調(diào)用代理方法)
self.locationManager.distanceFilter = 20;
//設(shè)置定位精度(精度越高越耗電)
self.locationManager.desiredAccuracy = kCLLocationAccuracyBest;
//請求定位服務許可
if ([self.locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)]) {
[self.locationManager requestWhenInUseAuthorization];
} else {
[self.locationManager requestAlwaysAuthorization];
}
//開始更新位置
[self.locationManager startUpdatingLocation];
}
//iOS9 之后 必須實現(xiàn)的兩個代理方法
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations{
NSLog(@"locations : %@",locations);
if (locations) {
CLLocation *currentLocation = [locations lastObject];
//經(jīng)度
NSNumber *latitude = [NSNumber numberWithDouble:
currentLocation.coordinate.latitude];
//緯度
NSNumber *longitude = [NSNumber numberWithDouble:
currentLocation.coordinate.longitude];
[self.locationManager stopUpdatingLocation];
}
}
- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error{
NSLog(@"Error : %@",error);
}
** CLLocation 屬性**
- coordinate : 當前位置的坐標
- latitude : 緯度
- longitude : 經(jīng)度
- altitude : 海拔硫椰,高度
- horizontalAccuracy : 緯度和經(jīng)度的精度
- verticalAccuracy : 垂直精度(獲取不到海拔時為負數(shù))
- course : 行進方向(真北)
- speed : 以米/秒為單位的速度
- description : 位置描述信息
定位城市
- (void)getLocationCity:(CLLocation *)newLocation{
CLGeocoder *geocoder = [[CLGeocoder alloc] init];
// 反向地理編譯出地址信息
[geocoder reverseGeocodeLocation:newLocation completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {
if (! error) {
if ([placemarks count] > 0) {
CLPlacemark *placemark = [placemarks firstObject];
// 獲取城市
NSString *city = placemark.locality;
if (! city) {
city = placemark.administrativeArea;
}
self.currentCity.text = city;
}
}
}];
}
** CLPlacemark 屬性**
- name:地址名稱
- country:國家
- administrativeArea:省份(行政區(qū))
- locality:所屬城市
- subLocality:所屬城市中的區(qū)歪架、縣等
- thoroughfare:帶街道的地址名稱
- subThoroughfare : 街道號
- timeZone:時區(qū)
計算兩點之間的距離
//調(diào)用計算兩位置之前距離的方法 (單位為 米)
- (CLLocationDistance)getDistanceFromlocation:(CLLocation *)location
ToAnotherLocation:(CLLocation *)anotherLocation{
CLLocationDistance meters = [location distanceFromLocation:anotherLocation];
return meters;
}
參考文檔 :
http://www.reibang.com/p/ef6994767cbb
https://segmentfault.com/a/1190000004563937