美文网首页iOS开发iOSiOS开发资源
针对苹果最新审核要求为应用兼容IPv6

针对苹果最新审核要求为应用兼容IPv6

作者: 我不是段誉 | 来源:发表于2015-12-02 02:12 被阅读70171次

在WWDC2015上苹果宣布iOS9将支持纯IPv6的网络服务。2016年初开始所有提交到App Store的应用必须支持IPv6。为确保现有的应用是兼容的,我们需要注意下面几点。

不建议使用底层的网络API

下图展示的蓝色部分的这些API都是不存在兼容性问题的,而我们平时自己用的包括那些第三方的网络库大部分都是用的这些API。

Networking frameworks and API layers

大部分情况下,我们用高级的API完全能够实现我们的需求,而且高级API封装的很便于使用,很多底层的像适配IPv6的工作都已经帮我们做好了。而用底层API会有大量的工作要我们自己来做,更容易产生bug。但你如果确实需要用底层的POSIX socket API, 请参照这个RFC4038: Application Aspects of IPv6 Transition的指导。

不要用IP地址

比如下面这个API,nodename这个参数不要传IP地址,而应该用域名

SCNetworkReachabilityCreateWithName

这个方法在著名的Reachability中是用到的,我们常用的网络库AFNetworking就用了这个。所以用到的同学得好好查一下了,另外这个项目的作者几天前刚刚就这个问题有一个新的提交,不过最新的release版本中还没有加进去,可以点下面链接先去看看他都改了哪些地方。

Added support for IPv6 to Reachability #3174

检查不兼容IPv6的代码

搜一下工程里有没有下面的这些API,这些都是只针对IPv4做处理的,有的话就删了。

inet_addr()

inet_aton()

inet_lnaof()

inet_makeaddr()

inet_netof()

inet_network()

inet_ntoa()

inet_ntoa_r()

bindresvport()

getipv4sourcefilter()

setipv4sourcefilter()

如果用到了下面左边的这些IPv4的类型,那么它们相应的IPv6类型也需要做处理

IPv4-IPv6

本地搭建IPv6测试环境

最后我们来搭一个IPv6的测试环境吧,你所需要的就是一台用非Wi-Fi的方式上网的Mac电脑。

我们的要做的其实就是用Mac做一个热点,然后用iPhone连接这个Wi-Fi,听起来很容易,我相信大家在公司就是这么干的吧。

区别是这次我们产生的是一个本地的IPv6 DNS64/NAT64网络,这项功能是OS X 10.11新加的。和我们以前开启热点方式不一样的地方在于,我们在“System Preferences”界面选中“Sharing”的同时,要按住“Option”键。

System Preferences

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

Sharing

之后就是按照正常的创建热点的流程走完就行了。

现在我们用iPhone连接上这个刚创建好的热点就可以测试了,注意此时要把iPhone设成飞行模式,以保证只用Wi-Fi上网。

相关文章

网友评论

  • Loki_:请问一下,我用这个方法设置了ipv6的网络,手机也可以连接上,DNS也是:格式的,手机也可以上网,但是我用Safari访问http://test.ipv6.com,还是告诉我没有检测到ipv6地址,请问这个是什么情况?是ipv6是设置成功了还是没有成功?
    徐的啦啦啦:咋解决的兄弟?我也是
    人间失格_d31e:怎么解决的
  • adcf54fccc2b:还是在淘宝直接找了就过了,折腾我一个月,差点饭碗都丢了。悲剧,看在商家给我帮大忙的份上,给个链接:https://item.taobao.com/item.htm?spm=a1z09.8149145.0.0.vx1Dqx&id=551906449495&_u=7nvvofbb6c
  • abb266389fd0:楼主你好,请问一下,为啥我的APP在IPV6环境下,有些接口能访问,有些接口访问不了?
  • d78086abd95f:程序里面嵌套web页面的url要不要用域名
  • 44d3387e09f3:我想请问一下,项目里面的一些老框架不更新了.但是用到的AFN是2.0的,然后我在本地用ipv6环境测试,是可以请求数据的,请问这样子会被拒吗
    我不是段誉:@Marcello_Gong 不行
    44d3387e09f3:@我不是段誉 但是用本地搭建的ipv6环境可以请求数据,也不行吗
    我不是段誉:@Marcello_Gong AFN2不行
  • 小酒窝_David:问个问题,我们是用webview去加载一个url,这个ulr是一个ip地址,ipv4的,我去加载这个url的时候,能加载成功吗,现在的问题是加载不成功,webview直接不去加载,要做什么样的修改,才能让他去加载这样的url呢,谢谢
  • 春天的蛋蛋:学习到了
  • 客子雪姬:楼主哥,我按要求删掉了硬编码,对ip 和代码适配进行了处理,但还是无法链接,请问这会是什么原因啊。
    附上代码:int InitUpdSocket(char* pIPaddr,unsigned int nPort) //万万

    {
    //____________________________
    m_nUdpSocketHanle = setupStreamSocket(30);
    if (m_nUdpSocketHanle == -1) return 0;

    struct sockaddr_in6 destAddress;
    destAddress.sin6_len = sizeof(struct sockaddr_in6);
    destAddress.sin6_port = htons(nPort);//端口必须是网络字节序
    // destAddress.sin6_addr = in6addr_loopback;
    destAddress.sin6_family = AF_INET6;

    int n = inet_pton(AF_INET6, pIPaddr, &destAddress.sin6_addr);
    if(n == 0)
    {
    fprintf(stderr, "not in presentation format\n");
    exit(2);
    }
    else if(n == -1)
    {
    perror("inet_pton error");
    exit(3);
    }

    printf("sizeof(servaddr) = %lu\n", sizeof(destAddress));

    if(connect(m_nUdpSocketHanle, (struct sockaddr *)&destAddress, sizeof(struct sockaddr_in6)) == -1)
    {
    NSLog(@"errno IS =====%d",errno);
    perror("connect error:");
    exit(4);
    return 0;
    }
    return 1;

    这里的ip地址已经进行了转换。
  • 正在输入__:创建ipv6的共享网络,我用手机连接以后,找了个测试网站,发现还是ipv4
    我不是段誉:@正在输入__ 这个正常,只是对内是IPv6
  • ycq_520:你好,我现在在局域网搭建了一个ipv6环境,想访问ipv4的一台电脑服务器,用内网ip 比如192.168.0.211:8099,但不成功,我这样测试方式是对的吗
  • 45378e6ff67c:我也有个问题,我现在在ipv6环境下进行聊天,文字信息瞬间就发送出去了,但是语音要等好长时间才发送出去,这是什么原因?
  • 869d26254b81:lz问一下哦,我这代码是用1点多版本的afnetworking,要怎么实现支持ipv6呢,不能直接更新afnetworking,因为封装的方法都是集成那个弃用的类的
    我不是段誉:@ar_lxr 你还是更新了AF再改吧,要不以后更麻烦
  • 1bc2e1e2d0d0:你好 我的程序在这个环境下 自测一切正常 但是还是被苹果拒绝了 为什么啊? 苹果会关注怎么实现的吗?
  • jadyn_JT:楼主,按照您的方法搭建IPV6后,手机连接macWifi却连不上,请问下要怎么解决?
    e134a1dbdbab:跟我头像一样,,,,:sweat:
    我不是段誉:@风雨骑士 换个DNS试试
  • 97030f7d00c7:我的应用在模拟的ipv6-only环境下测试通过,但是还是被被苹果拒了。通过最后给出的log,定位到代码是卡在一开始的http请求上,我是使用的NSURLSession,访问的url也是域名,为什么苹果那边就有问题呢。这个域名指向的地址是一个ipv4地址,这个应该没有问题吧。
    肥肥牛油果:@AllenShen 重复提交之后, 再次打回来说卡在登录处连接不成功…所以现在在想是不是服务器对IPv6的解析没有支持…谢谢你!
    97030f7d00c7:@肥肥牛油果 重新提交就好了
    肥肥牛油果:@AllenShen 同遇到这个问题, 一模一样, 想请教一下, 你是怎么解决这个问题的呢?
  • 我爱姜汁松花蛋:为啥我的mac没有叫“Create NAT64 Network”的选框,我也是接的宽带啊
  • daqiang:我的mac 怎么没有找到这个选项啊 LZ
    我不是段誉:@daqiang 仔细看文章
  • 天山向右:手机打开飞行模式???
  • 傲视众生的冰块:刚好用到,多谢楼主
  • 十三亿少女梦丶:mac 版本10.11.4 没有create nat64 network 选项 怎么办
    我不是段誉:@RunnningYoung 仔细读文章
  • 齐天大圣就是我:用ipv4的ip不行 但是用域名可以
    有谁知道这是为什么嘛?
  • 想吃小馄饨啊:LZ,如果要是用的 MacBookAir 的话怎么测试 ipv6环境啊,这个好像不能创建 WiFi
    我不是段誉:@遇见在转角 得先用其他网卡连网
  • flycl:" 用到了下面左边的这些IPv4的类型,那么它们相应的IPv6类型也需要做处理 " 我有用到,但是应该如何处理呢?
    flycl:@我不是段誉 能大概说下怎么处理吗?
    我不是段誉:@flycl 不是
    flycl:@flycl 比如说,用到了, AF_INET 是直接改成 AF_INET6 吗?
  • 5d799bc8380f:测试在ipv6下能正常使用就可以通过审核了吗。为什么sdwebimage说现在还不支持ipv6但是,我现在一样可以在ipv6下正常使用呢
    5d799bc8380f:@我不是段誉 现在要提交审核了,有没有什么好的建议。 :cold_sweat:
    5d799bc8380f:@我不是段誉 :sob:
    我不是段誉:@AsukaLange 苹果审核具体怎么检查IPv6还不清楚,只能等被拒了再看
  • 7720da04604f:你好 我的APP里面用的是AFNETWORKING 3.0 但是接口地址的域名换成IPV4的地址这样子会被拒吗
    3e858b85c36f:@dragon1061 审核通过了么?
    7720da04604f:@我不是段誉 谢谢了 我是今天提交的 正担心这个问题
    我不是段誉:@dragon1061 不会
  • 诸子百家谁的天下:一开始不明白,现在看了你的博客才明白这个意思了!还是那代码说话能看的懂!
  • 周小公子丶:如果网络请求不成功就是没有配置成功?把
  • 周小公子丶:那我们平时用的AFNetworking 用的时候还有什么要注意的吗
  • 武小寺:请教个问题,AFN3.0现在支持IPv6了吗?

    如果我不升级三方库,但是把请求地址改成域名,是不是审核就没有问题

    因为我升级了AFN3.0,请求会报错
    我不是段誉:@天空独舞 af升级了,不过仍不能排除其他地方使用相关API
  • 14e4f94f76a4:请问我在判断网络状态的时候用了zeroAddress.sin_family = AF_INET会有影响吗?
  • 小如99:LZ,我5月12号之前上的版本都没问题,但是我代码里面一直都有inet_ntoa这样的字段,没有影响我的审核,是啥情况?
    我不是段誉:@小小如 我也不清楚苹果审核时候是怎么判断的,不过之前确实是这样要求的
  • 跑调的安眠曲:我想获取网关ip,之前都是使用的ipV4的,现在怎么去兼容ipV6?有没有推荐的帖子或者方法?
  • Windream:“搜一下工程里有没有下面的这些API,这些都是只针对IPv4做处理的,有的话就删了”。
    这里直接删掉代码就行了?不做其他处理吗?
    Windream:@我不是段誉 非常感谢!
    我不是段誉:@梦兜儿她爸爸 删掉了再用兼容的方法处理
  • 一杯开水:这个我可以理解为接口不是ip类型的就是兼容的么?????我刚进一个公司周三要释放版本了,求LZ帮助下。
    一杯开水:@我不是段誉 有什么方法可以解决这个问题呢?求大哥指教。
    我不是段誉:@一杯开水 不一定,有可能你用的第三方库里用了
  • G丶岐岐岐岐岐岐:还在用ASI的是不是要换框架了......
    我不是段誉:@G丶岐岐岐岐岐岐 什么框架不重要,主要是查API
  • 行发乎迩:怎么才能看测试环境搭建成功了呢?我配置之后,手机上app使用网络跟之前的都一样,用手机浏览器打开http://www.test-ipv6.jp显示还是ipv4....
    Loki_:请问你的问题解决了吗?我也是配置后,用手机浏览器打开http://www.test-ipv6.jp显示还是ipv4,请问这个是设置成功了吗?
  • 北暖37:关于用mac设置IPv6 wifi,共享wifi来源的连接必须选择Thunderbolt网桥吗,选择以太网不行吗,还有,项目在IPv4跟IPv6环境下,并没有太大区别,就代表兼容IPb6了吗?
    北暖37:@我不是段誉 那这种兼容符合苹果要求的兼容IPv6吗,这样会被拒吗
    我不是段誉:@慕糖123 代码层面的兼容
  • e98dfc457ce7:请问一下我的工程当中有用到AF_INET、sockaddr_in之类的东西,但为什么用ipv6的网络环境测试是可以的?
    我不是段誉:@小不知道人 还是要有相应IPv6的类型处理
    e98dfc457ce7:@我不是段誉 我有去看那段代码确实是走了,因为AFN和Reachability确实是有用到,这种情况是算支持了还是没支持呢?
    我不是段誉:@小不知道人 出现了并不一定就用到
  • 想跳舞的蚂蚁:不太明白不使用IP地址什么意思, 我一直直接用的 IP地址,这个有问题吗??????
    d214da088bee:@myKings 经过测试发现 ipv6 测试环境下, 用 IP 也可以 正常访问, 不知道是什么原因, 各位有新进展吗?
  • JackYin:请问现在客户端是要兼容ipv4和ipv6吗?还是只支持ipv6?如果支持ipv6服务器岂不是都要改?
    JackYin:AFNetworkReachabilityManager.m中采用条件编译去处理ipv4和ipv6的问题,会不会出问题,例如客户端最低支持6.0,AFNetworkReachabilityManager中只支持ipv4,而不能支持ipv6?无法兼容?
    我不是段誉:@JackYin 兼容
  • d214da088bee:我们使用了TCP的方式 连接 某一域名, 通过 IPV6测试环境, 发现 无法连接成功, 但是 使用 其他网络环境是正常的. 请问 这是什么原因,
    JackYin:@cmouse2010 我这边也发现有问题,请问你是如何解决的?
    d214da088bee:@cmouse2010 难道是域名 解析 到了 IPV4 地址 所以不可以用? 这个不可能吧.
  • Inlight先森:你好,感谢分享,想问一下本地搭建IPv6测试环境发出的wifi 为什么手机连上之后wifi 显示正常 却无法上网
    Inlight先森:@cmouse2010 恩 我们网线可以上网的
    d214da088bee:@Dalla尹 网线 是可以 正常 上网的吗? 我 使用 IPV6测试环境后, 微信无法正常 使用, QQ 是可以正常使用的.
  • 我叫大大虾米:是不是我们的外网不只是ipv6呢
  • 我叫大大虾米:怎么才能看测试环境搭建成功了呢,
    我叫大大虾米:@我不是段誉 现在找到了,但是其他连接这个wifi的上不去网
    我不是段誉:@我叫大大虾米 找不到Wi-Fi?你好好检查一下吧
    我叫大大虾米:@我叫大大虾米 共享源我选择的Thunderbolt 网桥,端口我选择wifi 也设置了账号密码,但是手机搜索不到这个wifi 啊
  • 轶匠:能告知一下吗,楼主
  • 轶匠:我门项目用了苹果官方的Reachability 这个类,里面用到了:

    struct sockaddr_in zeroAddress;
    bzero(&zeroAddress, sizeof(zeroAddress));
    zeroAddress.sin_len = sizeof(zeroAddress);
    zeroAddress.sin_family = AF_INET;

    我不知道做什么处理
    iVikings:@Kangxin #if (defined(__IPHONE_OS_VERSION_MIN_REQUIRED) && __IPHONE_OS_VERSION_MIN_REQUIRED >= 90000) || (defined(__MAC_OS_X_VERSION_MIN_REQUIRED) && __MAC_OS_X_VERSION_MIN_REQUIRED >= 101100)
    struct sockaddr_in6 address;
    bzero(&address, sizeof(address));
    address.sin6_len = sizeof(address);
    address.sin6_family = AF_INET6;
    #else
    struct sockaddr_in address;
    bzero(&address, sizeof(address));
    address.sin_len = sizeof(address);
    address.sin_family = AF_INET;
    #endif
    1f8b6c41a3a0:@我不是段誉 Lz有判断IPv6网络的办法么,提供下哈。
    我不是段誉:@一萝卜根儿 就是判断如果是IPv6的类型,换成相关的API
  • 轶匠:Lz所说的:如果用到了下面左边的这些IPv4的类型,那么它们相应的IPv6类型也需要做处理, 是指 做什么处理?
  • leftwater:恩 今天看新闻 苹果已公布了这个消息了
  • Fatm:想问一下,现在项目的正式环境是用域名的,测试环境用的内网的ip地址,提交时把内网的ip的宏注释掉了的,还会影响app的审核吗?
    若有一个:@我不是段誉 测试环境 的 ip 不注释 有问题吗?
    Fatm:@我不是段誉 好的,谢谢你啦
    我不是段誉:不影响
  • fefb83d3d668:LZ按照本文所说的方式发射一个IPV6的wifi 但是连接wifi显示的ip地址还是ipv4的地址,用手机浏览器打开监测连接环境也是显示的ipv4 上面那个创建热点的方法的确可行么?
    fefb83d3d668:@TEL淡笔青春 好啦 我弄懂了,只需要一个ipv4就可以创建一个ipv6的热点,苹果官方文档带有的图上面写明白了。。 :blush:
    fefb83d3d668:@TEL淡笔青春 我有一个疑问不太清楚,就是创建一个ipv6的热点的 前提条件是什么。就是说我创建一个ipv6的热点的前提必须是我原本的有线网络本来就既支持ipv4又支持ipv6,还是说原本的有线网络只需要是ipv4就可以创建一个ipv6的热点,因为我现在的有线网络只有ipv4,而创建出来的热点我也没有办法确认它就是一个ipv6的热点(而且上面所说各项检查也说的是一个ipv4的网络),有没有好的证明方法。
    118e85cfa9cd:@ChavezChen 我这边按LZ所说的新建IPv6网络,是没问题的
  • 118e85cfa9cd:LZ,关于“检查不兼容IPv6的代码”中,有IPv4的类型,没对IPv6做处理,但在IPv6测试环境中,网络请求都没问题,这样算兼容IPv6了吗?
    我不是段誉:@TEL淡笔青春 是的
    118e85cfa9cd:那这样说,AFN3.0没兼容IPv6咯。。。
    我不是段誉:@TEL淡笔青春 不行
  • leep:测试如何才算通过?在iPv6 的测试环境下,APP 运行情况等同于iPv4 环境 ,就说明测试成功了吗?
    丶Destinyxl:@水户洋平_Psist 你好 我们现在也遇到了这个问题,请问你们怎么通过的?
    水户洋平_Psist:@我不是段誉 你好 那我们的APP在ipv6的环境下使用没有问题 为什么还会被拒呢 ,访问接口用的是域名方式。之前有失败过的同学说用IP地址访问可以 ,请问下 这是什么情况。
    我不是段誉:@leep 是的
  • 0f730f74e658:请问要支持ipv6,服务器需要怎么改?
    我不是段誉:@说过 非要用IP的话,要兼容IPv6的
    0f730f74e658:@我不是段誉 谢谢您的回答,再请问一个问题,如果在客户端非要用IP地址访问服务器,有没有什么办法?
    我不是段誉:@说过 需要路由器设置
  • zyg:不错~
  • Mr_BoBoy:域名请求和IP请求是什么意思? 现在不都是通过接口请求的吗? 服务器接口不就是正常的www.xxx之类的域名嘛? 不是很明白所说的域名和IP,到底是什么意思?能简单说一下吗? :relaxed:
    Mr_BoBoy:@我不是段誉 哦,那很简单,抓包工具看一下,就知道了。
    我不是段誉:@Mr_BoBoy有一些接口可能是固定IP的
  • d2ba60203f8a:域名请求会有影响么?
    ea962da1e9a2:@我不是段誉 哥,能加下你的QQ号聊下吗..
    我不是段誉:@呆若木鱼 没有
  • atool:如果hostname使用域名地址,但是这个域名解析到一个IPv4的IP地址,这样的app会被苹果处理吗?
    0d234c599cd0:那这样的话可以这样理解么:只要app客户端支持ipv6和ipv4,后台那边支不支持ipv6是没有影响的。
    atool:@我不是段誉 这样的话,过渡确实会比较平缓~
  • 曾樑:方便可用

本文标题:针对苹果最新审核要求为应用兼容IPv6

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