【指南】本地如何搭建IPv6环境测试你的APP

本文详细介绍如何在Mac上搭建IPv6测试环境,包括所需硬件准备及步骤详解。此外,还探讨了不同应用在IPv6环境下的表现,并提供了代码兼容IPv6的建议。

【指南】本地如何搭建IPv6环境测试你的APP

 

IPv6环境搭建苹果应用

 

CgkB91R0WCmAeWypAACAMt_5RHQ905500.jpg

投稿文章,作者:请勺子喝杯咖啡(简书

IPv6的简介

IPv4 和 IPv6的区别就是 IP 地址前者是 .(dot)分割,后者是以 :(冒号)分割的(更多详细信息自行搜索)。

PS:在使用 IPv6 的热点时候,记得手机开 飞行模式 哦,保证手机只在 Wi-Fi 下上网,以免手机在连接不到网络时候,会默认跳转到使用 蜂窝移动网络(即2G、3G、4G流量) 上网。

本地 Mac 搭建 IPv6 测试环境

想 要测试你的 APP 是否在 IPv6 环境下运转是否正常,你所需要的就是一台用非Wi-Fi方式上网的Mac电脑。如果你用的是 Mac 一体机网络用的有线,那么你什么也不用准备,如果你用的 Mac 本,甭管 Air 还是 Pro,只要用无线上网,你就需要一个 RJ-45 转 USB 的转换工具(因为 Mac 本没有直接插有线的接口),去某狗、某猫上淘个吧,不贵也就不到100来大洋。

搭建 IPv6 测试环境说白了就是用 Mac 做一个热点,然后用 iPhone 连接这个 Wi-Fi,听起来很容易,下面跟着我的步伐走吧。

和正常的开启 Mac 热点的方式的区别是这次我们产生的是一个本地的 IPv6 DNS64/NAT64 网络,这项功能是 OS X 10.11 新加的功能(如果你的 Mac 系统版本不是的话必须要升级哦,才能产生 IPv6 的热点呐 )。

和我们以前开启热点方式不一样的地方在于,我们在 “系统偏好设置(System Preferences)” 界面选中 “共享(Sharing)” 的同时,要按住 “Option” 键。见图:

步奏1

1291197-923dd0282bfd084f.jpg

之后在 “共享” 界面中,我们会看到和之前不一样的地方,就是红框所标的地方,多了一个叫 “创建 NAT64 网络 ” 的选框,选中它。

步奏2

1291197-cf03ab33e8789b27.jpg

接下来在 共享 窗口中,依次按图中所示的标号来,如图所示

步奏3

1291197-a9126f23ba633f6a.jpg

随后请点击 共享以下来源的连接 的下拉列表,选择我们想要共享出去的网络接口。我当前是想要共享的是 USB 10/100/1000 LAN ,(因为的我用的是 有线的 RJ-45 接头转 USB 输出的网络转换工具 )。

PS:如果你的 Mac 是用有线拨号上网的话,请选择 PPOE 选项作为共享源。如果你的 Mac 是用有线上网(不用拨号的)的话,请选择 Thunderbolt 以太网有线网 选项作为共享源。

标号1

1291197-14aa24dbebef143d.jpg

标号2,用以下端口共享给电脑 选项此处选择 Wi-Fi

1291197-e989cca54fafb6a1.jpg

标号3,点击 Wi-Fi选项... 选项,个性化自己的热点的哦

1291197-64fc857f1cf3567d.jpg

最后一步

1291197-6f34ed4696cfbf0e.jpg

大功告成

出现一下变化证明你已经成功产生了一个 IPv6 的热点

1291197-6bdab007b6152770.jpg

Wi-Fi图标变样

1291197-e6fef98a354a2b6e.png

看手机的连接共享 Wi-Fi 的变化

普通热点共享

1464081755973977.png

IPv6 热点共享

1464081777145591.png

对比2张图中 DNS 的地址看到区别了吧,一个 . 分割,一个 : 分割。

接下来,用 IPv6 的热点测试几个常用的 APP,如图:

1464081828449468.png

微信

提示无法连接服务器。不过 QQ 是可以的。

1291197-1304a07508025d2b.jpg

提示网络连接不可用。可能环信老版本的Demo也会有这种情况。解决办法就去官网查阅 SDK 文档,此处只是给出检测 IPv6 环境下APP的连通性。

苹果的规定: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:

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.

转载于:https://my.oschina.net/5951008876/blog/692828

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值