最近苹果爸爸又推了一项规范,没法只能跟着走,记录一下步骤以及遇到的问题,仅针对Quick3.3.

  • 替换curl静态库文件,直接替换external/下面的curl文件夹即可,注意在里面的prebuilt/ios下,多了2个文件:libssl.a,libcryto.a,这2个文件也需要拖进工程里引用.

  • 在iOS工程下移除quick-src/extra/crypto/md5这个文件夹的引用

  • 将lua代码中的framework/cc/net/SocketTCP.lua文件修改,将self.tcp = socket.tcp()修改为如下代码:

      local isipv6_only = false
      local addrinfo, err = socket.dns.getaddrinfo(self.host);
      for i,v in ipairs(addrinfo) do
      if v.family == "inet6" then
      isipv6_only = true;
      break;
      end
      end
      if isipv6_only then
      self.tcp = socket.tcp6()
      else
      self.tcp = socket.tcp()
      end
    

如果是个纯净工程的话,完成上述步骤,应该是已经支持ipv6 only了.

不过正常的游戏工程中,通常还会接入一些第三方sdk,需要保证这些sdk也支持ipv6 only,同时还有些sdk可能会对更新过的静态库产生影响,比如我遇到的,某语音sdk,在更换了引擎的curl库之后,竟然会导致curl库在请求一开始就crash(现在想想,估计是他们的sdk也打包了curl造成的.),完全是后面一步步重新从新工程接入时才逐步排查到这个错误,浪费了大量时间,特此笔记.

2016.09.16 Update: 前阵子提交的包又因为ipv6的问题被拒绝回来了,初步分析推测,估计是苹果总部升级了网络设备导致的,举个栗子,之前苹果的审核人员,应该是和我们本地测试一样,通过电脑网线分享出一个NAT64的网络,然后用手机连接这个WIFI进行测试,这样的做法.**如果本地路由器不支持ipv6的话,实际通过路由器发出去的请求,还是个正常的ipv4的请求.然而如果是个支持ipv6的路由器,会直接请求ipv6的地址,当DNS服务器解析不了ipv6地址,即没有AAAA记录时,将导致这个请求失败.**换言之,苹果文档里提供的方法,其实只能用来测试手机使用的那些网络请求库,是否支持ipv6.解决方法也很简单,暂时我们的解决方案就是在服务器开启ipv6,获取到ipv6地址,然后在DNS解析服务上,将该地址添加为AAAA记录.