GCDAsyncSocket 连接host ipv6实现

公司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
2
3
4
5
6
7
8
9
10
11
12
13
14
- (BOOL)connectWithAddress4:(NSData *)address4 address6:(NSData *)address6 error:(NSError **)errPtr
{
LogTrace();
NSAssert(dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey), @"Must be dispatched on socketQueue");
LogVerbose(@"IPv4: %@:%hu", [[self class] hostFromAddress:address4], [[self class] portFromAddress:address4]);
LogVerbose(@"IPv6: %@:%hu", [[self class] hostFromAddress:address6], [[self class] portFromAddress:address6]);

//增加的代码
if(address6)
{
[self setIPv6Enabled:YES];
}
……
}

这段代码的含义是如果支持ipv6,优先使用ipv6.

另外在setIPv6Enable方法中做一些修改,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
{
// Note:YES means kIPv6Disabled is OFF

dispatch_block_t block = ^{

if (flag)
config |= kPreferIPv6; //修改后代码
else
config |= kIPv6Disabled;
};

if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey))
block();
else
dispatch_async(socketQueue, block);
}

这是段逻辑判断代码,当setIPv6Enabled传入参数是YES时,使用kPreferIPv6的参数(可能不对,oc不熟,错误请指正)

这里真的得感谢原作者了,帮忙解决了这个问题。issue上很多外国菜鸟不知道怎么解决,后来还是国内的哥们解决的,呵呵。

原文地址:http://wangruiblog.com/20160619-ios/GCDAsyncSocket-%E8%BF%9E%E6%8E%A5host-ipv6%E5%AE%9E%E7%8E%B0/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值