全部產品
Search
文件中心

HTTPDNS:iOS SDK接入

更新時間:Jul 13, 2024

本章節介紹HTTPDNS iOS SDK的使用方法。

前提條件

  • 使用手動添加依賴方式,請提前下載SDK包,最新版本為:V2.0.8-intl

  • 使用統一接入添加依賴需提前在控制台下載設定檔。

使用限制

  • 只支援靜態庫,不支援動態庫。

  • Xcode版本要求:7.0及以上版本。

範例代碼

HTTPDNS IOS SDK接入工程範例參見HTTPDNS iOS Demo

整合步驟

  1. 添加依賴

    1. 方式一:Pod整合

      1. 指定Master倉庫和阿里雲倉庫

        source 'https://github.com/CocoaPods/Specs.git'
        source 'https://github.com/aliyun/aliyun-specs.git'
      2. 添加依賴

        pod 'AlicloudHTTPDNS', '2.0.8-intl'
    2. 方式二:手動整合

      1. 解壓下載好的SDK包,在Xcode中,把SDK包目錄中的framework拖入對應Target下即可,在彈出框勾選Copy items if needed

        AlicloudBeacon.framework
        AlicloudHttpDNS.framework
        UTDID.framework
        AlicloudUtils.framework
        UTMini.framework
        AlicloudSender.framework
        EMASRest.framework
      2. 在工程專案中(Build Phases -> Link Binary With Libraries)添加以下庫檔案。

        libsqlite3.0.tbd
        libresolv.tbd
        CoreTelephony.framework
        SystemConfiguration.framework
  2. ObjC配置

    iOS端整合SDK時需要做-ObjC配置,即應用的 TARGETS -> Build Settings -> Linking -> Other Linker Flags ,需添加上 -ObjC 這個屬性。

    如何修改編譯選項

    重要

    請注意-ObjC的大小寫。

  3. 匯入標頭檔

    添加以下程式碼片段:

     #import <AlicloudHttpDNS/AlicloudHttpDNS.h>
  4. 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;
  5. 設定預解析網域名稱

    在您初始化程式時,可以選擇性的預先向HTTPDNS SDK中註冊您後續可能會使用到的網域名稱,以使SDK提前解析,減少後續解析網域名稱時請求的時延。

    詳細設定請參考iOS SDK API中設定預解析網域名稱。

注意事項

  1. 務必編寫降級代碼

    降級代碼指的是HTTPDNS無法擷取期望結果時的處理代碼。請參見設定降級策略相關介面

  2. 記錄從HTTPDNS擷取的IP及sessinId

    我們提供了用於解析問題排查的解決方案,需要您將從HTTPDNS擷取的IP及sessionId記錄到日誌中。

  3. 設定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"];
        }
    }
  4. Cookie欄位

    部分網路程式庫支援COOKIE的自動儲存管理,當您使用HTTPDNS進行IP URL請求時,部分網路程式庫會將您URL中的IP資訊作為COOKIE對應的網域名稱資訊進行儲存管理(而非HTTP要求標頭HOST欄位資訊),進而造成COOKIE管理與使用上的困擾,因此您需要關閉COOKIE的自動管理功能(預設關閉)。

  5. HTTPS/WebView/SNI情境

    HTTPS情境 ,請參考iOS端HTTPS(含SNI)業務情境:IP直連方案說明

    WebView情境,請參考iOS端WebView " IP直連 " 如何處理 Cookie

  6. 代理情況下的使用

    當存在中間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功能。