iOS應(yīng)用中的DNS解析錯誤的處理

問題:

最近在app發(fā)布之后, 有用戶反映有無法打開某些界面的問題. 明明網(wǎng)絡(luò)是通的,但就是無法從服務(wù)器取得數(shù)據(jù),在開發(fā)環(huán)境無法復現(xiàn)。這時候很可能是用戶所在的網(wǎng)絡(luò)的DNS 服務(wù)器, 無法正確解析app的http api的域名.

我們假設(shè)api的域名為:api.hahaha.com
app的一個網(wǎng)絡(luò)請求, 可能會是這種格式:

https://api.hahaha.com/login

對于域名api.hahaha.com, DNS的錯誤解析可能有兩種:

  • 無法解析, 無法得到IP
  • 錯誤解析, 返回錯誤IP

解決方法:

  1. 在發(fā)布app時, 內(nèi)置一個默認IP, 例如192.168.88.63;
  2. 在啟動時, 或者網(wǎng)絡(luò)連通性變化時, 解析域名;
    + (NSString *)getIPAddress:(NSString*) hostname{
        Boolean result;
        CFHostRef hostRef;
        CFArrayRef addresses;
        NSString *ipAddress = @"";
          hostRef = CFHostCreateWithName(kCFAllocatorDefault, (__bridge CFStringRef)hostname);
          if (hostRef) {
              result = CFHostStartInfoResolution(hostRef, kCFHostAddresses, NULL); // pass an error instead of NULL here to find out why it failed
              if (result == TRUE) {
                  addresses = CFHostGetAddressing(hostRef, &result);
              }
          }
          if (result == TRUE) {
              CFIndex index = 0;
              CFDataRef ref = (CFDataRef) CFArrayGetValueAtIndex(addresses, index);
              struct sockaddr_in* remoteAddr;
              char *ip_address;
              remoteAddr = (struct sockaddr_in*) CFDataGetBytePtr(ref);
              if (remoteAddr != NULL) {
                  ip_address = inet_ntoa(remoteAddr->sin_addr);
              }
              ipAddress = [NSString stringWithCString:ip_address encoding:NSUTF8StringEncoding];
          }
          return ipAddress;
      }
  1. 檢查解析的結(jié)果
    3.1 如果不能解析, 使用一個默認的IP地址代替域名;
之后的網(wǎng)絡(luò)請求為: https://192.168.88.63/login

3.2 如果解析成功,例如是192.168.87.62 ,為了防止解析結(jié)果錯誤,可以采用一個檢測接口, 調(diào)用后,根據(jù)其響應(yīng)(Http Response)內(nèi)容, 檢查域名中的api接口是否正常;

https://api.hahaha.com/test
response: {state: "Im ok"}

3.2.1 如果api正常, 則使用域名進行請求. 并且將默認IP改為192.168.87.62, 作為下次備用.

之后的網(wǎng)絡(luò)請求為: https://api.hahaha.com/login

3.2.2 如果域名不正常, 則使用默認IP

之后的網(wǎng)絡(luò)請求為: https://192.168.88.63/login
  1. 將域名或者IP設(shè)置為AFHTTPSessionManager的BaseURL進行正常的網(wǎng)絡(luò)請求

備注

  1. 網(wǎng)絡(luò)連通性庫Reachability
  2. Http通信框架AFNetworking
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容