全部產品
Search
文件中心

HTTPDNS:iOS端HTTPDNS+阿里雲OSS SDK最佳實務

更新時間:Sep 13, 2025

本文檔介紹在iOS用戶端上使用阿里雲OSS SDK接入HTTPDNS的方案。

1. 背景說明

阿里雲Object Storage Service(Object Storage Service)是一款通用的雲端儲存體服務,可讓開發人員在各類應用中便捷地儲存和訪問帳戶圖片、圖片、音視頻等檔案。在iOS端,可以通過整合OSS iOS SDK來完成。

為了提升檔案傳輸的穩定性和速度,可以將HTTPDNS SDK與OSS iOS SDK進行結合,對OSS網域名稱進行解析。這可以有效實現網域名稱防劫持和DNS解析加速,從而最佳化應用訪問OSS的網路體驗。

2. 接入方案

iOS端採用EMAS本地代理服務的方式整合HTTPDNS,通過本地代理實現OSS請求的透明轉寄和DNS解析最佳化。

2.1 安裝HTTPDNS代理

在Podfile中添加EMASLocalProxy依賴:

source 'https://github.com/aliyun/aliyun-specs.git'

target 'yourAppTarget' do
    use_framework!
    
    pod 'AlicloudHTTPDNS', 'x.x.x'
    pod 'AliyunOSSiOS', 'x.x.x'
    pod 'EMASLocalProxy', 'x.x.x'
end

版本要求:

  • AlicloudHTTPDNS: >= 3.0.0

  • AliyunOSSiOS: >= 2.11.2

  • EMASLocalProxy: >= 1.4.0

通過本地代理接入HTTPDNS的具體細節,可以參考:本地代理方案

2.1 HTTPDNS SDK初始化

// AppDelegate.m
#import <AlicloudHttpDNS/AlicloudHttpDNS.h>

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // 初始化HTTPDNS
    HttpDnsService *httpdns = [[HttpDnsService alloc] initWithAccountID:@"your-account-id"
                                                              secretKey:@"your-secret-key"];
    [httpdns setLogEnabled:YES];
    [httpdns setHTTPSRequestEnabled:YES];
    [httpdns setPersistentCacheIPEnabled:YES];
    [httpdns setNetworkingTimeoutInterval:5];

    NSLog(@"HTTPDNS SDK 初始化完成!");
    return YES;
}

2.2 配置OSS用戶端

OSS iOS SDK分為Objective-C版本和Swift(V2)版本,兩者API不完全相同但接入HTTPDNS原理一致。本文以Objective-C版本為例進行說明。

#import <AliyunOSSiOS/AliyunOSSiOS.h>
#import <AlicloudHttpDNS/AlicloudHttpDNS.h>
#import "EMASLocalHttpProxy.h"

// 1. 配置DNS解析器
[EMASLocalHttpProxy setDNSResolverBlock:^NSArray<NSString *> * _Nullable(NSString * _Nonnull hostname) {
    HttpDnsService *httpdns = [HttpDnsService sharedInstance];
    HttpdnsResult *result = [httpdns resolveHostSync:hostname byIpType:HttpdnsQueryIPTypeBoth];

    if (result && (result.hasIpv4Address || result.hasIpv6Address)) {
        NSMutableArray<NSString *> *allIPs = [NSMutableArray array];
        if (result.hasIpv4Address) [allIPs addObjectsFromArray:result.ips];
        if (result.hasIpv6Address) [allIPs addObjectsFromArray:result.ipv6s];
        return allIPs;
    }

    return nil; // HTTPDNS解析失敗,返回nil,自動降級到系統DNS
}];


// 2. 啟動代理服務並擷取連接埠
UInt16 proxyPort = 0;
if ([EMASLocalHttpProxy isProxyReady]) {
    proxyPort = [EMASLocalHttpProxy proxyPort];
}

// 3. 建立OSS用戶端配置
id<OSSCredentialProvider> credentialProvider = [[OSSPlainTextAKSKPairCredentialProvider alloc]
    initWithPlainTextAccessKey:@"your-access-key-id"      // 替換為真實AK
    secretKey:@"your-access-key-secret"];                 // 替換為真實SK

OSSClientConfiguration *config = [OSSClientConfiguration new];
NSString *endpoint = @"https://oss-cn-hangzhou.aliyuncs.com";

// 4. 配置HTTPDNS代理
if (proxyPort > 0) {
    config.proxyHost = @"127.0.0.1";
    config.proxyPort = @(proxyPort);
}

// 5. 建立OSS用戶端
OSSClient *client = [[OSSClient alloc] initWithEndpoint:endpoint
                                      credentialProvider:credentialProvider
                                       clientConfiguration:config];
重要
  • HTTPDNS SDK初始化和代理初始化都需要在OSS SDK初始化之前完成。

3. 總結

通過將HTTPDNS與OSS iOS SDK結合,可以有效防止DNS劫持並加速檔案傳輸,提升訪問的穩定性和安全性。實現的核心是為OSS配置帶有HTTPDNS解析邏輯的本地代理服務。

關鍵注意點:

  • 初始化順序:HTTPDNS SDK和本地代理必須在OSS用戶端之前初始化。

  • 降級處理:setDNSResolverBlock是接入HTTPDNS的核心,當HTTPDNS解析無結果或失敗時,務必返回nil以啟用系統DNS降級。