定位
常用方法的介紹
CLLocationManager位置管理器,我們的有關於位置的方法和屬性都是通過它來管理設定的。 + (BOOL)locationServicesEnabled監測裝置是否開啟定位功能。 - (void)requestAlwaysAuthorization請求使用者設定在程式執行期間和程式在前臺和後臺,都開啟定位。需要在info.plist檔案中新增相應的欄位(鍵值對)來配合該方法的使用。NSLocatiodenAlwaysUsageDescription鍵 值(提示資訊) - (void)requestWhenInUseAuthorization請求使用者設定只在程式執行期間才開啟定位服務。需要在info.plist檔案中新增相應的欄位(鍵值對)來配合該方法的使用。NSLocationWhenInUseUsageDescription鍵 值(提示資訊) - (void)startUpdatingLocation開啟定位,在所有相關的屬性設定完畢之後,需要開啟定位。
需要設定的屬性
- 設定定位的頻率,每隔多少米定位一次。
距離篩選器
@property(assign, nonatomic) CLLocationDistance distanceFilter;
如果將下面的常量賦值給這個屬性就可以將位置管理器返回到沒有設定篩選器的預設狀態。
複製程式碼
- 設定精確度(精確度是根據當前應用的需求來定的,不是越精確越好,精確度越高越耗電)。
@property(assign, nonatomic) CLLocationAccuracy desiredAccuracy;
//下面是可以被設定的值
extern const CLLocationAccuracy kCLLocationAccuracyBestForNavigation;
extern const CLLocationAccuracy kCLLocationAccuracyBest;
extern const CLLocationAccuracy kCLLocationAccuracyNearestTenMeters;
extern const CLLocationAccuracy kCLLocationAccuracyHundredMeters;
extern const CLLocationAccuracy kCLLocationAccuracyKilometer;
extern const CLLocationAccuracy kCLLocationAccuracyThreeKilometers;
複製程式碼
- CLLocationManager代理屬性,用來指定代理人。
@property(assign, nonatomic, nullable) id<CLLocationManagerDelegate> delegate;
複製程式碼
示例程式碼
注意:在初始化位置管理器的時候,我們需要將位置管理器的物件設定成為例項變數或者是屬性,如果直接初始化為區域性例項變數,這時候它的協議方法有可能會不執行。 在程式碼都正常的情況下,定位如果失敗,有可能是網路環境的問題,我們可以換一下網路試試 在延展中需要宣告屬性
@interface RootViewController ()<CLLocationManagerDelegate>
@property (strong, nonatomic)CLLocationManager *locationManager;//定位服務的管理物件。
@end
複製程式碼
self.locationManager = [[CLLocationManager alloc]init];初始化一個位置管理器
BOOL openLocationServices = [CLLocationManager locationServicesEnabled];
if (openLocationServices) {
NSLog(@"已經開啟定位");
[self.locationManager requestAlwaysAuthorization];//請求使用者總是使用定位服務
self.locationManager.distanceFilter = 10.0;//設定定位的頻率,
self.locationManager.desiredAccuracy = kCLLocationAccuracyBest;//設定精確度
self.locationManager.delegate = self;//設定代理
[self.locationManager startUpdatingLocation];//開始定位
}else{
NSLog(@"無法獲取你的位置資訊,為了更好的為你服務,請在設定隱私定位服務中開啟定位服務");
}
複製程式碼
定位的代理方法 位置管理器代理必須遵循CLLocationManagerDelegate協議,該協議定義了多個方法,其中有兩個方法,當位置管理器已經確定當前位置或者當它檢測到位置的更改時將呼叫。 在方法中你會見到一個CLLocationCoordinate2D它是一個結構體,裡面包含了經緯度
typedef struct {
CLLocationDegrees latitude;//緯度
CLLocationDegrees longitude;//經度
} CLLocationCoordinate2D;
複製程式碼
如果想建立一個CLLocationCoordinate2D我們一般使用如下的方法
CLLocationCoordinate2D CLLocationCoordinate2DMake(CLLocationDegrees latitude, CLLocationDegrees longitude)
複製程式碼
- 定位獲取location資訊的時候會執行的協議方法
-(void)locationManager:(CLLocationManager *)manager
didUpdateLocations:(nonnull NSArray<CLLocation *> *)locations{
if (locations && locations.count) {
CLLocationCoordinate2D lastLocation = locations.lastObject.coordinate;
NSLog(@"緯度%f 經度%f",lastLocation.latitude,lastLocation.longitude);
}
}
複製程式碼
- 定位出現錯誤的時候
-(void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error{
NSLog(@"定位失敗-------%@",error.description);
}
複製程式碼
地理編碼和反地理編碼
使用CLGeocoder可以完成地理編碼和反地理編碼
- 地理編碼:根據給定的地名,獲得具體的位置資訊(比如經緯度、地址的全稱等) 地理編碼的方法
-(void)geocodeAddressString:(NSString *)addressString completionHandler:
(CLGeocodeCompletionHandler)completionHandler;
複製程式碼
- 反地理編碼:根據給定的經緯度,獲得具體的位置資訊。 反地理編碼的方法
-(void)reverseGeocodeLocation:(CLLocation *)location completionHandler:
(CLGeocodeCompletionHandler)completionHandler;
複製程式碼
地理編碼
- 使用CLGeocoder類來建立一個例項物件
CLGeocoder *geo = [[CLGeocoder alloc]init];
複製程式碼
- 使用建立好的例項物件來呼叫地理編碼的方法 CLPlacemark的字面意思是地標,它裡面封裝了具體的位置資訊,我們可以根據需要取出我們需要的資訊。
[geo geocodeAddressString:@"這裡寫地點名稱" completionHandler:^(NSArray<CLPlacemark *> * _Nullable
placemarks, NSError * _Nullable error) {
CLPlacemark *newPlacemarks = placemarks.lastObject;
NSLog(@"經度 %f, 緯度 %f",
newPlacemarks.location.coordinate.latitude,newPlacemarks.location.coordinate.longitude);
NSLog(@"----+++++++++++++++++++++++%@",newPlacemarks.name);
}];
複製程式碼
反地理編碼
- 使用CLGeocoder類來建立一個例項物件
CLGeocoder *geocoder = [[CLGeocoder alloc]init];
複製程式碼
- 使用建立好的例項物件來呼叫反地理編碼的方法
[geocoder reverseGeocodeLocation:@"這裡填寫一個經緯度" completionHandler:
^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {
CLPlacemark *newPlacemark = placemarks.lastObject;
NSLog(@"%@",newPlacemark.country);
NSLog(@"%@",newPlacemark.addressDictionary);
NSLog(@"%@",[newPlacemark.addressDictionary objectForKey:@"City"]);
NSLog(@"%@",newPlacemark.name);
NSLog(@"%@",newPlacemark.location);
}];
複製程式碼