標籤:
CoreLocation架構的使用
// 首先匯入標頭檔#import <CoreLocation/CoreLocation.h>
- CoreLocation架構中所有資料類型的首碼都是CL
- CoreLocation中使用CLLocationManager對象來做使用者定位
1.CLLocationManager的使用CLLocationManager的常用操作
/** * 定位管理者,全域變數強引用,防止銷毀 */@property (nonatomic ,strong) CLLocationManager *mgr;
設代理
// 2.成為CoreLocation管理者的代理監聽擷取到的位置 self.mgr.delegate = self;
①得到使用者授權
注意:iOS7隻要開始定位, 系統就會自動要求使用者對你的應用程式授權. 但是從iOS8開始, 想要定位必須先"自己""主動"要求使用者授權
- 添加友好提示,在info.plist檔案中添加欄位
- Privacy - Location Usage Description
在iOS8中不僅僅要主動請求授權,而且必須再info.plist檔案中配置一項屬性才能彈出授權視窗
- NSLocationWhenInUseDescription,允許在前台擷取GPS的描述
- NSLocationAlwaysUsageDescription,允許在後台擷取GPS的描述
/* 使用者從未選擇過許可權 kCLAuthorizationStatusNotDetermined 無法使用定位服務,該狀態使用者無法改變 kCLAuthorizationStatusRestricted 使用者拒絕該應用使用定位服務,或是定位服務總開關處於關閉狀態 kCLAuthorizationStatusDenied 已經授權(廢棄) kCLAuthorizationStatusAuthorized 使用者允許該程式無論何時都可以使用地理資訊 kCLAuthorizationStatusAuthorizedAlways 使用者同意程式在可見時使用地理位置 kCLAuthorizationStatusAuthorizedWhenInUse */ // 1.獲得使用者授權狀態 CLAuthorizationStatus status = [CLLocationManager authorizationStatus]; // 2.判斷使用者是否授權 if (status == kCLAuthorizationStatusNotDetermined) { NSLog(@"等待使用者授權"); }else if (status == kCLAuthorizationStatusAuthorizedAlways || status == kCLAuthorizationStatusAuthorizedWhenInUse) { NSLog(@"授權成功"); // 開始定位 [self.mgr startUpdatingLocation]; }else { NSLog(@"授權失敗"); }
iOS8請求授權得不到提示的原因
- 1.沒有發送請求
- 2.CLLocationManager不是全域的成員屬性
- 3.沒有在info.plist檔案中添加欄位
- NSLocationAlwaysUsageDescription
- NSLocationWhenInUseDescription
②開始使用者定位
- (void)startUpdatingLocation;
③停止使用者定位
- (void) stopUpdatingLocation;
③設定當使用者移動多少米,重新置放
- self.mgr.distanceFilter = 50;
④設定擷取位置的精確度
/* kCLLocationAccuracyBestForNavigation 最佳導航 kCLLocationAccuracyBest; 最精準 kCLLocationAccuracyNearestTenMeters; 10米 kCLLocationAccuracyHundredMeters; 百米 kCLLocationAccuracyKilometer; 千米 kCLLocationAccuracyThreeKilometers; 3千米 */ self.mgr.desiredAccuracy = kCLLocationAccuracyNearestTenMeters;
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations;//locations參數裡面裝著CLLocation對象
在startUpdatingLocation 代理方法中可以得到使用者的座標資訊
// 1.擷取最後一次的位置 CLLocation *location = [locations lastObject]; /* location.coordinate; 座標, 包含經緯度 location.altitude; 裝置海拔高度 單位是米 location.course; 設定前進方向 0表示北 90東 180南 270西 location.horizontalAccuracy; 水平精準度 location.verticalAccuracy; 垂直精準度 location.timestamp; 定位資訊返回的時間 location.speed; 裝置移動速度 單位是米/秒, 適用於行車速度而不太適用於不行 */ /* 可以設定模擬器類比速度 bicycle ride 騎車移動 run 跑動 freeway drive 高速公路駕車 */ CLLocation *location = [locations lastObject]; NSLog(@"%f, %f speed = %f", location.coordinate.latitude , location.coordinate.longitude, location.speed);
計算兩地之間的直線距離
- (CLLocationDistance)distanceFromLocation:(const CLLocation *)location;
// 北京:39.6 116.39 // 廣州:23.08 113.15 CLLocation *BeiJing = [[CLLocation alloc] initWithLatitude:39.6 longitude:116.39]; CLLocation *GuangZhou = [[CLLocation alloc] initWithLatitude:23.08 longitude:113.15]; // 得到兩地之間的距離 CLLocationDistance distance = [BeiJing distanceFromLocation:GuangZhou]; NSLog(@"%.2f", distance);
2、CLLocation
- CLLocation用來表示某個位置的地理資訊,比如經緯度、海拔等等
// 屬性 location.coordinate; 座標, 包含經緯度 location.altitude; 裝置海拔高度 單位是米 location.course; 設定前進方向 0表示北 90東 180南 270西 location.horizontalAccuracy; 水平精準度 location.verticalAccuracy; 垂直精準度 location.timestamp; 定位資訊返回的時間 location.speed; 裝置移動速度 單位是米/秒, 適用於行車速度而不太適用於不行// 可以計算2個位置之間的距離- (CLLocationDistance)distanceFromLocation:(const CLLocation *)location
3、CLGeocoder
- 使用CLGeocoder可以完成“地理編碼”和“反地理編碼”
地理編碼:根據給定的地名,獲得具體的位置資訊(比如經緯度、地址的全稱等)反地理編碼:根據給定的經緯度,獲得具體的位置資訊
// 地理編碼方法- geocodeAddressString:address completionHandler:^(NSArray *placemarks, NSError *error) {};// 反地理編碼方法- reverseGeocodeLocation:location completionHandler:^(NSArray *placemarks, NSError *error) {};
CLPlacemark的字面意思是地標,封裝詳細的地址位置資訊
1.CLPlacemark的addressDictionary屬性 遍曆字典資料addressDictionary enumerateKeysAndObjectsUsingBlock2.block是在主線程調用,所以可以直接在block重新整理UIname : 地名thoroughfare : 街道ubThoroughfare : 街道相關資訊,例如門牌等locality : 城市subLocality : 城市相關資訊,例如標誌性建築administrativeArea : 直轄市subAdministrativeArea : 其他行政地區資訊postalCode : 郵編ISOcountryCode : 國家編碼country; : 國家inlandWater : 水源、湖泊ocean; : 海洋areasOfInterest : 關聯的或利益相關的地標@property (nonatomic, readonly) CLLocation *location;// 地理位置@property (nonatomic, readonly) CLRegion *region;// 地區@property (nonatomic, readonly) NSDictionary *addressDictionary;// 詳細的地址資訊@property (nonatomic, readonly) NSString *name;// 位址名稱@property (nonatomic, readonly) NSString *locality;// 城市
錯誤:使用CoreLocation擷取地理位置資訊,報錯
Error Domain=kCLErrorDomain Code=0 "The operation couldn’t be completed. (kCLErrorDomain error 0.)"
解決方案:
中國經緯度中國的經緯度範圍
- 緯度範圍:N 3°51′ ~ N 53°33′
- 經度範圍:E 73°33′ ~ E 135°05′
中國部分城市的經緯度
iOS定位--CoreLocation架構