公司ios开发因为工作量不大,所以不准备招人,让我负担一下…开发Android接近3年,尝试一下也不错。所以最近一个月一直在恶补ios相关基础。又因为公司是做sdk的,为了兼容所以需要掌握oc而不是swift,在我眼里,oc可是一门将要淘汰的语言…————不管怎么样,学到东西就是进步。
第一个需求是让sdk的网络请求支持ipv6,因为AppStore从6月1日以后要去上线app必须支持ipv6网络请求。这个其实在大部分产品中并不需要改动,因为一些成熟的网络框架都是支持ipv6的。
我们这边暂时使用objective-C上TCP通讯的第三方库GCDAsyncSocket来与服务端进行通信,因为自己对oc不太熟,研究了两天oc语法开始看源码,呵呵,算是速成了。
下面来解决具体问题。思路很重要,框架用的第三方库,首先排查是否支持ipv6(不支持我就跪了,一个两天速成的菜鸟重新架构sdk网络模块,呵呵,写出来自己都不敢用),运气不错,github的上的CocoaAsyncSocket开源项目 ,作者说确实支持ipv6的。心中窃喜,然后根据 针对苹果最新审核要求为应用兼容IPv6这篇文章,用Mac建立一个ipv6-only的热点进行测试,很遗憾,集成sdk的demo网络请求失败。可是我看相关代码时,里面确实是写的支持ipv6的,只不过优先使用。
后面饶了很大的一个圈,结合源码和CocoaAsyncSocket项目的上百个issue,终于发现,如果用CocoaAsyncSocket发送普通网络请求的话,默认是优先支持ipv4,如果ipv4没响应的话,再使用ipv6进行。具体可以参考这个issue.
但是这只是http请求。我们使用的是CocoaAsyncSocket中的长连接,需要连接host,所以就需要进行设置一下了。
参考文章是: XMPP兼容IPv6
在统一请求类,GCDAsyncSocket.h和GCDAsyncSocket.m核心代码中修改:
1 | - (BOOL)connectWithAddress4:(NSData *)address4 address6:(NSData *)address6 error:(NSError **)errPtr |
这段代码的含义是如果支持ipv6,优先使用ipv6.
另外在setIPv6Enable方法中做一些修改,代码如下:
1 | { |
这是段逻辑判断代码,当setIPv6Enabled传入参数是YES时,使用kPreferIPv6的参数(可能不对,oc不熟,错误请指正)
这里真的得感谢原作者了,帮忙解决了这个问题。issue上很多外国菜鸟不知道怎么解决,后来还是国内的哥们解决的,呵呵。
原文地址:http://wangruiblog.com/20160619-ios/GCDAsyncSocket-%E8%BF%9E%E6%8E%A5host-ipv6%E5%AE%9E%E7%8E%B0/