最近发现应用出现在IPv6网络环境下XMPP无法登录的情况,查询了网络资料上,发现提供的修改CocoaAsyncSocket源码的方法不起作用,参考资料http://blog.csdn.net/xuxue1072/article/details/51481102,后面通过多方查询与试验,发现只需将cocoaAsynocSocket更新到最新,里面提供了支持IPv6的方法,问题顺利解决,写此文章,以供谨记。
网络上还提供了一些更详细的修改方法,列在这供大家参考,文章链接:http://blog.csdn.net/u011604049/article/details/52288105
换成
至此GCDAsyncSocket.m修改完毕
最后不要忘了加上[asyncSocket setIPv4PreferredOverIPv6:NO];
我的这一句 是在XMPPStream.m的- (BOOL)connectToHost:(NSString *)host onPort:(UInt16)port withTimeout:(NSTimeInterval)timeout error:(NSError**)errPtr;方法里写的。到这修改完毕,快去试试你的IM IPv6吧
最后 iOS的TLS不支持压缩,GCDAsyncSocket内部已经帮我们封装了TLS协商过程。
还有 如果收到报错 KCFStreamErrorDomainSSL Code=-9807 这是因为服务器证书不是正式的证书,所以需要手动认证
我的认证是在XMPPStream的代理方法
- (void)xmppStream:(XMPPStream *)sender willSecureWithSettings:(NSMutableDictionary*)settings ;里写的
[settings setObject:[NSNumber numberWithBool:YES] forKey:(NSString *)kCFStreamPropertySSLPeerTrust];