閱讀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-阿裏雲