iOS定位--CoreLocation架構

來源:互聯網
上載者:User

標籤:

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;
  • 當調用了startUpdatingLocation方法後,就開始不斷地定位使用者的位置,中途會頻繁地調用代理的下面方法調用頻率非常高

  • 如果只需要擷取一次, 可以擷取到位置之後就停止

    • [manager stopUpdatingLocation];
- (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.)"
解決方案:
  • 1.確定模擬器(手機)已經連網並且允許程式擷取地理位置
  • 2.重設地理位置服務或者網路服務

  • PS:如果是模擬器就果斷直接重設模擬器吧 IOS Simulator - Reset Content and Settings..。

中國經緯度中國的經緯度範圍
  • 緯度範圍:N 3°51′ ~ N 53°33′
  • 經度範圍:E 73°33′ ~ E 135°05′
中國部分城市的經緯度

iOS定位--CoreLocation架構

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.