美文网首页iOS 技巧优化网络iOS在路上
iOS应用中的DNS解析错误的处理

iOS应用中的DNS解析错误的处理

作者: windgo | 来源:发表于2015-06-05 16:09 被阅读2515次

问题:

最近在app发布之后, 有用户反映有无法打开某些界面的问题. 明明网络是通的,但就是无法从服务器取得数据,在开发环境无法复现。这时候很可能是用户所在的网络的DNS 服务器, 无法正确解析app的http api的域名.

我们假设api的域名为:api.hahaha.com
app的一个网络请求, 可能会是这种格式:

https://api.hahaha.com/login

对于域名api.hahaha.com, DNS的错误解析可能有两种:

  • 无法解析, 无法得到IP
  • 错误解析, 返回错误IP

解决方法:

  1. 在发布app时, 内置一个默认IP, 例如192.168.88.63;
  2. 在启动时, 或者网络连通性变化时, 解析域名;
    + (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. 检查解析的结果
    3.1 如果不能解析, 使用一个默认的IP地址代替域名;
之后的网络请求为: https://192.168.88.63/login

3.2 如果解析成功,例如是192.168.87.62 ,为了防止解析结果错误,可以采用一个检测接口, 调用后,根据其响应(Http Response)内容, 检查域名中的api接口是否正常;

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

3.2.1 如果api正常, 则使用域名进行请求. 并且将默认IP改为192.168.87.62, 作为下次备用.

之后的网络请求为: https://api.hahaha.com/login

3.2.2 如果域名不正常, 则使用默认IP

之后的网络请求为: https://192.168.88.63/login
  1. 将域名或者IP设置为AFHTTPSessionManager的BaseURL进行正常的网络请求

备注

  1. 网络连通性库Reachability
  2. Http通信框架AFNetworking

相关文章

  • iOS应用中的DNS解析错误的处理

    问题: 最近在app发布之后, 有用户反映有无法打开某些界面的问题. 明明网络是通的,但就是无法从服务器取得数据,...

  • PHPCMS V9安装

    按照下载中的安装说明即可,若遇到DNS解析错误,联网即可。 网络差也会导致DNS解析错误,多试几次即可。 后台登陆...

  • IOS下三种DNS解析方式分析(LocalDns)

    背景 最近在做iOS的DNS解析,顺便研究了下iOS端本地的DNS解析方式(localDNS),也就是不依赖Htt...

  • iOS开发进阶-DNS解析&Cookie&Ses

    课程: 新浪微博资深大牛全方位剖析 iOS 高级面试 DNS解析 什么是DNS解析? 域名到IP地址的映射,DNS...

  • iOS上的LocalDNS异步域名解析方案

    iOS上的LocalDNS异步域名解析方案 在iOS开发中, 我们很少需要自己去进行DNS解析, 网络请求都是有N...

  • 计算机网络:其他应用层协议

    DNS协议: DNS系统(domain name system)域名系统,是计算机网络中应用普遍的域名解析系统,该...

  • cdn相关-dns

    cdn中dns解析结果占了非常重要的分量,涉及到的问题,dns劫持,dns解析慢,dns解析的结果跨地域或者跨运营...

  • 计算机网络原理中的单词意义

    DNS (Domain Name System) 域名解析应用通信前,需要请求DNS应用,将要访问的域名映射为IP...

  • dns解析错误

    常见是访问别家网站跳转到自己的项目目录。 无法访问mint-ui网站的,按下面操作刷新本机DNS: 运行,输入cm...

  • 友盟 Application received signal S

    转自解析iOS崩溃日志(crash Log) 最近在解析umeng错误分析日志上有了重大突破! 很显然,我们的应用...

网友评论

  • 来闹的:DNS可以解析到MX记录么
  • zzysummer:现在需要支持IPv6, 上面代码中有一些api是不支持IPv6的
    zzysummer:@沧梦无痕 我对代码进行了一些更改, 并且已经通过审核, 可以参考一下: http://www.jianshu.com/p/19bf335ab6c3
    沧梦无痕:@zzysummer 请问下这怎么解决

本文标题:iOS应用中的DNS解析错误的处理

本文链接:https://www.haomeiwen.com/subject/mcidqttx.html