952
英雄聯盟
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-阿裏雲