一、前期准备
1. 开通移动解析 HTTPDNS 服务,详情请参见 开通移动解析 HTTPDNS。
2. 服务开通后,你需在移动解析 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 集成
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'# 适用于该两项配置分别为**“GNU++11”**和**“libc++(LLVM C++ standard library with C++11 support)”**的工程。# pod 'MSDKDns_C11'
4. 更新并安装 SDK
·终端窗口中输入如下命令以更新本地库文件
pod install
·或使用以下命令更新本地库版本:
pod update
·pod 命令执行完后,会生成集成了 SDK 的.xcworkspace后缀的工程文件,双击打开即可。
注意:说明:
注意:关于 CocoaPods 的更多信息,请查看 CocoaPods 网站。
五、手动集成
手动集成可以参考以下案例:
·Objective-C Demo 下载地址
·Swift Demo 下载地址
执行以下步骤:
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
3. ObjC 配置:
iOS 端集成 SDK 时需要做-ObjC 配置,即应用的 MSDKDnsDemo -> Build Settings -> Linking -> Other Linker Flags ,需添加上 -ObjC 这个属性:
六、SDK 初始化
1. 引入 SDK 头文件
Objective-CSwift #import <MSDKDns_C11/MSDKDns.h>// 在桥接头文件中引入#import "MSDKDns_C11/MSDKDns.h"
2. 接口调用示例:
Objective-CSwift //.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,2 -> https]);
注意: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 字段。示例如下:
NSURLConnectionNSURLSessioncurlUnity 的 WWW 接口AFNetworkingNSURL *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; }}
十、API 接口
SDK API 接口具体可以参考以下文档:
·iOS SDK API 接口
十一、SDK 实现教程
SDK 实现教程可以参考以下案例:
·HTTPS(非 SNI)场景
·HTTPS(SNI)场景
·WKWebView 实践
·Unity 工程接入