使用前的說明
高德地圖開放平台的iOS定位模塊網址--》http://lbs.amap.com/api/ios-location-sdk/summary/
高德地圖有Web端、android平台、iOS平台和Web服務&其他四個部分。
iOS平台有地圖、定位、導航等5個SDK。
准備:
- key是必須的:(官方文檔 )控制台--》添加新Key 完成。Tip:
如何獲取 Bundle Identifier:1.代碼獲取:NSString *bundleIdentifier = [[NSBundle mainBundle] bundleIdentifier];2.Xcode ,target中的切換到 General 標簽,查看 Bundle Identifier
- 添加到工程中去,有手動和自動部署
- 手動 (手動部署官方文檔)
第 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)都可以獲取到更新的位置數據。
- 自動
(自動部署官方文檔) CocoaPods spod 'AMapLocation', '~>1.0'#此處是版本號 ,添加之后項目中多了AMapFoundation和AMapLocation庫。
- 手動 (手動部署官方文檔)
Tip:
基礎SDK介紹:(官方文檔)
- 在相關下載中可以看到我們提供了一個新的 SDK,這個基礎 SDK 中包含了 高德 iOS 地圖、定位、導航等 SDK 需要的基礎核心,以及必要的公共資源,是使用其他 SDK 前必須引入的基礎 SDK。
- 使用指南:a.添加了地圖、定位和導航SDK之后需要引入基礎 SDK;b.(官方文檔):基礎 SDK 自 V1.2.0 版本后集成了 IDFA 服務,如果您的 APP 中並沒有使用到相關服務,請您務必查看提交AppStore必讀。;c.設置key的使用方式:
[AMapServices sharedServices].apiKey =@"您的key";
分割線-------------------------------------------------------------------------定位正題部分來臨
定位部分的正題
說明:
- 高德 iOS 定位 SDK 提供了不依賴於地圖定位的定位功能,開發者可以無地圖顯示的場景中便捷地為應用程序添加定位功能。
- iOS定位SDK提供了單次定位、連續定位、逆地理信息、地理圍欄等功能。
- 獲取定位有三種:單次定位、后台定位和持續定位。
單次定位模塊:(官方文檔)
說明: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); } }];
下面是正式在項目中使用: