iOS SDK手册__SDK手册_HTTPDNS-阿里云
1. 前言
本文档介绍了HTTPDNS iOS SDK的使用方式。
HTTPDNS是阿里云面向移动开发者提供的移动端DNS解析服务。通过该SDK,开发者可以在自己的iOS APP中获得可靠、实时、精准的DNS解析服务,彻底解决传统DNS面临的域名劫持、解析时延长、调度不精准等问题。
您可以通过获取alicloud-ios-demo工程源码获得HTTPDNS服务的使用例程。
您有两种获取SDK的方式:
- 您可以通过上述github demo获取HTTPDNS SDK
- 您可以通过访问移动服务APP列表页(https://ams.console.aliyun.com/#/appList 若您第一次访问,请创建APP),点击下图红框中的下载OneSDK,进入OneSDK下载页并勾选HTTPDNS组件获取SDK
2. 应用程序配置与初始化
HTTPDNS iOS SDK,自v1.1.0版本已全面支持苹果ATS要求,无需在Info.plist中配置ATS。
2.1 依赖
系统公共库:
- libresolv.tbd
- CoreTelephony.framework
- SystemConfiguration.framework
AMS组件包
- UTDID.framework
- AlicloudUtils.framework
2.2 获取服务实例
HTTPDNS iOS SDK以全局service实例的方式提供域名解析服务,您可以通过以下方式获取实例:
HttpDnsService *httpdns = [HttpDnsService sharedInstance];
// 设置AccoutID,当您开通HTTPDNS服务时,您可以在控制台获取到您对应的Accout ID信息
[httpdns setAccountID:*****];
2.3 设置预解析域名
在您初始化程序时,可以选择性地预先向HTTPDNS SDK中注册您后续可能会使用到的域名,以便SDK提前解析,减少后续解析域名时请求的时延。您只需调用以下接口:
NSArray * hosts = [[NSArray alloc] initWithObjects:@"www.taobao.com", @"www.aliyun.com", nil];
[httpdns setPreResolveHosts:hosts];
3. 服务API与使用示例
3.1 服务API
/**
* 获取HTTPDNS服务实例
*/
+ (instancetype)sharedInstance;
/**
* 设置HTTPDNS服务Account ID,您可以从控制台获取您的Account ID信息
*
* @param accountId 您的HTTPDNS租户ID
*/
- (void)setAccountID:(int)accountId;
/**
* 设置HTTPDNS域名解析请求类型(HTTP/HTTPS),若不调用该接口,默认为HTTP请求。
* HTTP请求基于底层CFNetwork实现,不受ATS限制;
*
* @param enable YES: HTTPS请求, NO: HTTP请求
*/
- (void)setHTTPSRequestEnabled:(BOOL)enable;
/**
* 将app使用到的域名预设进来,以便于HTTPDNS 进行预解析
*
* @param hosts 预解析列表
*/
- (void)setPreResolveHosts:(NSArray *)hosts;
/**
* 同步解析接口,首先查询缓存,若存在则返回结果,若不存在则进行同步域名解析请求,解析完成返回最新解析结果,若解析失败返回nil
*
* @param host 域名(如www.aliyun.com)
* @return 域名对应的解析结果
*/
- (NSString *)getIpByHost:(NSString *)host;
/**
* 同步解析接口,首先查询缓存,若存在则返回结果,若不存在则进行同步域名解析请求,解析完成返回最新解析结果列表,若解析失败返回nil
*
* @param host 域名(如www.aliyun.com)
* @return 域名对应的解析结果列表
*/
- (NSArray *)getIpsByHost:(NSString *)host;
/**
* 同步解析接口,首先查询缓存,若存在则返回结果,若不存在则进行同步域名解析请求,解析完成返回最新解析结果,若解析失败返回空对象。返回的结果是URL使用场景下的格式化结果
*
* @param host 域名(如www.aliyun.com)
* @return 域名对应的解析结果
*/
- (NSString *)getIpByHostInURLFormat:(NSString *)host;
/**
* 异步解析接口,首先查询缓存,若存在则返回结果,若不存在返回nil并且进行异步域名解析更新缓存
*
* @param host 域名(如www.aliyun.com)
* @return 域名对应的解析结果
*/
- (NSString *)getIpByHostAsync:(NSString *)host;
/**
* 异步解析接口,首先查询缓存,若存在则返回结果列表,若不存在返回nil并且进行异步域名解析更新缓存
*
* @param host 域名(如www.aliyun.com)
* @return 域名对应的解析结果列表
*/
- (NSArray *)getIpsByHostAsync:(NSString *)host;
/**
* 异步解析接口,首先查询缓存,若存在则返回结果,若不存在返回空对象并且进行异步域名解析更新缓存。返回的结果是URL使用场景下的格式化结果
*
* @param host 域名(如www.aliyun.com)
* @return 域名对应的解析结果
*/
- (NSString *)getIpByHostAsyncInURLFormat:(NSString *)host;
/**
* 设置降级策略,用户可定制规则降级为原生DNS解析方式;
*
* @param delegate 降级代理
*/
- (void)setDelegateForDegradationFilter:(id<HttpDNSDegradationDelegate>)delegate;
@protocol HttpDNSDegradationDelegate <NSObject>
/**
* 降级过滤器
*
* @param hostName 当前的目标域名(如www.aliyun.com),您可以针对域名进行降级过滤
* @return 是否降级走原生DNS逻辑
*/
- (BOOL)shouldDegradeHTTPDNS:(NSString *)hostName;
@end
/**
* 是否允许HTTPDNS返回TTL过期的域名
* 当您允许返回TTL过期的IP时,SDK在实时返回过期IP的同时依然会进行异步更新以获取最新的IP信息
*
* @param enable 是否返回TTL过期域名
*/
- (void)setExpiredIPEnabled:(BOOL)enable;
/**
* 设置网络切换时是否自动刷新所有域名解析结果,如果打开此开关,在网络切换时,会自动刷新所有域名的解析结果,但会产生一定流量消耗
*
* @param enable
*/
- (void)setPreResolveAfterNetworkChanged:(BOOL)enable;
HTTPDNS场景下兼容IPv6-only网络环境需要注意的细节:
当您使用IP形式的URL进行网络请求时,IPv4与IPv6的IP地址使用方式略有不同:
即在URL中使用IPv6地址时需要在IPv6地址基础上额外加上[]
。为了方便开发者的使用,HTTPDNS提供了适配URL格式的IP获取接口getIpByHostInURLFormat/getIpByHostAsyncInURLFormat
。当您通过HTTPDNS进行IP获取,并使用该IP进行基于URL的网络访问时,您可以通过上述API直接获取符合URL使用场景,格式化后的IP信息,如1.1.1.1,[2001:db8:c000:221::]。如果您仅仅为了获取精准的IP信息并另做它用,您可以继续使用老接口getIpByHost/getIpByHostAsync
。
3.2 使用示例
您可以通过获取alicloud-ios-demo工程源码获得HTTPDNS服务的使用例程。
4. 注意事项
4.1 HTTP请求头HOST字段设置
标准的HTTP协议中服务端会将HTTP请求头HOST字段的值作为请求的域名信息进行解析。使用HTTPDNS后,您可能需要将HTTP请求URL中的HOST字段替换为HTTPDNS解析获得的IP,这时标准的网络库会将您的IP赋值给HTTP请求头的HOST字段,进而导致服务端的解析异常(服务端认可的是您的域名信息,而非IP信息)。为了解决这个问题,您可以主动设置HTTP请求HOST字段的值,如:
NSString *originalUrl = @"https://www.aliyun.com/";
NSURL* url = [NSURL URLWithString:originalUrl];
NSMutableURLRequest* request = [[NSMutableURLRequest alloc] initWithURL:url];
// 同步接口获取IP
NSString* ip = [httpdns getIpByHost:url.host];
if (ip) {
// 通过HTTPDNS获取IP成功,进行URL替换和HOST头设置
NSRange hostFirstRange = [originalUrl rangeOfString: url.host];
if (NSNotFound != hostFirstRange.location) {
NSString* newUrl = [originalUrl stringByReplacingCharactersInRange:hostFirstRange withString:ip];
request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:newUrl]];
// 设置请求HOST字段
[request setValue:url.host forHTTPHeaderField:@"host"];
}
}
4.2 COOKIE字段
部分网络库支持COOKIE的自动存储管理,当您使用HTTPDNS进行IP URL请求时,部分网络库会将您URL中的IP信息作为COOKIE对应的域名信息进行存储管理(而非HTTP请求头HOST字段信息),进而造成COOKIE管理与使用上的困扰,因此您需要关闭COOKIE的自动管理功能(默认关闭)。
4.3 HTTPS/WebView/SNI场景
- HTTPS场景,参考最佳实践-HTTPS场景,iOS HTTPS Demo;
- WebView场景,参考最佳实践-WebView场景,iOS WebView Demo;
- SNI(单IP多HTTPS域名)场景,参考最佳实践-SNI场景,iOS SNI Demo。
4.4 代理情况下的使用
当存在中间HTTP代理时,客户端发起的请求中请求行会使用绝对路径的URL,在您开启HTTPDNS并采用IP URL进行访问时,中间代理将识别您的IP信息并将其作为真实访问的HOST信息传递给目标服务器,这时目标服务器将无法处理这类无真实HOST信息的HTTP请求。移动网关提供了X-Online-Host
的私有协议字段来解决这个问题,比如:
目标URL:https://www.aliyun.com/product/oss/
代理:10.0.0.172:80
您的HTTP请求头应设置为:
GET https://10.0.0.172:80/product/oss/ HTTP/1.1
Host: 10.0.0.172
X-Online-Host: www.aliyun.com
同样您可以通过下述方法进行X-Online-Host
请求头域的设置,并在服务端设置对该私有头域的解析。
[request setValue:url.host forHTTPHeaderField:@"X-Online-Host"];
在绝大多数场景下,我们建议您在代理模式下关闭HTTPDNS功能。
最后更新:2016-12-17 22:20:43
上一篇:
Android SDK手册__SDK手册_HTTPDNS-阿里云
下一篇:
HTTPS业务场景解决方案__最佳实践_HTTPDNS-阿里云
容器重新调度__服务编排文档_用户指南_容器服务-阿里云
发布消息到Topic__接口列表_服务器端API_阿里云物联网套件-阿里云
数据源支持__产品简介_数据管理-阿里云
创建文件系统和挂载点__快速入门_文件存储-阿里云
批量操作__域名操作_产品使用手册_云解析-阿里云
性能测试核心技术__中级课程_性能测试视频教程_性能测试-阿里云
高防CNAME接入流程__运维问题_产品常见问题_DDoS 高防IP-阿里云
添加删除用户__快速开始_大数据计算服务-阿里云
高可用性调度__服务编排文档_用户指南_容器服务-阿里云
停止应用__应用管理类 API_Open API 参考_企业级分布式应用服务 EDAS-阿里云
相关内容
常见错误说明__附录_大数据计算服务-阿里云
发送短信接口__API使用手册_短信服务-阿里云
接口文档__Android_安全组件教程_移动安全-阿里云
运营商错误码(联通)__常见问题_短信服务-阿里云
设置短信模板__使用手册_短信服务-阿里云
OSS 权限问题及排查__常见错误及排除_最佳实践_对象存储 OSS-阿里云
消息通知__操作指南_批量计算-阿里云
设备端快速接入(MQTT)__快速开始_阿里云物联网套件-阿里云
查询API调用流量数据__API管理相关接口_API_API 网关-阿里云
使用STS访问__JavaScript-SDK_SDK 参考_对象存储 OSS-阿里云