IOS SDK 接入
概述
移动解析 HTTPDNS 的主要功能是为了有效避免由于运营商传统 LocalDNS 解析导致的无法访问最佳接入点的方案。原理为使用 HTTP 加密协议替代传统的 DNS 协议,整个过程不使用域名,大大减少劫持的可能性。
前期准备
开通移动解析 HTTPDNS 服务,详情请参见 开通移动解析 HTTPDNS。
服务开通后,您需在移动解析 HTTPDNS 控制台添加解析域名才可正常使用,详情请参见 添加域名。
安装包
SDK 最新版本包下载地址
SDK 开源仓库地址
Demo 地址
名称
适用说明
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 集成
安装 CocoaPods
在终端窗口中输入如下命令(需要提前在 Mac 中安装 Ruby 环境):
sudo gem install cocoapods
创建 Podfile 文件
进入项目所在路径,输入以下命令行之后项目路径下会出现一个 Podfile 文件。
pod init
编辑 Podfile 文件
在工程的 Podfile 里面添加以下代码:
# 适用“Build Setting->C++ Language Dialect”配置为**“GNU++98”**,“Build Setting->C++ Standard Library”为**“libstdc++(GNU C++ standard library)”**的工程。
pod 'MSDKDns'
# 适用于该两项配置分别为**“GNU++11”**和**“libc++(LLVM C++ standard library with C++11 support)”**的工程。
# pod 'MSDKDns_C11'
更新并安装 SDK
终端窗口中输入如下命令以更新本地库文件
pod install
或使用以下命令更新本地库版本:
pod update
pod 命令执行完后,会生成集成了 SDK 的.xcworkspace后缀的工程文件,双击打开即可。
说明:
关于 CocoaPods 的更多信息,请查看 CocoaPods 官方网站。
手动集成
手动集成可以参考以下案例:
Objective-C Demo 下载地址
Swift Demo 下载地址
执行以下步骤:
引入依赖库,将 HTTPDNSLibs 目录中的 framework 拖入对应 Target 下即可,在弹出框中勾选 Copy items if needed:
MSDKDns_C11.framework(或 MSDKDns.framework,根据工程配置选其一)
引入系统库:
libz.tbd
libsqlite3.tbd
libc++.tbd
Foundation.framework
CoreTelephony.framework
SystemConfiguration.framework
CoreGraphics.framework
Security.framework
ObjC 配置:
iOS 端集成 SDK 时需要做-ObjC 配置,即应用的 MSDKDnsDemo -> Build Settings -> Linking -> Other Linker Flags ,需添加上 -ObjC 这个属性,如下图所示:
SDK 初始化
引入 SDK 头文件
Objective-C
Swift
#import
接口调用示例:
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];
注意:
iOS 9 引入了新特性 App Transport Security (ATS),新特性要求 App 内网络访问必须使用 HTTPS 协议。
SDK 初始化的加密方式设置 DES 和 AES(参数: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_ip 或 hdns_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];
检测本地是否使用了 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 接口和实践

