定位
常用方法的介紹
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);}];
復制代碼
轉載于:https://juejin.im/post/5c1a0df8e51d454ad55f067e
總結
以上是生活随笔為你收集整理的iOS 地图定位 定位的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。