概述
移动解析 HTTPDNS 的主要功能是为了有效避免由于运营商传统 LocalDNS 解析导致的无法访问最佳接入点的方案。原理为使用 HTTP 加密协议替代传统的 DNS 协议,整个过程不使用域名,大大减少劫持的可能性。
前期准备
1. 开通移动解析 HTTPDNS 服务,详情请参见 开通移动解析 HTTPDNS。
2. 服务开通后,您需在移动解析 HTTPDNS 控制台添加解析域名才可正常使用,详情请参见 添加域名。
安装包
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 的国际站版本 |
注意:
SDK 集成
说明:
移动解析 HTTPDNS 提供以下两种集成方式供 IOS 开发者选择:
通过 CocoaPods 集成
手动集成
通过 CocoaPods 集成
1. 在工程的 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'
2. 保存并执行
pod install
,再使用后缀为 .xcworkspace
的文件打开工程。说明:
手动集成
手动集成可以参考以下案例:
执行以下步骤:
1. 引入依赖库,将 HTTPDNSLibs 目录中的 framework 拖入对应 Target 下即可,在弹出框中勾选 Copy items if needed:
MSDKDns_C11.framework(或 MSDKDns.framework,根据工程配置选其一)
2. 引入系统库:
libz.tbd
libsqlite3.tbd
libc++.tbd
Foundation.framework
CoreTelephony.framework
SystemConfiguration.framework
CoreGraphics.framework
Security.framework
注意:
请在 Other linker flag 里加入 -ObjC 标志。
SDK 初始化
接口调用示例:
在 Objective-C 项目中。
//.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];
在 Swift 项目中。
let msdkDns = MSDKDns.sharedInstance() as? MSDKDns;msdkDns?.initConfig(with: ["dnsId": "dns授权id", // 从移动解析腾讯云控制台中获取,可以参考上文“前期准备”的截图,“授权ID”在左上角位置"dnsKey": "加密密钥","encryptType": 0, // 0 -> des,1 -> aes,2 -> 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 字段。示例如下:
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);}
检测本地是否使用了 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;}}