本文档介绍在iOS客户端上使用阿里云OSS SDK接入HTTPDNS的方案。
1. 背景说明
阿里云对象存储OSS(Object Storage Service)是一款通用的云存储服务,可让开发者在各类应用中便捷地存储和访问用户头像、图片、音视频等文件。在iOS端,可以通过集成OSS iOS SDK来完成。
为了提升文件传输的稳定性和速度,可以将HTTPDNS SDK与OSS iOS SDK进行结合,对OSS域名进行解析。这可以有效实现域名防劫持和DNS解析加速,从而优化应用访问OSS的网络体验。
2. 接入方案
iOS端采用EMAS本地代理服务的方式集成HTTPDNS,通过本地代理实现OSS请求的透明转发和DNS解析优化。
通过本地代理接入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];
config.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:config.endpoint
credentialProvider:credentialProvider
clientConfiguration:config];
重要
HTTPDNS SDK初始化和代理初始化都需要在OSS SDK初始化之前完成。
当前版本暂不支持开启OSS SDK内置的HTTP请求模式
3. 总结
通过将HTTPDNS与OSS iOS SDK结合,可以有效防止DNS劫持并加速文件传输,提升访问的稳定性和安全性。实现的核心是为OSS配置带有HTTPDNS解析逻辑的本地代理服务。
关键注意点:
初始化顺序:HTTPDNS SDK和本地代理必须在OSS客户端之前初始化。
降级处理:setDNSResolverBlock是接入HTTPDNS的核心,当HTTPDNS解析无结果或失败时,务必返回nil以启用系统DNS降级。
该文章对您有帮助吗?