请着重看第三条。。。
- 使用网络通讯框架;
- 避免使用 IPv4 专用的 API;
- 避免使用硬编码地址。
1> 使用网络通讯框架;
也就是是说推荐你使用 iOS SDK 自带的,构建于 socket 上层的网络通讯框架,或是第三方的网络通讯框架。这样,使用网络通讯框架的话,上面的第 2 条大体上是不用操心的。如果你使用的是第三方的网络通讯框架的话,一定记得询问该框架的开发商:“你们支援 IPv6 吗?”
作为网络通讯框架其中之一的 ProudNet™ 是支持 IPv6 的哟。自 2015 年 12 月的更新版本开始支持。ProudNet 的使用者如果要想支援 IPv6 的话,应该使用 2015 年 12 月版本,或更高的版本。
2> 避免使用 IPv4 专用的 API;
如果你亲自编程 socket 层的话,记得不能使用 IPv4 专用 API。比如说,你不能使用如下这些 API (光是使用这些函数本身,是否会成为苹果方面拒绝通过应用审核的事由,目前还不清楚。反正 ProudNet 目前是全然不使用这些函数的)。
inet_addr()
inet_aton()
inet_lnaof()
inet_makeaddr()
inet_netof()
inet_network()
inet_ntoa()
inet_ntoa_r()
bindresvport()
getipv4sourcefilter()
setipv4sourcefilter()
如果要测试在 IPv6 的环境下是否运转正常,你需要构建 IPv6 only 的网络环境。方法有很多种。我们使用的是通过 Mac 机器的方法。
3> 避免使用硬编码地址。
苹果使用的是“硬编码地址”这样的术语。不过这大体上只是对大众友好的简化说法。正确的学名其实应该叫 IP literal。比方说形如 “11.22.33.44” 这种啦。
另一方面,我们通常所说的 “hostname”,比方说“server1.mygame.com”这种,学名叫 FQDN (fully qualified domain name)。
你问,通过“硬编码地址”,也就是我们所说的 IP literal 连入服务器的话会有什么样的后果呢?一些 IPv6 网络下的客户端会连不上 IPv4 网络下的服务器(虽说 iOS 9.2 以后这个问题会部分解决,但是没法保证在所有 IPv6 网络下都没问题)。
反之亦然—客户端在 IPv4 下,服务器 IPv6。
至于连不上的原因吗,要从 NAT64 / DNS64 的联动关系说起。因为内容有点长,这里就不赘述了。
那么应该肿么办呢?乖乖地听从苹果大人所“指示”(?)的。通过 FQDN 而不是 IPv4 literal 的连入的情况下,服务器要能够接收。客户端连接服务器时则要使用 FQDN。
举例说明上面的内容:
- 192.168.1.1 ==> 苹果会屏蔽你
- server.mygame.com ==> Ok
- 11:22:33:44:55:66:77:88 ==> 苹果会屏蔽你
希望对你有些许帮助0.0
谢谢支持!