XMPPFramewoerk在IPv6环境下无法登录问题

  最近发现应用出现在IPv6网络环境下XMPP无法登录的情况,查询了网络资料上,发现提供的修改CocoaAsyncSocket源码的方法不起作用,参考资料http://blog.csdn.net/xuxue1072/article/details/51481102,后面通过多方查询与试验,发现只需将cocoaAsynocSocket更新到最新,里面提供了支持IPv6的方法,问题顺利解决,写此文章,以供谨记。


网络上还提供了一些更详细的修改方法,列在这供大家参考,文章链接:http://blog.csdn.net/u011604049/article/details/52288105

[objc]  view plain  copy
  1. {  
  2.     if (res->ai_family == AF_INET)  
  3.     {  
  4.         // Found IPv4 address.  
  5.         // Wrap the native address structure, and add to results.  
  6.           
  7.         NSData *address4 = [NSData dataWithBytes:res->ai_addr length:res->ai_addrlen];  
  8.         [addresses addObject:address4];  
  9.     }  
  10.     else if (res->ai_family == AF_INET6)  
  11.     {  
  12.         // Fixes connection issues with IPv6  
  13.         // https://github.com/robbiehanson/CocoaAsyncSocket/issues/429#issuecomment-222477158  
  14.           
  15.         // Found IPv6 address.  
  16.         // Wrap the native address structure, and add to results.  
  17.           
  18.         struct sockaddr_in6 *sockaddr = (struct sockaddr_in6 *)res->ai_addr;  
  19.         in_port_t *portPtr = &sockaddr->sin6_port;  
  20.         if ((portPtr != NULL) && (*portPtr == 0)) {  
  21.                 *portPtr = htons(port);  
  22.         }  
  23.   
  24.         NSData *address6 = [NSData dataWithBytes:res->ai_addr length:res->ai_addrlen];  
  25.         [addresses addObject:address6];  
  26.     }  
  27. }  
换成
[objc]  view plain  copy
  1. for (res = res0; res; res = res->ai_next)  
  2. {  
  3.     if (res->ai_family == AF_INET)  
  4.     {  
  5.         // Found IPv4 address.  
  6.         // Wrap the native address structure, and add to results.  
  7.           
  8.         if (((struct sockaddr_in *)res->ai_addr)->sin_port == 0)  
  9.             ((struct sockaddr_in *)res->ai_addr)->sin_port = htons(port);  
  10.         NSData *address4 = [NSData dataWithBytes:res->ai_addr length:res->ai_addrlen];  
  11.         [addresses addObject:address4];  
  12.     }  
  13.     else if (res->ai_family == AF_INET6)  
  14.     {  
  15.         // Found IPv6 address.  
  16.         // Wrap the native address structure, and add to results.  
  17.           
  18.         if (((struct sockaddr_in6 *)res->ai_addr)->sin6_port == 0)  
  19.             ((struct sockaddr_in6 *)res->ai_addr)->sin6_port = htons(port);  
  20.         NSData *address6 = [NSData dataWithBytes:res->ai_addr length:res->ai_addrlen];  
  21.         [addresses addObject:address6];  
  22.           
  23.     }  
  24. }  
至此 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:YESforKey:(NSString *)kCFStreamPropertySSLPeerTrust];
加上这一句 上面的报错就能解决了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值