[OC][地圖] 高德地圖之定位初探(一)


使用前的說明

高德地圖開放平台的iOS定位模塊網址--》http://lbs.amap.com/api/ios-location-sdk/summary/

高德地圖有Web端、android平台、iOS平台和Web服務&其他四個部分。

iOS平台有地圖、定位、導航等5個SDK。

准備:

  1. key是必須的:(官方文檔 )控制台--》添加新Key 完成。Tip:

    如何獲取 Bundle Identifier:1.代碼獲取:NSString *bundleIdentifier = [[NSBundle mainBundle] bundleIdentifier];2.Xcode ,target中的切換到 General 標簽,查看 Bundle Identifier

  2. 添加到工程中去,有手動和自動部署
    1.  手動  (手動部署官方文檔)  

      第 1 步:添加依賴的庫 :基礎 SDK AMapFoundationKit.framework和定位 SDK AMapLocationKit.framework(TARGETS->Build Phases-> Link Binary With Libaries 中點擊“+”按鈕)  

      第 2 步:需要引入的系統庫文件 :需要引入的系統庫文件有:JavaScriptcore.framework, SystemConfiguration.framework, CoreTeleohony.framework, libz.dylib, libstdc++6.09.dylib, libc++.dylib。iOS9后,需要把libz.dylib、libstdc++6.09.dylib、libc++.dylib替換成libz.tbd、libstdc++6.09.tbd、libc++.tbd         (在 TARGETS-General-Linked Frameworks and Libraries 中點擊“+”)

      第 3 步:需要申請的權限  

      在項目的 Info.plist 添加 NSLocationWhenInUseUsageDescription 或 NSLocationAlwaysUsageDescription 字段,根據您的業務需求,任選其一即可。

      其中:

      • NSLocationWhenInUseUsageDescription 表示應用在前台的時候可以搜到更新的位置信息。
      • NSLocationAlwaysUsageDescription 表示應用在前台和后台(suspend 或 terminated)都可以獲取到更新的位置數據。
    2.  自動  (自動部署官方文檔) CocoaPods spod 'AMapLocation', '~>1.0'#此處是版本號 ,添加之后項目中多了AMapFoundation和AMapLocation庫。

Tip:

  基礎SDK介紹:(官方文檔)

  1. 相關下載中可以看到我們提供了一個新的 SDK,這個基礎 SDK 中包含了 高德 iOS 地圖、定位、導航等 SDK 需要的基礎核心,以及必要的公共資源,是使用其他 SDK 前必須引入的基礎 SDK。
  2. 使用指南:a.添加了地圖、定位和導航SDK之后需要引入基礎 SDK;b.(官方文檔):基礎 SDK 自 V1.2.0 版本后集成了 IDFA 服務,如果您的 APP 中並沒有使用到相關服務,請您務必查看提交AppStore必讀;c.設置key的使用方式:
    [AMapServices sharedServices].apiKey =@"您的key";

     

 

分割線-------------------------------------------------------------------------定位正題部分來臨

定位部分的正題

說明:

  1. 高德 iOS 定位 SDK 提供了不依賴於地圖定位的定位功能,開發者可以無地圖顯示的場景中便捷地為應用程序添加定位功能。
  2. iOS定位SDK提供了單次定位、連續定位、逆地理信息、地理圍欄等功能。
  3. 獲取定位有三種:單次定位、后台定位和持續定位。

單次定位模塊:(官方文檔)

說明:iOS定位SDK提供的單次定位方法基於蘋果定位核心,蘋果定位核心會在設備移動時連續返回定位結果,高德在此基礎上封裝了單次定位並適配了iOS 6到iOS 9系統。當設備可以正常聯網時,還可以返回該定位點的位置信息(包括:省、市、區/縣以及詳細地址)。

四個步驟:引入頭文件--》配置key--》設置期望定位精度--》獲取定位結果

  • 第 1 步,引入頭文件
#import <AMapFoundationKit/AMapFoundationKit.h>
#import <AMapLocationKit/AMapLocationKit.h>
  • 第 2 步,配置Key

在調用定位時,需要添加Key。

如果您使用的是定位SDK v2.x版本需要引入基礎 SDK AMapLocationKit.framework ,設置apiKey的方式如下:

iOS 定位SDK v2.x版本設置 Key:

[AMapServices sharedServices].apiKey =@"您的key";

如果您使用的是定位SDK v1.x版本,請您盡快更新。

iOS 定位SDK v1.x版本設置 Key:

[AMapLocationServices sharedServices].apiKey =@"您的key";

 Tip:

  我把設置Key放到AppDelegate里面:

#import <AMapFoundationKit/AMapFoundationKit.h>

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    //高德
    [AMapServices sharedServices].apiKey = @"XXXXXX";//可以將key 宏定義下
    return YES;
}

  

  • 第 3 步,設置期望定位精度

由於蘋果系統的首次定位結果為粗定位,其可能無法滿足需要高精度定位的場景。

所以,高德提供了 kCLLocationAccuracyBest 參數,設置該參數可以獲取到最優10m左右誤差的定位結果(開啟GPS情況下),但是相應的需要付出比較長的時間(10s左右),您需要對待實現場景所需定位精度有個系統的認知,才可以選擇更適合您App使用的期望定位精度。

 推薦:kCLLocationAccuracyHundredMeters,一次還不錯的定位,偏差在100米以內,耗時在2s左右。

// 帶逆地理信息的一次定位(返回坐標和地址信息)
[self.locationManager setDesiredAccuracy:kCLLocationAccuracyHundredMeters];
//   定位超時時間,最低2s,此處設置為2s
self.locationManager.locationTimeout =2;
//   逆地理請求超時時間,最低2s,此處設置為2s
self.locationManager.reGeocodeTimeout = 2;

高精度:kCLLocationAccuracyBest,精度很高的一次定位,偏差在10米以內,耗時在10s左右。

// 帶逆地理信息的一次定位(返回坐標和地址信息)
[self.locationManager setDesiredAccuracy:kCLLocationAccuracyBest];
//   定位超時時間,最低2s,此處設置為10s
self.locationManager.locationTimeout =10;
//   逆地理請求超時時間,最低2s,此處設置為10s
self.locationManager.reGeocodeTimeout = 10;

其余精度閾值可以通過查看參考手冊得到。

  • 第 4 步,請求定位並拿到結果

調用 AMapLocationManager 的 requestLocationWithReGeocode:completionBlock: 方法,請求一次定位。

您可以選擇在一次定位時是否返回地址信息(需要聯網)。以下是請求帶逆地理信息的一次定位,代碼如下:

// 帶逆地理(返回坐標和地址信息)。將下面代碼中的 YES 改成 NO ,則不會返回地址信息。
[self.locationManager requestLocationWithReGeocode:YES completionBlock:^(CLLocation *location, AMapLocationReGeocode *regeocode, NSError *error) {
         
        if (error)
        {
            NSLog(@"locError:{%ld - %@};", (long)error.code, error.localizedDescription);
             
            if (error.code == AMapLocationErrorLocateFailed)
            {
                return;
            }
        }
         
        NSLog(@"location:%@", location);
         
        if (regeocode)
        {
            NSLog(@"reGeocode:%@", regeocode);
        }
    }];

  

下面是正式在項目中使用:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM