本章節介紹HTTPDNS iOS SDK的使用方法。
前提條件
使用手動添加依賴方式,請提前下載SDK包,最新版本為:V2.0.8-intl。。
使用統一接入添加依賴需提前在控制台下載設定檔。
使用限制
只支援靜態庫,不支援動態庫。
Xcode版本要求:7.0及以上版本。
範例代碼
HTTPDNS IOS SDK接入工程範例參見HTTPDNS iOS Demo。
整合步驟
添加依賴
方式一:Pod整合
指定Master倉庫和阿里雲倉庫
source 'https://github.com/CocoaPods/Specs.git' source 'https://github.com/aliyun/aliyun-specs.git'
添加依賴
pod 'AlicloudHTTPDNS', '2.0.8-intl'
方式二:手動整合
解壓下載好的SDK包,在Xcode中,把SDK包目錄中的framework拖入對應Target下即可,在彈出框勾選Copy items if needed。
AlicloudBeacon.framework AlicloudHttpDNS.framework UTDID.framework AlicloudUtils.framework UTMini.framework AlicloudSender.framework EMASRest.framework
在工程專案中(Build Phases -> Link Binary With Libraries)添加以下庫檔案。
libsqlite3.0.tbd libresolv.tbd CoreTelephony.framework SystemConfiguration.framework
ObjC配置
iOS端整合SDK時需要做
-ObjC
配置,即應用的 TARGETS -> Build Settings -> Linking -> Other Linker Flags ,需添加上-ObjC
這個屬性。重要請注意
-ObjC
的大小寫。匯入標頭檔
添加以下程式碼片段:
#import <AlicloudHttpDNS/AlicloudHttpDNS.h>
SDK初始化配置
說明HTTPDNS iOS SDK已經完成ATS適配,請求都以HTTPS發出,無需再Info.plist中進行ATS配置。
您可以在下載好的設定檔中查看AccountID。
方式一:手動初始化
請參照以下程式碼完成SDK的初始化。
// 設定 HTTPDNS AccoutID ,當您開通 HTTPDNS 服務時,您可以在控制台擷取到您對應的 Accout ID 資訊 HttpDnsService *httpdns = [[HttpDnsService alloc] initWithAccountID::*****];
方式三:開啟鑒權後初始化
在控制台開啟鑒權功能後,SDK需要更改初始化方式,改用下面的方法進行初始化,即可開啟鑒權。
說明開啟鑒權並擷取鑒權所需secretKey請參見鑒權配置。
目前iOS SDK鑒權時間戳記到期時間統一為10分鐘,鑒權機制細節參考鑒權解析介面。
同時鑒權功能,支援對裝置的時間進行校對,對應的方法為請參見iOS SDK API>校正App簽章時間。
/** * 啟用鑒權功能的初始化介面 * 初始化 開啟鑒權功能 並設定 HTTPDNS 服務 Account ID 和 鑒權功能對應的 secretKey。 * 您可以從控制台擷取您的 Account ID 、secretKey 資訊。 * 此方法會初始化為單例。 * @param accountId 您的 HTTPDNS Account ID * @param secretKey 鑒權對應的 secretKey */ - (instancetype)initWithAccountID:(int)accountID secretKey:(NSString *)secretKey;
設定預解析網域名稱
在您初始化程式時,可以選擇性的預先向HTTPDNS SDK中註冊您後續可能會使用到的網域名稱,以使SDK提前解析,減少後續解析網域名稱時請求的時延。
詳細設定請參考iOS SDK API中設定預解析網域名稱。
注意事項
務必編寫降級代碼
降級代碼指的是HTTPDNS無法擷取期望結果時的處理代碼。請參見設定降級策略相關介面。
記錄從HTTPDNS擷取的IP及sessinId
我們提供了用於解析問題排查的解決方案,需要您將從HTTPDNS擷取的IP及sessionId記錄到日誌中。
設定HTTP要求標頭HOST欄位
標準的HTTP協議中服務端會將HTTP要求標頭HOST欄位的值作為請求的網域名稱資訊進行解析。使用HTTPDNS後,您可能需要將HTTP請求URL中的HOST欄位替換為HTTPDNS解析獲得的IP,這時標準的網路程式庫會將您的IP賦值給HTTP要求標頭的HOST欄位,進而導致服務端的解析異常(服務端認可的是您的網域名稱資訊,而非IP資訊)。
為瞭解決這個問題,您可以主動設定HTTP請求HOST欄位的值,如:
NSString *originalUrl = @"http://www.aliyun.com/"; NSURL* url = [NSURL URLWithString:originalUrl]; NSMutableURLRequest* request = [[NSMutableURLRequest alloc] initWithURL:url]; // 同步介面擷取IP NSString* ip = [httpdns getIpByHostAsync:url.host]; if (ip) { // 通過HTTPDNS擷取IP成功,進行URL替換和HOST頭設定 NSRange hostFirstRange = [originalUrl rangeOfString: url.host]; if (NSNotFound != hostFirstRange.location) { NSString* newUrl = [originalUrl stringByReplacingCharactersInRange:hostFirstRange withString:ip]; request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:newUrl]]; // 佈建要求HOST欄位 [request setValue:url.host forHTTPHeaderField:@"host"]; } }
Cookie欄位
部分網路程式庫支援COOKIE的自動儲存管理,當您使用HTTPDNS進行IP URL請求時,部分網路程式庫會將您URL中的IP資訊作為COOKIE對應的網域名稱資訊進行儲存管理(而非HTTP要求標頭HOST欄位資訊),進而造成COOKIE管理與使用上的困擾,因此您需要關閉COOKIE的自動管理功能(預設關閉)。
HTTPS/WebView/SNI情境
HTTPS情境 ,請參考iOS端HTTPS(含SNI)業務情境:IP直連方案說明。
WebView情境,請參考iOS端WebView " IP直連 " 如何處理 Cookie。
代理情況下的使用
當存在中間HTTP代理時,用戶端發起的請求中請求行會使用絕對路徑的URL,在您開啟HTTPDNS並採用IP URL進行訪問時,中間代理將識別您的IP資訊並將其作為真實訪問的HOST資訊傳遞給目標伺服器,這時目標伺服器將無法處理這類無真實HOST資訊的HTTP請求。移動網關提供了
X-Online-Host
的私人協議欄位來解決這個問題,比如:目標 URL:http://www.aliyun.com/product/oss/ 通過 HTTPDNS 解析出來的www.aliyun.com的IP:1.1.1.1 代理:10.0.0.172:80 您的HTTP要求標頭: GET http://1.1.1.1/product/oss/ HTTP/1.1 # 通過代理髮起的HTTP要求標頭,請求行是一個絕對路徑 Host: www.aliyun.com # 這個Header會被代理網關忽略,代理網關會使用請求行絕對路徑中的host欄位作為來源站點的host,即1.1.1.1 X-Online-Host: www.aliyun.com # 這個Header就是移動網關為了傳遞真實Host添加的私人頭部,來源站點需要配置識別該私人頭部以擷取真實的Host資訊
同樣您可以通過下述方法進行
X-Online-Host
要求標頭域的設定,並在服務端設定對該私人頭域的解析。[request setValue:url.host forHTTPHeaderField:@"X-Online-Host"];
說明在絕大多數情境下,我們建議您在代理模式下關閉HTTPDNS功能。