iOS 支持IPv6-Only网络资料整理

导语:

自从5月初Apple明文规定所有开发者在6月1号以后提交新版本需要支持IPV6-Only的网络。自从苹果实施以来,也遇到了各种各样的问题,现此把知道的资料整理一下

首先,说明一下什么是IPv6

IPv6是Internet Protocol Version 6的缩写,其中Internet Protocol译为“互联网协议”。IPv6是IETF(互联网工程任务组,Internet Engineering Task Force)设计的用于替代现行版本IP协议(IPv4)的下一代IP协议,号称可以为全世界的每一粒沙子编上一个网址[1]。

为什么用IPv6?

由于IPv4最大的问题在于网络地址资源有限,严重制约了互联网的应用和发展。IPv6的使用,不仅能解决网络地址资源数量的问题,而且也解决了多种接入设备连入互联网的障碍。
与IPv4相比,IPv6具有更大的地址空间。IPv4中规定IP地址长度为32,最大地址个数为232;而IPv6中IP地址的长度为128,即最大地址个数为2128。与32位地址空间相比,其地址空间增加了2128-232个。
其他优势,请大家自行Google。

IPv6地址是什么样的?

IPv6地址格式为X:X:X:X:X:X:X:X,其中每个X表示地址中的16b,以十六进制表示,例如:ABCD:EF01:2345:6789:ABCD:EF01:2345:6789

苹果指的IPv6-Only网络是什么?

IPv6 DNS64/NAT64网络即是所谓的IPV6-Only网络,该网络可以通过转换的方式来继续访问IPv4地址。

IPv6 DNS64/NAT64网络是什么?

可以通过以下流程图和时序图来了解


NAT流程

IPv6 DNS64/NAT64网络下IPv6地址与IPv4地址交互的时序图
其中

DNS(Domain Name System,域名系统),通过DNS服务器,解析域名为IP地址
NAT(Network Address Translation,网络地址转换),内网IP地址到外网IP地址的转换

我现在是IPv4网络环境,我该怎么测试IPv6网络呢?

苹果提供了一个搭建虚拟IPv6 DNS64/NAT64网络的方法,要求Mac设备在Mac OS 10.11以上系统,通过有线网开一个IPv6-Only网络的热点,原理图如下:


Mac搭建IPv6 DNS64/NAT64虚拟网络原理图
Mac搭建IPv6 DNS64/NAT64虚拟网络原理图

步骤如下:

  • 进入设置页面,按住Option键点击分享
  • 勾选创建NAT64网络
  • 点击互联网共享,共享以下来源的链接,选择以太网;用以下端口共享给电脑,选择Wifi
  • 点击Wifi选项,设置Wifi名称和密码
  • 勾选互联网共享,之后一直点确定即可
    具体操作图如下:
Paste_Image.png
Paste_Image.png
Paste_Image.png
Paste_Image.png
Paste_Image.png
Paste_Image.png
Paste_Image.png
Paste_Image.png

出现以下图片,即热点开成功了


Paste_Image.png

Apple如何审核支持IPV6-Only?

经过查阅相关资料和上传的版本来看,苹果审核的时候使用最新的系统(目前是IOS9.3.2)来测试IPv6-Only网络的,应该是在该网络下可以正常使用即可。并不会扫描应用内IPv4专有的底层API。

Note: In iOS 9 and OS X 10.11 and later, NSURLSession and CFNetwork automatically synthesize IPv6 addresses from IPv4 literals locally on devices operating on DNS64/NAT64 networks. However, you should still work to rid your code of IP address literals.

对于使用了写死IPv4地址来交互的朋友。苹果提到,在iOS9以上的系统,苹果自己会做IPv4转IPv6地址的转换,所以如果应用中写死的IPv4地址,并且是使用NSURLSession and CFNetwork(测试发现NSURLConnection也是可以的)来做网络请求,则在IOS9以上系统,还是可以在IPv6-Only网络正常运行的,所以是可以通过审核的之后可能还是有风险,建议还是换成域名)。

应用如何支持IPV6-Only?

  • 使用AFetworking做网络交互的朋友,需要使用最新版本替换AFNetworking中的Reachability类(看源码发现,也只是针对iOS9以上的系统做了特殊处理)
  • ASIHttpRequest虽然使用的是CFNetwork,但是在网上看到有人反应,IPv6网络上不能正常运行,所以。。。还是换AFNetworking吧,ASI早就没人维护了
  • 对于底层的socket API,这一块,主要是在IPv6-Only网络下,需要将IPv4地址转换为IPv6地址,可以参考笔者后面提供的代码,还要要注意的是,可能有的服务端那边会通过请求头中的Host来校验是IPv4还是IPv6环境(不处理的话,默认Host中会是IPv6地址),所以Host这个地方需要注意一下(服务端没有配IPv6地址的换,可能会有问题),根据具体场景来处理
  • 对于播放这一块,如果使用的是系统的播放器,走的是HLS,而且使用的写死IPv4地址。对于清流的片源,经过我们的测试,只要把开始的播放URL(重定向之前的URL)中将IPv4地址转换为IPv6地址即可。

iOS中将IPv4地址转换为IPv6地址

在iOS 9.2版本系统后,通过getaddrinfo转换ipv4得到ipv6地址,该方法只能在iOS9.2以后才有效。
OC代码

#include <sys/socket.h>
#include <netdb.h>
#include <arpa/inet.h>
#include <err.h>

#define CopyString(temp) (temp != NULL)? strdup(temp):NULL
- (NSString *)getIPAddress:(NSString *)ipAddress {
    if (!ipAddress) {
        return @"";
    }

    struct addrinfo hints, *res, *res0;
    int error;

    const char *ipv4_str = [ipAddress UTF8String];
    
    memset(&hints, 0, 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(1, "%s", gai_strerror(error));
        return @"";
    }
    
    struct sockaddr_in6* addr6;
    struct sockaddr_in * addr;
    const char* pszTemp;
    
    for (res = res0; res; res = res->ai_next) {
        char buf[32];
        if(res->ai_family == AF_INET6) {
            addr6 = (struct sockaddr_in6*)res->ai_addr;
            pszTemp = inet_ntop(AF_INET6, &addr6->sin6_addr, buf, sizeof(buf));
        } else {
             addr = (struct sockaddr_in*)res->ai_addr;
             pszTemp = inet_ntop(AF_INET, &addr->sin_addr, buf, sizeof(buf));
        }

        break;
    }
    
    freeaddrinfo(res0);
    printf("getaddrinfo ok %s\n", pszTemp);
    return [NSString stringWithFormat:@"%s",CopyString(pszTemp)];
}

C++代码可以参照:
iOS 解决ipv6问题

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,602评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,442评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,878评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,306评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,330评论 5 373
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,071评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,382评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,006评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,512评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,965评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,094评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,732评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,283评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,286评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,512评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,536评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,828评论 2 345

推荐阅读更多精彩内容