文档捉虫大赛:人工智能与机器学习专题> HOT

概述

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

前期准备

1. 开通移动解析 HTTPDNS 服务,详情请参见 开通移动解析 HTTPDNS
2. 服务开通后,您需在移动解析 HTTPDNS 控制台添加解析域名才可正常使用,详情请参见 添加域名
3. 在移动解析 HTTPDNS 控制台申请接入 SDK,详情请参见 开通 SDK
4. SDK 开通后,移动解析 HTTPDNS 将为您分配授权 ID、AES 和 DES 加密密钥及 HTTPS Token 等配置信息。您可前往 开发配置 页面查看,如下图所示:

使用 iOS SDK 需求获取的配置如下:
授权 ID:使⽤移动解析 HTTPDNS 服务中,开发配置的唯⼀标识。SDK 中 dnsId 参数,用于域名解析鉴权。
DES加密密钥:SDK 中 dnsKey 参数,加密方式为 DES 时传入此项。
AES加密密钥:SDK 中 dnsKey 参数,加密方式为 AES 时传入此项。
HTTPS加密Token:SDK 中 token 参数,加密方式为 HTTPS 时传入此项。
IOS APPID(可选):腾讯云控制台申请获得,用于数据上报。

安装包结构

名称
适用说明
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 集成

移动解析 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 的文件打开工程。
说明
关于 CocoaPods 的更多信息,请查看 CocoaPods 官方网站

手动集成

手动集成可以参考以下案例:
执行以下步骤:
1. 引入依赖库(位于 HTTPDNSLibs 目录下):
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 = {
        .dnsIp = @"HTTPDNS 服务器IP",
        .dnsId = dns授权id, // 从移动解析腾讯云控制台中获取,可以参考上文“前期准备”的截图,“授权ID”在左上角位置
        .dnsKey = @"加密密钥",
.encryptType = HttpDnsEncryptTypeDES,
        .debug = YES,
        .timeout = 2000,
  };
[[MSDKDns sharedInstance] initConfig: &config];
// .mm文件可以使用如下方式:
DnsConfig *config = new DnsConfig();
config->dnsIp = @"HTTPDNS 服务器IP";
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: [
"dnsIp": "HTTPDNS 服务器IP",
"dnsId": "dns授权id", // 从移动解析腾讯云控制台中获取,可以参考上文“前期准备”的截图,“授权ID”在左上角位置
"dnsKey": "加密密钥",
"encryptType": 0, // 0 -> des,1 -> aes,2 -> https
]);

接入验证

日志验证

开启 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 接口
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 做域名解析。
检测是否使用了 HTTP 代理:
- (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;
}
}
检测是否使用了 HTTPS 代理:
- (BOOL)isUseHTTPSProxy {
CFDictionaryRef dicRef = CFNetworkCopySystemProxySettings();
const CFStringRef proxyCFstr = (const CFStringRef)CFDictionaryGetValue(dicRef, (const void*)kCFNetworkProxiesHTTPSProxy);
NSString *proxy = (__bridge NSString *)proxyCFstr;
if (proxy) {
return YES;
} else {
return NO;
}
}