本文檔介紹在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降級。