IPV6 解决2

来源:互联网 发布:地球空心 知乎 编辑:程序博客网 时间:2024/06/05 18:27

6.1AppStore发布之后的应用要兼容IPv6。

然而我上个星期发布的版本并没有因为没兼容而被拒,这次提交却遇到IPv6兼容问。。。

 话不多说,上代码:

<code class="objectivec" style="padding:0px; font-family:Menlo,Monaco,Consolas,'Courier New',monospace; font-size:12px; background-color:transparent; border:none"> +(<span class="hljs-built_in" style="color:#268bd2;">NSString</span> *) getIPWithHostName:(<span class="hljs-keyword" style="color:#85990;">const</span> <span class="hljs-built_in" style="color:#268bd2;">NSString</span> *)hostName    {    <span class="hljs-keyword" style="color:#85990;">struct</span> addrinfo * result;     <span class="hljs-keyword" style="color:#85990;">struct</span> addrinfo * res;    <span class="hljs-keyword" style="color:#85990;">char</span> ipv4[<span class="hljs-number" style="color:#2aa198;">128</span>];    <span class="hljs-keyword" style="color:#85990;">char</span> ipv6[<span class="hljs-number" style="color:#2aa198;">128</span>];    <span class="hljs-keyword" style="color:#85990;">int</span> error;    <span class="hljs-built_in" style="color:#268bd2;">BOOL</span> IS_IPV6 = <span class="hljs-literal">FALSE</span>;    bzero(&ipv4, <span class="hljs-keyword" style="color:#85990;">sizeof</span>(ipv4));    bzero(&ipv4, <span class="hljs-keyword" style="color:#85990;">sizeof</span>(ipv6));    error = getaddrinfo([hostName UTF8String], <span class="hljs-literal">NULL</span>, <span class="hljs-literal">NULL</span>, &result);    <span class="hljs-keyword" style="color:#85990;">if</span>(error != <span class="hljs-number" style="color:#2aa198;">0</span>) {    <span class="hljs-built_in" style="color:#268bd2;">NSLog</span>(<span class="hljs-string" style="color:#2aa198;">@"error in getaddrinfo:%d"</span>, error);    <span class="hljs-keyword" style="color:#85990;">return</span> <span class="hljs-literal">nil</span>;    }     <span class="hljs-keyword" style="color:#85990;">for</span>(res = result; res!=<span class="hljs-literal">NULL</span>; res = res->ai_next) {    <span class="hljs-keyword" style="color:#85990;">char</span> hostname[<span class="hljs-number" style="color:#2aa198;">1025</span>] = <span class="hljs-string" style="color:#2aa198;">""</span>;    error = getnameinfo(res->ai_addr, res->ai_addrlen, hostname, <span class="hljs-number" style="color:#2aa198;">1025</span>, <span class="hljs-literal">NULL</span>, <span class="hljs-number" style="color:#2aa198;">0</span>, <span class="hljs-number" style="color:#2aa198;">0</span>);    <span class="hljs-keyword" style="color:#85990;">if</span>(error != <span class="hljs-number" style="color:#2aa198;">0</span>) {        <span class="hljs-built_in" style="color:#268bd2;">NSLog</span>(<span class="hljs-string" style="color:#2aa198;">@"error in getnameifno: %s"</span>, gai_strerror(error));        <span class="hljs-keyword" style="color:#85990;">continue</span>;    }    <span class="hljs-keyword" style="color:#85990;">else</span> {        <span class="hljs-keyword" style="color:#85990;">switch</span> (res->ai_addr->sa_family) {            <span class="hljs-keyword" style="color:#85990;">case</span> AF_INET:                memcpy(ipv4, hostname, <span class="hljs-number" style="color:#2aa198;">128</span>);                <span class="hljs-keyword" style="color:#85990;">break</span>;            <span class="hljs-keyword" style="color:#85990;">case</span> AF_INET6:                memcpy(ipv6, hostname, <span class="hljs-number" style="color:#2aa198;">128</span>);                IS_IPV6 = <span class="hljs-literal">TRUE</span>;            <span class="hljs-keyword" style="color:#85990;">default</span>:                <span class="hljs-keyword" style="color:#85990;">break</span>;        }        <span class="hljs-built_in" style="color:#268bd2;">NSLog</span>(<span class="hljs-string" style="color:#2aa198;">@"hostname: %s "</span>, hostname);    }    }    freeaddrinfo(result);    <span class="hljs-keyword" style="color:#85990;">if</span>(IS_IPV6 == <span class="hljs-literal">TRUE</span>) <span class="hljs-keyword" style="color:#85990;">return</span> [<span class="hljs-built_in" style="color:#268bd2;">NSString</span> stringWithUTF8String:ipv6];    <span class="hljs-keyword" style="color:#85990;">return</span> [<span class="hljs-built_in" style="color:#268bd2;">NSString</span> stringWithUTF8String:ipv4];    }</code>

这段代码即判断了是否IPv6环境并解析域名获得了IP地址。

测试

首先得配置IPv6网络环境,至于如何配置,自行百度"如何搭建IPv6的测试环境"


然而配置成功后,用手机连接的WiFi DNS也是正确的,运行程序测试怎么不成功呢,找了好多资料,猜测是DNS解析除了问题。


那就换另一种方法配置IPv6:拔掉网线,用mac连接WiFi(没有WiFi可以用手机流量分享热点),然后在共享中用前一种方法配置IPv6(不知道具体是共享到电脑那个端口,索性全点上)记得选中"创建NAT64 网络"。这时直接通过模拟器测试succeed! 

测试成功了。你以为就没问题了?这里提交依然可能被拒,手机和 Mac 之间是 IPv6 没错,但 Mac 和你的服务器之间还是 IPv4 连接。


如果这项测试通过,可以说明:你的客户端应用在 IPv6 网络下,是(基本)没有问题的,但是无法验证你的服务器能够对 IPv6 网络做出正确的响应。然而,苹果审核的时候,却是要去 DNS 服务器询问你的服务器的 IPv6 地址,然后进行访问。如果查询不到 IPv6 地址,可能会进而询问 IPv4 地址,然后进行转换使用。苹果明确表示服务器不需要支持 IPv6,但是有一点苹果没有指出来,那就是,虽然你的服务器不用支持 IPv6,但是必须正确响应 IPv6 的 DNS 查询。
 

如何验证呢??使用以下命令即可:

[plain] view plain copy 在CODE上查看代码片派生到我的代码片
  1. $ dig +nocmd +nostats example.com AAAA  

如果返回的 status 为 NOERROR, 那基本就没什么问题,但是一定要在多个网络环境下测试都通过才行。如果返回的是其他的响应,尤其是 SERVFAIL 的情况,那就基本杯具了。由于你已经验证了客户端没有问题,现在要做的,就是催着你的运维、后台啥的,赶紧去改 DNS 配置,直到稳定返回 NOERROR 为止。

0 0