tencent cloud

移动解析 HTTPDNS

产品简介
产品介绍
应用场景
产品优势
产品限制
购买指南
计费说明
欠费说明
快速入门
开通移动解析 HTTPDNS
接入移动解析 HTTPDNS
操作指南
添加域名
解析量统计说明
解析监控
API 文档
配置信息说明
HTTP 请求方式查询
AES、DES 加密解密说明
API 接入实践教程
SDK 文档
SDK 快速接入
IOS SDK 文档
Android SDK 文档
访问管理及协作
访问管理概述
访问管理策略示例
常见问题
HTTPDNS 政策
隐私协议
数据处理和安全协议

IOS SDK 接入

PDF
聚焦模式
字号
最后更新时间: 2025-10-13 15:31:03

概述

移动解析 HTTPDNS 的主要功能是为了有效避免由于运营商传统 LocalDNS 解析导致的无法访问最佳接入点的方案。原理为使用 HTTP 加密协议替代传统的 DNS 协议,整个过程不使用域名,大大减少劫持的可能性。

前期准备

1. 开通移动解析 HTTPDNS 服务,详情请参见 开通移动解析 HTTPDNS
2. 服务开通后,您需在移动解析 HTTPDNS 控制台添加解析域名才可正常使用,详情请参见 添加域名

安装包

名称
适用说明
MSDKDns.xcframework
适用 “Build Setting->C++ Language Dialect” 配置为 “GNU++98”,“Build Setting->C++ Standard Library” 为 “libstdc++(GNU C++ standard library)” 的工程。
MSDKDns_intl.xcframework
MSDKDns.xcframework 的国际站版本。
MSDKDns_C11.xcframework
适用于该两项配置分别为 “GNU++11”和“libc++(LLVM C++ standard library with C++11 support)”的工程。
MSDKDns_C11_intl.xcframework
MSDKDns_C11.xcframework 的国际站版本。
注意:
在使用国际站版本时,初始化配置需要前往 HTTPDNS 国际站控制台中获取。

SDK 集成

说明:
快速接入,请参见 SDK 快速接入
移动解析 HTTPDNS 提供以下两种集成方式供 iOS 开发者选择:
通过 CocoaPods 集成。
手动集成。

通过 CocoaPods 集成

1. 安装 CocoaPods
在终端窗口中输入如下命令(需要提前在 Mac 中安装 Ruby 环境):
sudo gem install cocoapods
2. 创建 Podfile 文件
进入项目所在路径,输入以下命令行之后项目路径下会出现一个 Podfile 文件。
pod init
3. 编辑 Podfile 文件
在工程的 Podfile 里面添加以下代码:
# 适用“Build Setting->C++ Language Dialect”配置为**“GNU++98”**,“Build Setting->C++ Standard Library”为**“libstdc++(GNU C++ standard library)”**的工程。
pod 'MSDKDns_intl'
# 适用于该两项配置分别为**“GNU++11”**和**“libc++(LLVM C++ standard library with C++11 support)”**的工程。
# pod 'MSDKDns_C11_intl'
4. 更新并安装 SDK
终端窗口中输入如下命令以更新本地库文件
pod install
或使用以下命令更新本地库版本:
pod update
pod 命令执行完后,会生成集成了 SDK 的.xcworkspace后缀的工程文件,双击打开即可。
说明:
关于 CocoaPods 的更多信息,请查看 CocoaPods 官方网站

手动集成

手动集成可以参考以下案例:
执行以下步骤:
1. 引入依赖库,将 HTTPDNSLibs 目录中的 framework 拖入对应 Target 下即可,在弹出框中勾选 Copy items if needed:
MSDKDns_C11_intl.framework(或 MSDKDns.framework,根据工程配置选其一)

2. 引入系统库:
libz.tbd
libsqlite3.tbd
libc++.tbd
Foundation.framework
CoreTelephony.framework
SystemConfiguration.framework
CoreGraphics.framework
Security.framework
3. ObjC 配置:
iOS 端集成 SDK 时需要做-ObjC 配置,即应用的 MSDKDnsDemo -> Build Settings -> Linking -> Other Linker Flags ,需添加上 -ObjC 这个属性,如下图所示:


SDK 初始化

1. 引入 SDK 头文件
Objective-C
Swift
#import <MSDKDns_C11_intl/MSDKDns.h>
// 在桥接头文件中引入
#import "MSDKDns_C11_intl/MSDKDns.h"
2. 接口调用示例:
Objective-C
Swift
//.m文件使用如下方式:
DnsConfig config = {
.dnsId = dns授权id, // 从移动解析腾讯云控制台中获取,可以参考上文“前期准备”的截图,“授权ID”在左上角位置
.dnsKey = @"加密密钥",
.encryptType = HttpDnsEncryptTypeDES,
.debug = YES,
.timeout = 2000,
};
[[MSDKDns sharedInstance] initConfig: &config];
// .mm文件可以使用如下方式:
DnsConfig *config = new DnsConfig();
config->dnsId = dns授权id; // 从移动解析腾讯云控制台中获取,可以参考上文“前期准备”的截图,“授权ID”在左上角位置
config->dnsKey = @"加密密钥";
config->encryptType = HttpDnsEncryptTypeDES;
config->debug = YES;
config->timeout = 2000;
[[MSDKDns sharedInstance] initConfig: config];
let msdkDns = MSDKDns.sharedInstance() as? MSDKDns;
msdkDns?.initConfig(with: [
"dnsId": "dns授权id", // 从移动解析腾讯云控制台中获取,可以参考上文“前期准备”的截图,“授权ID”在左上角位置
"dnsKey": "加密密钥",
"encryptType": 0, // 0 -> des,1 -> aes
]);
注意:
iOS 9 引入了新特性 App Transport Security (ATS),新特性要求 App 内网络访问必须使用 HTTPS 协议。
SDK 初始化的加密方式设置 DESAES(参数:encryptType),使用的是基于 HTTP 的加签机制,保证访问安全,不是使用 HTTPS,所以需要添加特殊配置,具体如下:
在 Info.plist 文件中添加关键字:添加 NSAppTransportSecurity 类型 Dictionary,在 NSAppTransportSecurity 下添加 NSAllowsArbitraryLoads 类型的 Boolean,值设为 YES 。

接入验证

说明:
使用 SDK 方式接入 HTTPDNS,若 HTTPDNS 未查询到解析结果,会返回 LocalDNS 的解析结果,所以需要使用日志验证来确保 HTTPDNS 接入成功。

日志验证

开启 SDK 调试日志(设置 DnsConfig 中 debug 为 YES),找到打印的 api name:HDNSGetHostByName, data: { ... } 日志,并检查 HTTPDNS(日志上为 hdns_ip)和 LocalDns(日志上为 ldns_ip)相关日志,可以确认接入是否成功。
key 为 hdns_ip 的是 HTTPDNS A 记录的解析结果。
key 为 hdns_4a_ips 的是 HTTPDNS AAAA 记录的解析结果。
如果 hdns_iphdns_4a_ips 不为空,则说明接入成功。
key 为 ldns_ip 的是 LocalDNS 的解析结果。

注意事项

如客户端的业务与 host 绑定,例如绑定了 host 的 HTTP 服务或者是 cdn 的服务,那么在用 HTTPDNS 返回的 IP 替换掉 URL 中的域名以后,还需要指定下 HTTP 头的 host 字段。示例如下:
NSURLConnection
NSURLSession
curl
Unity 的 WWW 接口
AFNetworking
NSURL *httpDnsURL = [NSURL URLWithString:@"使用解析结果ip拼接的URL"];
float timeOut = 设置的超时时间;
NSMutableURLRequest *mutableReq = [NSMutableURLRequest requestWithURL:httpDnsURL cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval: timeOut];
[mutableReq setValue:@"原域名" forHTTPHeaderField:@"host"];
NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:mutableReq delegate:self];
[connection start];
NSURL *httpDnsURL = [NSURL URLWithString:@"使用解析结果ip拼接的URL"];
float timeOut = 设置的超时时间;
NSMutableURLRequest *mutableReq = [NSMutableURLRequest requestWithURL:httpDnsURL cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval: timeOut];
[mutableReq setValue:@"原域名" forHTTPHeaderField:@"host"];
NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
NSURLSession *session = [NSURLSession sessionWithConfiguration:configuration delegate:self delegateQueue:[NSOperationQueue currentQueue]];
NSURLSessionTask *task = [session dataTaskWithRequest:mutableReq];
[task resume];
假设您要访问 www.qq.com,通过 HTTPDNS 解析出来的 IP 为192.168.0.111,那么通过以下方式调用即可:
curl -H "host:www.qq.com" http://192.168.0.111/aaa.txt.
string httpDnsURL = "使用解析结果ip拼接的URL";
Dictionary<string, string> headers = new Dictionary<string, string> ();
headers["host"] = "原域名";
WWW conn = new WWW (url, null, headers);
yield return conn;
if (conn.error != null) {
print("error is happened:"+ conn.error);
} else {
print("request ok" + conn.text);
}
NSURL *httpDnsURL = [NSURL URLWithString:@"使用解析结果ip拼接的URL"];
float timeOut = 设置的超时时间;
NSMutableURLRequest *mutableReq = [NSMutableURLRequest requestWithURL:httpDnsURL cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval: timeOut];
[mutableReq setValue:@"原域名" forHTTPHeaderField:@"host"];
NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
AFHTTPSessionManager* sessionManager = [[AFHTTPSessionManager alloc] initWithSessionConfiguration:config];
sessionManager.responseSerializer = [AFHTTPResponseSerializer serializer];
NSURLSessionDataTask *task = [sessionManager dataTaskWithRequest:mutableReq
uploadProgress:nil
downloadProgress:nil
completionHandler:^(NSURLResponse * _Nonnull response, id _Nullable responseObject, NSError * _Nullable error) {
if (!error) {
NSString *responseString = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
NSLog(@"request complete ==== response: %@ ===== error: nil", responseString);
} else {
NSLog(@"request complete ==== response: nil ===== error: %@", error);
}
}];
[task resume];
检测本地是否使用了 HTTP 代理。如使用了 HTTP 代理,建议不要使用 HTTPDNS 做域名解析。
- (BOOL)isUseHTTPProxy {
CFDictionaryRef dicRef = CFNetworkCopySystemProxySettings();
const CFStringRef proxyCFstr = (const CFStringRef)CFDictionaryGetValue(dicRef, (const void*)kCFNetworkProxiesHTTPProxy);
NSString *proxy = (__bridge NSString *)proxyCFstr;
if (proxy) {
return YES;
} else {
return NO;
}
}

SDK 接口和实践

API 接口

SDK API 接口具体可以参考以下文档:

SDK 实现教程

SDK 实现教程可以参考以下案例:

帮助和支持

本页内容是否解决了您的问题?

填写满意度调查问卷,共创更好文档体验。

文档反馈