移动解析 HTTPDNS IOS SDK 接入(页面导航)

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

相关产品
移动解析 HTTPDNS 产品页,含版本规格、价格与购买入口。

一、前期准备

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 工程接入

赞 (0)
上一篇 4天前
下一篇 4天前