苹果的规定:2016年6月1日提交到App Store必须支持IPv6-only网络。

官方文档:https://developer.apple.com/library/mac/documentation/NetworkingInternetWeb/Conceptual/NetworkingOverview/UnderstandingandPreparingfortheIPv6Transition/UnderstandingandPreparingfortheIPv6Transition.html#//apple_ref/doc/uid/TP40010220-CH213-SW1

大多数应用APP 不需要任何改变,因为IPv6的已经被NSURLSession、CFNetwork、NSURLConnection 支持。

一、是否需要修改代码

1、如果线上环境的APP 只使用域名访问,没有使用IP地址,并且没有使用底层socket API ,就不用修改代码。

直接访问IP地址 主要是用在测试环境中。

大多数app使用的:NSURLSession、NSURLConnection、UIWebView、WKWebView、CFNetwork。所以可以不用修改网络代码,AFNetworking2.x、reachability 这些 都 不用做任何的改变。

不过还是 推荐 大家升级AFNetworking到最新版本,毕竟NSURLConnection迟早要被淘汰。

用Swift写的 就直接用 Alamofire吧。

2、Reachability不用IP地址,可以固定写死为 线上域名。也可以用 AFNetworking 的Reachability来判断网络连接状态(是异步的,不用输入域名或IP)。

Reachability 最新版本 官方 声明iOS8以上系统可以使用,经测试,iOS 7.0以上系统都可以使用。

3、iOS 9.0、OS X 10.11 以上的系统 在IPv6的环境下 是支持IP地址访问网络的。所以大家测试机如果是 iOS9.0以上的系统,可以直接通过IP访问。这是因为iOS 9.0之后 NSURLSession和CFNetwork能把IPv4的地址 合成IPv6的地址(在DNS64/NAT64网络环境中)。

iOS 9.0以下的系统 就会报错,这和是否升级 AFNetworking 没有关系。就算升级AFNetworking到3.x,也是一样会报:Error Domain=NSURLErrorDomain Code=-1001 等错误。

官方图片:

4、分享SDK

微信SDK、新浪微博SDK 都更新了版本,并声明支持IPv6。

但是因为微信本身不支持IPv6,所以即使更新SDK到最新版本,分享到微信时,在微信的APP 还是会一直显示网络无法连接。

测试发现,不更新 这些分享的SDK,也能兼容IPv6。(等微信支持IPv6后,是否必须更新SDK 还不清楚)

友盟分享 官网建议升级SDK,个人也是推荐升级,如果实在不想升,应该也没问题。

来个小插曲:

上星期友盟新发的5.2版本 的SDK 有 邮件、短信分享崩溃的bug,给他们提出了。他们昨天下午进行了升级。

二、现有APP支持IPv6的情况

1、绝大多数 都是支持IPv6的,比如:QQ,淘宝、大众点评。

1.1、因为绝大多数的app 都使用的域名,而不是ip地址。

1.2、并且没有调用底层的socket api。

1.3、不需要进行DNS查找。

2、极少数app不支持IPv6,比如:微信。

三、DNS64/ NAT64

DNS64/ NAT64过渡工作流程:

1、提供独立的IPv4和IPv6连接 的 蜂窝网络,把IPv4的网络升级到IPv6

上图只是理想状态下,升级到IPv6的情况,但是现在绝大多数都是IPv4的服务器,所以一些大的供应商开始实施DNS64/NAT64 的过度 来支持IPv6.

2、部署DNS64/NAT64 IPv6的蜂窝网络

客户端请求 网站域名,首先会通过DNS64服务器 查询该域名是否存在 IPv6的地址,如果存在,就返回IPv6的地址。如果不存在,就去查找该域名对应的IPv4地址,并返回。

下面是详细流程图:

3、DNS64/NAT64 转换 流程:

DNS64/NAT64 可以 将IPv4地址 转换为IPv6,将IPv6地址解析成IPv4。

IPv4地址 转换为IPv6:
客户端访问网站域名 ,如果网站只有 IPv4 地址:56.111.211.22,转成16进制: 38 6F D3 16,该16进制为IPv6的最后2位:   64:ff9b::386F:D316

四、搭建 IPv6 环境

MAC 的系统为 OS 10.11 及以上系统。

1、进入MAC 电脑的 “系统偏好设置”--》按住option/alt 键--》 点击 “共享”

2、选中“创建NAT64网络”,然后打开热点。

3、手机 连接 热点后,查看网络的 DNS 为:XX:XX:XX:XX:XX:XX ,说明网络为IPv6。

下图为MAC搭建IPv6 的原理图:

目前,一个网卡会同时使用这两张地址;以后 一个网卡仅有IPv6 地址。 两种设备不能直接访问,需要DNS64/NAT64 这种 过渡技术才能 互相访问。

五、升级AFNetworking2.X到最新版本

1、将  AFHTTPRequestOperationManager 替换为:  AFHTTPSessionManager

2、将  AFHTTPRequestOperation  替换为:NSURLSessionTask

3、如果通过IP访问,或者允许https证书之外的域名访问,需要设置 validatesDomainName 为false。

这个设置是源于 2.5.3版本 之前的安全漏洞(AFNetworking曝SSL漏洞)。

修改完成后可以使用了,但是很不安全,这样黑客可以获取 你https 通信的数据。无论你是用http还是https,数据一定要加密。。

AFHTTPSessionManager * manager = [AFHTTPSessionManager manager];

manager.securityPolicy = [AFSecurityPolicy defaultPolicy];

manager.securityPolicy.allowInvalidCertificates = YES;  //忽略https证书

manager.securityPolicy.validatesDomainName = NO;    //是否验证域名

六、系统兼容IPv6代码

1、下面的方法 只适用于IPv4,不能兼容IPv6:

  • inet_addr()

  • inet_aton()

  • inet_lnaof()

  • inet_makeaddr()

  • inet_netof()

  • inet_network()

  • inet_ntoa()

  • inet_ntoa_r()

  • bindresvport()

  • getipv4sourcefilter()

  • setipv4sourcefilter()

2、如果有以下代码处理IPv4类型,要确保IPv6的形式也被处理过:

IPv4

IPv6

AF_INET

AF_INET6

PF_INET

PF_INET6

struct in_addr

struct in_addr6

struct sockaddr_in

struct sockaddr_in6

kDNSServiceProtocol_IPv4

kDNSServiceProtocol_IPv6

3、使用系统API合成IPv6:

如果你的APP需要连接的服务器 只有IPv4地址,没有域名,可以用 getaddrinfo 来解决。下面的代码,将IPv4地址(如:192.0.2.1) 地址转换为IPv6地址(如:包含  64:ff9b::192.0.2.1  的struct sockaddr_in6 )

#include <sys/socket.h>

#include <netdb.h>

#include <arpa/inet.h>

#include <err.h>

    uint8_t ipv4[] = {, , , };

    struct addrinfo hints, *res, *res0;

    int error, s;

    const char *cause = NULL;

    char ipv4_str_buf[INET_ADDRSTRLEN] = {  };

    const char *ipv4_str = inet_ntop(AF_INET, &ipv4, ipv4_str_buf, sizeof(ipv4_str_buf));

    memset(&hints, , sizeof(hints));

    hints.ai_family = PF_UNSPEC;

    hints.ai_socktype = SOCK_STREAM;

    hints.ai_flags = AI_DEFAULT;

    error = getaddrinfo(ipv4_str, "http", &hints, &res0);

    if (error) {

        errx(, "%s", gai_strerror(error));

        /*NOTREACHED*/

    }

    s = -;

    for (res = res0; res; res = res->ai_next) {

        s = socket(res->ai_family, res->ai_socktype,

                   res->ai_protocol);

        if (s < ) {

            cause = "socket";

            continue;

        }

        if (connect(s, res->ai_addr, res->ai_addrlen) < ) {

            cause = "connect";

            close(s);

            s = -;

            continue;

        }

        break;  /* okay we got one */

    }

    if (s < ) {

        err(, "%s", cause);

        /*NOTREACHED*/

    }

    freeaddrinfo(res0);

欢迎关注我的 今日头条号 名称: 云端梦想科技

欢迎关注我的 微信公众号:dreams2999

iOS 支持 IPv6的更多相关文章

  1. iOS应用支持IPV6,就那点事儿

    原文连接   果然是苹果打个哈欠,iOS行业内就得起一次风暴呀.自从5月初Apple明文规定所有开发者在6月1号以后提交新版本需要支持IPV6-Only的网络,大家便开始热火朝天的研究如何支持IPV6 ...

  2. iOS应用支持IPV6

    一.IPV6-Only支持是啥? 首先IPV6,是对IPV4地址空间的扩充.目前当我们用iOS设备连接上Wifi.4G.3G等网络时,设备被分配的地址均是IPV4地址,但是随着运营商和企业逐渐部署IP ...

  3. iOS 上线因iPv6被拒,查询服务器是否支持iPv6,mac设置iPv6网络,手机测试iPv6

    一. iOS----如何检查域名是否支持ipv6 iOS----------如何检查域名是否支持ipv6 1.检查你所用到的库,像af 3.0以上什么的(不用改),其他的库自己去搜下是否支持ipv6吧 ...

  4. iOS----------如何检查域名是否支持ipv6

    http://ipv6-test.com/validate.php  这个地址  也可以检测到! 1.检查你所用到的库,像af 3.0以上什么的(不用改),其他的库自己去搜下是否支持ipv6吧. 2. ...

  5. 配置阿里云ECS支持IPv6,解决苹果app审核失败问题

    前几天iOS的App提交给苹果审核没通过,给出的原因是:该应用在 IPv6 的环境下无法使用.检查发现:阿里云优化过的系统没有启用IPv6协议,需要配置启用一下,但是只单独启用IPv6也是无法直接提供 ...

  6. linux centos6.5支持ipv6

    1.用ifconfig查看有没有inet6 addr,我的这个已经支持了,如果不支持请看第二步. 2.vim /etc/sysconfig/network 把这句改成:NETWORKING_IPV6= ...

  7. 用尽洪荒之力解决Apple Store ipv6审核通关---linux服务器支持ipv6

         强势的库克时代到来,苹果开启了强制IPV6审核,大家也知道中国现在的情况,除了教育网实验性的支持IPV6,ISP运营商还不支持,想必大家都陆陆续续的遭受到了苹果无情的拒绝,以前开个加急,审核 ...

  8. keepalive配置支持ipv6、ipv4双棧支持

    因公司业务需要,keepalived需要同时支持ipv6和ipv4 keepalived版本1.2.23. keepalived 配置: 重点:ipv6的虚IP配置在 virtual_ipaddres ...

  9. PPTP支持IPv6

    pptp支持ipv6,谷歌资料不多,这里整理下   主要用来给ipv4访问ipv6资源的场景使用,客户端连接上pptp后会分配得到一个ipv6地址,通过此地址访问ipv6的资源 客户端网段在pptp. ...

随机推荐

  1. 基于spring注解AOP的异常处理

    一.前言 项目刚刚开发的时候,并没有做好充足的准备.开发到一定程度的时候才会想到还有一些问题没有解决.就比如今天我要说的一个问题:异常的处理.写程序的时候一般都会通过try...catch...fin ...

  2. 高性能Javascript--脚本的无阻塞加载策略

    Javascript在浏览器中的性能,可以说是前端开发者所要面对的最重要的可用性问题. 在Yahoo的Yslow23条规则当中,其中一条是将JS放在底部 .原因是,事实上,大多数浏览器使用单进程处理U ...

  3. nodejs进阶(5)—接收请求参数

    1. get请求参数接收 我们简单举一个需要接收参数的例子 如果有个查找功能,查找关键词需要从url里接收,http://localhost:8000/search?keyword=地球.通过前面的进 ...

  4. Js 变量声明提升和函数声明提升

    Js代码分为两个阶段:编译阶段和执行阶段 Js代码的编译阶段会找到所有的声明,并用合适的作用域将它们关联起来,这是词法作用域的核心内容 包括变量声明(var a)和函数声明(function a(){ ...

  5. Canvas坐标系转换

    默认坐标系与当前坐标系 canvas中的坐标是从左上角开始的,x轴沿着水平方向(按像素)向右延伸,y轴沿垂直方向向下延伸.左上角坐标为x=0,y=0的点称作原点.在默认坐标系中,每一个点的坐标都是直接 ...

  6. Gradle 实现 Android 多渠道定制化打包

    Gradle 实现 Android 多渠道定制化打包 版权声明:本文为博主原创文章,未经博主允许不得转载. 最近在项目中遇到需要实现 Apk 多渠道.定制化打包, Google .百度查找了一些资料, ...

  7. C#中如何调整图像大小

    在本篇文章中,我将介绍如何在C#中来调整你想要的图像大小.要实现这一目标,我们可以采取以下几个步骤: 1.首先要获取你想要调整大小的图像: string path = Server.MapPath(& ...

  8. css3更改input单选和多选的样式

    在项目开发中我们经常会遇到需要更改input单选和多选样式的情况,今天就给大家介绍一种简单改变input单选和多选样式的办法. 在这之前先简单介绍一下:before伪类 :before 选择器向选定的 ...

  9. Node.js使用PM2的集群将变得更加容易

    介绍 众所周知,Node.js运行在Chrome的JavaScript运行时平台上,我们把该平台优雅地称之为V8引擎.不论是V8引擎,还是之后的Node.js,都是以单线程的方式运行的,因此,在多核心 ...

  10. BPM配置故事之案例7-公式计算

    行政主管发来邮件.要求物资明细表增加"单价""总价"."单价"由其审批时填写,"总价"根据"单价"与 ...