iOS端HTTPDNS+阿里云OSS SDK最佳实践

本文档介绍在iOS客户端上使用阿里云OSS SDK接入HTTPDNS的方案。

1. 背景说明

阿里云对象存储OSS(Object Storage Service)是一款通用的云存储服务,可让开发者在各类应用中便捷地存储和访问用户头像、图片、音视频等文件。在iOS端,可以通过集成OSS iOS SDK来完成。

为了提升文件传输的稳定性和速度,可以将HTTPDNS SDKOSS 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. 总结

通过将HTTPDNSOSS iOS SDK结合,可以有效防止DNS劫持并加速文件传输,提升访问的稳定性和安全性。实现的核心是为OSS配置带有HTTPDNS解析逻辑的本地代理服务。

关键注意点:

  • 初始化顺序:HTTPDNS SDK和本地代理必须在OSS客户端之前初始化。

  • 降级处理:setDNSResolverBlock是接入HTTPDNS的核心,当HTTPDNS解析无结果或失败时,务必返回nil以启用系统DNS降级。