阅读952 返回首页    go 阿里云


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组件获取SDKamsams2

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实例的方式提供域名解析服务,您可以通过以下方式获取实例:

  1. HttpDnsService *httpdns = [HttpDnsService sharedInstance];
  2. // 设置AccoutID,当您开通HTTPDNS服务时,您可以在控制台获取到您对应的Accout ID信息
  3. [httpdns setAccountID:*****];

2.3 设置预解析域名

在您初始化程序时,可以选择性地预先向HTTPDNS SDK中注册您后续可能会使用到的域名,以便SDK提前解析,减少后续解析域名时请求的时延。您只需调用以下接口:

  1. NSArray * hosts = [[NSArray alloc] initWithObjects:@"www.taobao.com", @"www.aliyun.com", nil];
  2. [httpdns setPreResolveHosts:hosts];

3. 服务API与使用示例

3.1 服务API

  1. /**
  2. * 获取HTTPDNS服务实例
  3. */
  4. + (instancetype)sharedInstance;
  5. /**
  6. * 设置HTTPDNS服务Account ID,您可以从控制台获取您的Account ID信息
  7. *
  8. * @param accountId 您的HTTPDNS租户ID
  9. */
  10. - (void)setAccountID:(int)accountId;
  11. /**
  12. * 设置HTTPDNS域名解析请求类型(HTTP/HTTPS),若不调用该接口,默认为HTTP请求。
  13. * HTTP请求基于底层CFNetwork实现,不受ATS限制;
  14. *
  15. * @param enable YES: HTTPS请求, NO: HTTP请求
  16. */
  17. - (void)setHTTPSRequestEnabled:(BOOL)enable;
  18. /**
  19. * 将app使用到的域名预设进来,以便于HTTPDNS 进行预解析
  20. *
  21. * @param hosts 预解析列表
  22. */
  23. - (void)setPreResolveHosts:(NSArray *)hosts;
  24. /**
  25. * 同步解析接口,首先查询缓存,若存在则返回结果,若不存在则进行同步域名解析请求,解析完成返回最新解析结果,若解析失败返回nil
  26. *
  27. * @param host 域名(如www.aliyun.com)
  28. * @return 域名对应的解析结果
  29. */
  30. - (NSString *)getIpByHost:(NSString *)host;
  31. /**
  32. * 同步解析接口,首先查询缓存,若存在则返回结果,若不存在则进行同步域名解析请求,解析完成返回最新解析结果列表,若解析失败返回nil
  33. *
  34. * @param host 域名(如www.aliyun.com)
  35. * @return 域名对应的解析结果列表
  36. */
  37. - (NSArray *)getIpsByHost:(NSString *)host;
  38. /**
  39. * 同步解析接口,首先查询缓存,若存在则返回结果,若不存在则进行同步域名解析请求,解析完成返回最新解析结果,若解析失败返回空对象。返回的结果是URL使用场景下的格式化结果
  40. *
  41. * @param host 域名(如www.aliyun.com)
  42. * @return 域名对应的解析结果
  43. */
  44. - (NSString *)getIpByHostInURLFormat:(NSString *)host;
  45. /**
  46. * 异步解析接口,首先查询缓存,若存在则返回结果,若不存在返回nil并且进行异步域名解析更新缓存
  47. *
  48. * @param host 域名(如www.aliyun.com)
  49. * @return 域名对应的解析结果
  50. */
  51. - (NSString *)getIpByHostAsync:(NSString *)host;
  52. /**
  53. * 异步解析接口,首先查询缓存,若存在则返回结果列表,若不存在返回nil并且进行异步域名解析更新缓存
  54. *
  55. * @param host 域名(如www.aliyun.com)
  56. * @return 域名对应的解析结果列表
  57. */
  58. - (NSArray *)getIpsByHostAsync:(NSString *)host;
  59. /**
  60. * 异步解析接口,首先查询缓存,若存在则返回结果,若不存在返回空对象并且进行异步域名解析更新缓存。返回的结果是URL使用场景下的格式化结果
  61. *
  62. * @param host 域名(如www.aliyun.com)
  63. * @return 域名对应的解析结果
  64. */
  65. - (NSString *)getIpByHostAsyncInURLFormat:(NSString *)host;
  66. /**
  67. * 设置降级策略,用户可定制规则降级为原生DNS解析方式;
  68. *
  69. * @param delegate 降级代理
  70. */
  71. - (void)setDelegateForDegradationFilter:(id<HttpDNSDegradationDelegate>)delegate;
  72. @protocol HttpDNSDegradationDelegate <NSObject>
  73. /**
  74. * 降级过滤器
  75. *
  76. * @param hostName 当前的目标域名(如www.aliyun.com),您可以针对域名进行降级过滤
  77. * @return 是否降级走原生DNS逻辑
  78. */
  79. - (BOOL)shouldDegradeHTTPDNS:(NSString *)hostName;
  80. @end
  81. /**
  82. * 是否允许HTTPDNS返回TTL过期的域名
  83. * 当您允许返回TTL过期的IP时,SDK在实时返回过期IP的同时依然会进行异步更新以获取最新的IP信息
  84. *
  85. * @param enable 是否返回TTL过期域名
  86. */
  87. - (void)setExpiredIPEnabled:(BOOL)enable;
  88. /**
  89. * 设置网络切换时是否自动刷新所有域名解析结果,如果打开此开关,在网络切换时,会自动刷新所有域名的解析结果,但会产生一定流量消耗
  90. *
  91. * @param enable
  92. */
  93. - (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字段的值,如:

  1. NSString *originalUrl = @"https://www.aliyun.com/";
  2. NSURL* url = [NSURL URLWithString:originalUrl];
  3. NSMutableURLRequest* request = [[NSMutableURLRequest alloc] initWithURL:url];
  4. // 同步接口获取IP
  5. NSString* ip = [httpdns getIpByHost:url.host];
  6. if (ip) {
  7. // 通过HTTPDNS获取IP成功,进行URL替换和HOST头设置
  8. NSRange hostFirstRange = [originalUrl rangeOfString: url.host];
  9. if (NSNotFound != hostFirstRange.location) {
  10. NSString* newUrl = [originalUrl stringByReplacingCharactersInRange:hostFirstRange withString:ip];
  11. request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:newUrl]];
  12. // 设置请求HOST字段
  13. [request setValue:url.host forHTTPHeaderField:@"host"];
  14. }
  15. }

4.2 COOKIE字段

部分网络库支持COOKIE的自动存储管理,当您使用HTTPDNS进行IP URL请求时,部分网络库会将您URL中的IP信息作为COOKIE对应的域名信息进行存储管理(而非HTTP请求头HOST字段信息),进而造成COOKIE管理与使用上的困扰,因此您需要关闭COOKIE的自动管理功能(默认关闭)。

4.3 HTTPS/WebView/SNI场景

4.4 代理情况下的使用

当存在中间HTTP代理时,客户端发起的请求中请求行会使用绝对路径的URL,在您开启HTTPDNS并采用IP URL进行访问时,中间代理将识别您的IP信息并将其作为真实访问的HOST信息传递给目标服务器,这时目标服务器将无法处理这类无真实HOST信息的HTTP请求。移动网关提供了X-Online-Host的私有协议字段来解决这个问题,比如:

  1. 目标URL:https://www.aliyun.com/product/oss/
  2. 代理:10.0.0.172:80
  3. 您的HTTP请求头应设置为:
  4. GET https://10.0.0.172:80/product/oss/ HTTP/1.1
  5. Host: 10.0.0.172
  6. X-Online-Host: www.aliyun.com

同样您可以通过下述方法进行X-Online-Host请求头域的设置,并在服务端设置对该私有头域的解析。

  1. [request setValue:url.host forHTTPHeaderField:@"X-Online-Host"];

在绝大多数场景下,我们建议您在代理模式下关闭HTTPDNS功能。


最后更新:2016-12-17 22:20:43

  上一篇:go Android SDK手册__SDK手册_HTTPDNS-阿里云
  下一篇:go HTTPS业务场景解决方案__最佳实践_HTTPDNS-阿里云