设置业务基本信息
类型定义
说明:
【V1.7.0 废弃】sdk日志上报能力由控制台控制。
typedef enum {
HttpDnsEncryptTypeDES = 0,
HttpDnsEncryptTypeAES = 1,
HttpDnsEncryptTypeHTTPS = 2
} HttpDnsEncryptType;
typedef enum {
HttpDnsAddressTypeAuto = 0,
HttpDnsAddressTypeIPv4 = 1,
HttpDnsAddressTypeIPv6 = 2,
HttpDnsAddressTypeDual = 3,
} HttpDnsAddressType;
typedef struct DnsConfigStruct {
NSString* appId;
int dnsId;
NSString* dnsKey;
NSString* token;
NSString* dnsIp;
BOOL debug;
int timeout;
HttpDnsEncryptType encryptType;
HttpDnsAddressType addressType;
NSString* routeIp;
BOOL httpOnly;
NSUInteger retryTimesBeforeSwitchServer;
NSUInteger minutesBeforeSwitchToMain;
BOOL enableReport;
} DnsConfig;
接口声明
- (BOOL) initConfig:(DnsConfig *)config;
- (BOOL) initConfigWithDictionary:(NSDictionary *)config;
- (void) WGSetPreResolvedDomains:(NSArray *)domains;
- (void) WGSetKeepAliveDomains:(NSArray *)domains;
- (void) WGSetIPRankData:(NSDictionary *)IPRankData;
- (void) WGSetExpiredIPEnabled:(BOOL)enable;
- (void) WGSetPersistCacheIPEnabled:(BOOL)enable;
注意:
HTTPDNS SDK 提供多重解析优化策略,建议根据实际情况选配,也可以组合使用,可使得解析成功率达到最优效果。
可以通过配置 (void) WGSetExpiredIPEnabled:(true)enable;
和 (void) WGSetPersistCacheIPEnabled:(true)enable;
来实现乐观 DNS 缓存。
该功能旨在提升缓存命中率和首屏加载速度。持久化缓存会将上一次解析结果保持在本地,在 App 启动时,会优先读取到本地缓存解析结果。
存在使用缓存 IP 时为过期 IP(TTL 过期),该功能启用了允许使用过期 IP,乐观的推定 TTL 过期,大多数情况下该 IP 仍能正常使用。优先返回缓存的过期结果,同时异步发起解析服务,更新缓存。
乐观 DNS 缓存在首次解析域名(无缓存)时,无法命中缓存,返回0;0,同时也会异步发起解析服务,更新缓存。在启用该功能后需自行 LocalDNS 兜底。核心域名建议配置预解析服务 (void) WGSetPreResolvedDomains:(NSArray *)domains;
。
如果业务服务器 IP 变化比较频繁,务必启用缓存自动刷新 (void) WGSetKeepAliveDomains:(NSArray *)domains;
、预解析能力 (void) WGSetPreResolvedDomains:(NSArray *)domains;
,以确保解析结果的准确性。
示例代码
接口调用示例:
在 Objective-C 项目中。
DnsConfig *config = new DnsConfig();
config->dnsIp = @"HTTPDNS 服务器IP";
config->dnsId = dns授权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",
"dnsKey": "加密密钥",
"encryptType": 0,
]);
域名解析接口
获取 IP 共有以下四个接口,引入头文件,调用相应接口即可。批量查询,单次不能超过8个域名。
同步接口
单个查询 WGGetHostByName:;
批量查询(返回单个 IP)WGGetHostsByNames:;
批量查询(返回所有 IP)WGGetAllHostsByNames:;
注意:
同步接口会阻塞,建议在子线程中调用或者切换为异步接口。
异步接口
单个查询 WGGetHostByNameAsync:returnIps:;
批量查询 (返回单个 IP)WGGetHostsByNamesAsync:returnIps:;
批量查询(返回所有 IP)WGGetAllHostsByNamesAsync:returnIps:;
返回的地址格式如下:
单个查询:单个查询接口返回 NSArray,固定长度为2,其中第一个值为 IPv4 地址,第二个值为 IPv6 地址。以下为返回格式的详细说明:
IPv4 下,仅返回 IPv4 地址,即返回格式为:[ipv4, 0]。
IPv6 下,仅返回 IPv6 地址,即返回格式为:[0, ipv6]。
双栈网络下,返回解析到 IPv4&IPv6(如果存在)地址,即返回格式为:[ipv4, ipv6]。
解析失败,返回[0, 0],业务重新调用 WGGetHostByName 接口即可。
批量查询(返回单个 IP):批量查询接口返回 NSDictionary,key 为查询的域名,value 为 NSArray,固定长度为2,其他第一个值为 IPv4 地址,第二个值为 IPv6 地址。以下为返回格式的详细说明:
IPv4 下,仅返回 IPv4 地址,即返回格式为:{"queryDomain" : [ipv4, 0]}。
IPv6 下,仅返回 IPv6 地址,即返回格式为:{"queryDomain" : [0, ipv6]}。
双栈网络下,返回解析到 IPv4&IPv6(如果存在)地址,即返回格式为:{"queryDomain" : [ipv4, ipv6]}。
解析失败,返回{"queryDomain" : [0, 0]},业务重新调用 WGGetHostsByNames 接口即可。
批量查询(返回所有 IP):批量查询接口返回 NSDictionary,key 为查询的域名,value 为 NSDictionary,包含两个 key(ipv4、ipv6),对应的 value 为 NSArray 对象,表示所有的ipv4/ipv6 解析结果 IP。以下为返回格式的详细说明:
返回格式为:{"queryDomain" : { "ipv4": [], "ipv6": []}}。
如何提高IPv6使用率:
使用 IPv6 地址进行 URL 请求时,需添加方框号[ ]进行处理,例如:http://[64:ff9b::b6fe:7475]/
。
如 IPv6 地址为0,则直接使用 IPv4 地址连接。
如 IPv4 地址为0,则直接使用 IPv6 地址连接。
如 IPv4 和 IPv6 地址都不为0,则由客户端决定优先使用哪个地址进行连接,但优先地址连接失败时应切换为另一个地址。
使用 SDK 方式接入 HTTPDNS,若 HTTPDNS 未查询到解析结果,则通过 LocalDNS 进行域名解析,返回 LocalDNS 的解析结果。
同步解析接口
接口名称
WGGetHostByName、WGGetHostsByNames
接口声明
- (NSArray *) WGGetHostByName:(NSString *) domain;
- (NSDictionary *) WGGetHostsByNames:(NSArray *) domains;
示例代码
接口调用示例:
NSArray *ipsArray = [[MSDKDns sharedInstance] WGGetHostByName: @"qq.com"];
if (ipsArray && ipsArray.count > 1) {
NSString *ipv4 = ipsArray[0];
NSString *ipv6 = ipsArray[1];
if (![ipv6 isEqualToString:@"0"]) {
} else if (![ipv4 isEqualToString:@"0"]){
} else {
}
}
NSDictionary *ipsDict = [[MSDKDns sharedInstance] WGGetHostsByNames: @[@"qq.com", @"dnspod.cn"]];
NSArray *ips = [ipsDict objectForKey: @"qq.com"];
if (ips && ips.count > 1) {
NSString *ipv4 = ips[0];
NSString *ipv6 = ips[1];
if (![ipv6 isEqualToString:@"0"]) {
} else if (![ipv4 isEqualToString:@"0"]){
} else {
}
}
异步解析接口
接口名称
WGGetHostByNameAsync、WGGetHostsByNamesAsync
接口声明
- (void) WGGetHostByNameAsync:(NSString *) domain returnIps:(void (^)(NSArray *ipsArray))handler;
- (void) WGGetHostsByNamesAsync:(NSArray *) domains returnIps:(void (^)(NSDictionary * ipsDictionary))handler;
示例代码
等待完整解析过程结束后,拿到结果,进行连接操作。
优点:可保证每次请求都能拿到返回结果进行接下来的连接操作。
缺点:异步接口的处理较同步接口稍显复杂。
[[MSDKDns sharedInstance] WGGetHostByNameAsync:@"qq.com" returnIps:^(NSArray *ipsArray) {
if (ipsArray && ipsArray.count > 1) {
NSString *ipv4 = ipsArray[0];
NSString *ipv6 = ipsArray[1];
if (![ipv6 isEqualToString:@"0"]) {
} else if (![ipv4 isEqualToString:@"0"]){
} else {
}
}
}];
[[MSDKDns sharedInstance] WGGetHostsByNamesAsync:@[@"qq.com", @"dnspod.cn"] returnIps:^(NSDictionary *ipsDict) {
NSArray *ips = [ipsDict objectForKey: @"qq.com"];
if (ips && ips.count > 1) {
NSString *ipv4 = ips[0];
NSString *ipv6 = ips[1];
if (![ipv6 isEqualToString:@"0"]) {
} else if (![ipv4 isEqualToString:@"0"]){
} else {
}
}
}];
无需等待,可直接拿到缓存结果,如无缓存,则 result 为 nil。
优点:对于解析时间有严格要求的业务,使用本示例,可无需等待,直接拿到缓存结果进行后续的连接操作,完全避免了同步接口中解析耗时可能会超过 100ms 的情况。
缺点:第一次请求时,result 一定会 nil,需业务增加处理逻辑。
__block NSArray* result;
[[MSDKDns sharedInstance] WGGetHostByNameAsync:domain returnIps:^(NSArray *ipsArray) {
result = ipsArray;
}];
//无需等待,可直接拿到缓存结果,如无缓存,则 result 为 nil
if (result) {
//拿到缓存结果,进行连接操作
} else {
//本次请求无缓存,业务可走原始逻辑
}
本页内容是否解决了您的问题?