一拭荤、定位。
1),iOS8以后,請求定位時候,需要在info.plist文件里加入一個字段说墨。
//NSLocationAlwaysUsageDescription(一直定位,后臺的也能定位)
//NSLocationWhenInUseUsageDescription(使用的時候定位)
2),如果需要使用定位富稻,需要導(dǎo)入CoreLocation框架筒狠。
import <CoreLocation/CoreLocation.h>
遵守代理<CLLocationManagerDelegate>
_locationManager.delegate = self;
初始化定位管理器
_locationManager = [[CLLocationManager alloc] init];
//在ios8以后,請求定位需要調(diào)用下面的方法
//做版本判斷是因為低版本調(diào)用高版本的方法抛蚁,會出現(xiàn)崩潰
if ([[[UIDevice currentDevice] systemVersion] floatValue]>=8.0) {
//一直定位
[_locationManager requestAlwaysAuthorization];
//用時定位
[_locationManager requestWhenInUseAuthorization];
}
//當用戶移動50米時陈醒,會調(diào)用一次代理方法[定位一次]
_locationManager.distanceFilter = 50;
//設(shè)置定位的精確度,精確度越高瞧甩,越費電
_locationManager.desiredAccuracy = kCLLocationAccuracyBest;
實現(xiàn)代理方法
钉跷。
//授權(quán)結(jié)果
- (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status{
if (status == kCLAuthorizationStatusNotDetermined) {
NSLog(@"等待用戶授權(quán)");
}else if(status == kCLAuthorizationStatusAuthorizedAlways ||
status == kCLAuthorizationStatusAuthorizedWhenInUse){
NSLog(@"授權(quán)成功");
//開始更新用戶的位置信息,一旦調(diào)用了這個方法亲配,就會不斷地獲取用戶的位置信息
[_locationManager startUpdatingLocation];
}else{
NSLog(@"授權(quán)失敗");
}
}
//定位成功
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations{
//數(shù)組中最后的元素是最新的定位
//拿到用戶最新的位置信息
//按時間排序尘应,如果想要拿到最新的位置信息,如果想要拿到最新的位置信息吼虎,直接拿到最后一個
CLLocation *currentLocation = [locations lastObject];
//把最新的位置信息賦值給_location
_location = currentLocation;
//比如:獲取用戶所在的城市犬钢,只需要一次
//停止更新用戶的位置信息
// [manager stopUpdatingLocation];
}
//定位失敗
- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error{
NSLog(@"失敗");
NSLog(@"%@",error.userInfo);
}
正向地理編碼
地址轉(zhuǎn)換為經(jīng)緯度稱為正向地理編碼
//創(chuàng)建編碼對象
CLGeocoder *geoCoder = [[CLGeocoder alloc] init];
//正向地理編碼
NSString *str = @"地址字符串";
[geoCoder geocodeAddressString:str completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {
if (placemarks.count == 0) {
return ;
}
CLPlacemark *placeMark = [placemarks lastObject];
NSLog(@"緯度%lf",placeMark.location.coordinate.latitude);
NSLog(@"經(jīng)度%lf",placeMark.location.coordinate.longitude);
}];
反向地理編碼
將經(jīng)緯度轉(zhuǎn)換成詳細的地址。
//創(chuàng)建編碼對象
CLGeocoder *geoCoder = [[CLGeocoder alloc] init];
//反向地理變量
//_location :一個地理位置的
[geoCoder reverseGeocodeLocation:_location completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {
if (placemarks.count == 0) {
return ;
}
//地標 里面封住了詳細的地址信息
CLPlacemark *placeMark = placemarks[0];
NSLog(@"%@",placeMark.addressDictionary);
//addressDictionary 詳細的位置信息
}];
通過兩個地理位置計算之間距離
CLLocation *location1 = [[CLLocation alloc] initWithLatitude:34.772108 longitude:113.675915];
CLLocation *location2 = [[CLLocation alloc] initWithLatitude:34.772478 longitude:113.678005];
//計算兩個經(jīng)緯度之間的距離 單位是米
CLLocationDistance distance = [location1 distanceFromLocation:location2];