首先下载 阿里云 HttpDns 官方 iOS_Demo 有助于我们借鉴学习
然后 打开 下载好的 Demo 阅读 README.md 文件
HTTPDNS iOS Demo
该Demo提供了App不同应用场景集成HTTPDNS服务的示例。
Demo仅作为原理讲解和示例代码用途,
强烈建议在搞清楚各场景下HTTPDNS接入实现细节和原理后,再集成到App线上环境。
1. 普通场景
基于网络API NSURLSession/NSURLConnection发送HTTP请求;
相关示例代码:
ViewController
2. WebView场景
WebView发起的HTTP网络请求,通过注册的NSURLProtocol拦截后处理;
相关示例代码:
WebViewController
WebViewURLProtocol
3. HTTPS场景
3.1 普通HTTPS请求
基于网络API NSURLSession/NSURLConnection发送HTTPS请求;
相关示例代码:
HTTPSSceneViewController
3.2 SNI场景HTTPS请求
基于WebView/NSURLSession/NSURLConnection发送的HTTPS(SNI场景)网络请求, 经过注册的NSURLProtocol拦截后,基于CFNetwork发出网络请求。
相关示例代码:
SNIViewController
CFHTTPDNSRequestTaskDelegate
CFHTTPDNSHTTPProtocol
CFHTTPDNSRequestTask
已经说得比较详细 那我们就开始配置我们的项目
需要登录阿里云网站并且 开通该服务 下载 HttpDns iOS_SDK (这里是手动集成的)
把下载好的 SDK 拖入项目中 并在项目里添加 依赖 系统公共库:
- libresolv.tbd
- CoreTelephony.framework
- SystemConfiguration.framework
获取服务实例
HTTPDNS iOS SDK 以全局service实例的方式提供域名解析服务,可以通过以下方式获取实例:
- 在 AppDelegate.m 文件中 导入头文件 #import <AlicloudHttpDNS/AlicloudHttpDNS.h>
- 在 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 方法中初始化SDK
// 初始化HTTPDNS
HttpDnsService *httpdns = [HttpDnsService sharedInstance];
// 设置AccoutID,当您开通HTTPDNS服务时,您可以在控制台获取到您对应的Accout ID信息
[httpdns setAccountID:*****];
设置预解析域名
在您初始化程序时,可以选择性地预先向HTTPDNS SDK中注册您后续可能会使用到的域名,以便SDK提前解析,减少后续解析域名时请求的时延。您只需调用以下接口:
NSArray * hosts = [[NSArray alloc] initWithObjects:@"www.taobao.com", @"www.aliyun.com", nil];
[httpdns setPreResolveHosts:hosts];
附:代码
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
// 1=====================================
// 初始化HTTPDNS
HttpDnsService *httpdns = [HttpDnsService sharedInstance];
// 设置AccoutID
[httpdns setAccountID:160605];
// 2=====================================
// 设置HTTPDNS域名解析请求类型(HTTP/HTTPS),
// 若不调用该接口,默认为HTTP请求;
// SDK内部HTTP请求基于CFNetwork实现,不受ATS限制。
// [httpdns setHTTPSRequestEnabled:YES];
// 3=====================================
// 在您初始化程序时,可以选择性地预先向HTTPDNS SDK中注册您后续可能会使用到的域名,
// 以便SDK提前解析,减少后续解析域名时请求的时延
NSArray * hosts = [[NSArray alloc] initWithObjects:@"www.taobao.com", @"www.aliyun.com", nil];
// 设置预解析域名列表
[httpdns setPreResolveHosts:hosts];
// 4=====================================
// 打开HTTPDNS Log,线上建议关闭
// [httpdns setLogEnabled:YES];
return YES;
}
iOS 端 API 与使用示例
1、获取HTTPDNS服务实例
+ (instancetype)sharedInstance;
2、设置HTTPDNS服务Account ID,您可以从控制台获取您的Account ID信息
@param accountId 您的HTTPDNS租户ID
- (void)setAccountID:(int)accountId;
3、设置HTTPDNS域名解析请求类型(HTTP/HTTPS),
若不调用该接口,默认为HTTP请求。
HTTP请求基于底层CFNetwork实现,不受ATS限制;
@param enable YES: HTTPS请求, NO: HTTP请求
- (void)setHTTPSRequestEnabled:(BOOL)enable;
4、将app使用到的域名预设进来,以便于HTTPDNS 进行预解析
@param hosts 预解析列表
- (void)setPreResolveHosts:(NSArray *)hosts;
// =====《以上具体使用参考AppDelegate.m 文件》==================
5、异步解析接口,首先查询缓存,若存在则返回结果,
若不存在返回nil并且进行异步域名解析更新缓存
@param host 域名(如www.aliyun.com)
@return 域名对应的解析结果
- (NSString *)getIpByHostAsync:(NSString *)host;
6、异步解析接口,首先查询缓存,若存在则返回结果列表,
若不存在返回nil并且进行异步域名解析更新缓存
@param host 域名(如www.aliyun.com)
@return 域名对应的解析结果列表
- (NSArray *)getIpsByHostAsync:(NSString *)host;
7、异步解析接口,首先查询缓存,若存在则返回结果,
若不存在返回空对象并且进行异步域名解析更新缓存。
返回的结果是URL使用场景下的格式化结果
@param host 域名(如www.aliyun.com)
@return 域名对应的解析结果
- (NSString *)getIpByHostAsyncInURLFormat:(NSString *)host;
8、设置降级策略,用户可定制规则降级为原生DNS解析方式;
@param delegate 降级代理
- (void)setDelegateForDegradationFilter:(id<HttpDNSDegradationDelegate>)delegate;
@protocol HttpDNSDegradationDelegate <NSObject>
9、降级过滤器
@param hostName 当前的目标域名(如www.aliyun.com),您可以针对域名进行降级过滤
@return 是否降级走原生DNS逻辑
- (BOOL)shouldDegradeHTTPDNS:(NSString *)hostName;
10、是否允许HTTPDNS返回TTL过期的域名
当您允许返回TTL过期的IP时,SDK在实时返回过期IP的同时依然会进行异步更新以获取最新的IP信息
@param enable 是否返回TTL过期域名
- (void)setExpiredIPEnabled:(BOOL)enable;
11、设置网络切换时是否自动刷新所有域名解析结果,
如果打开此开关,在网络切换时,会自动刷新所有域名的解析结果,
但会产生一定流量消耗
@param enable
- (void)setPreResolveAfterNetworkChanged:(BOOL)enable;
12、设置网络请求的超时时间
超时时间默认为15秒
@param timeoutInterval 超时时间,单位为秒
- (void)setTimeoutInterval:(NSTimeInterval)timeoutInterval;
// ====================================================
从安全角度我们强烈建议用户使用 异步解析接口。
在DDOS攻击等特殊场景下,HTTPDNS有可能会触发流量黑洞,
此时同步接口就有可能出现短暂的请求解析超时等待,
而异步接口的网络请求都是后台操作的,业务层面不会感知到请求超时的动作,
能够做到对异常情况的冗余。
13、同步解析接口,首先查询缓存,若存在则返回结果,
若不存在则进行同步域名解析请求,解析完成返回最新解析结果,
若解析失败返回nil
@param host 域名(如www.aliyun.com)
@return 域名对应的解析结果
- (NSString *)getIpByHost:(NSString *)host;
14、同步解析接口,首先查询缓存,若存在则返回结果,
若不存在则进行同步域名解析请求,解析完成返回最新解析结果列表,
若解析失败返回nil
@param host 域名(如www.aliyun.com)
@return 域名对应的解析结果列表
- (NSArray *)getIpsByHost:(NSString *)host;
15、同步解析接口,首先查询缓存,若存在则返回结果,
若不存在则进行同步域名解析请求,解析完成返回最新解析结果,
若解析失败返回空对象。返回的结果是URL使用场景下的格式化结果
@param host 域名(如www.aliyun.com)
@return 域名对应的解析结果
- (NSString *)getIpByHostInURLFormat:(NSString *)host;
网友评论