美文网首页
XMPP适配iPV6网络小记

XMPP适配iPV6网络小记

作者: 斯文_7 | 来源:发表于2016-12-22 11:45 被阅读85次
    前几日刚做了一个基于XMPP聊天的app提交到商店,直接被拒。提示不能在iPV6环境连接网络。
    其实XMPP使用了第三方的socket库:CocoaAsyncSocket,里面包含了GCDAsyncSocket.h和GCDAsyncSocket.m文件。GCDAsyncSocket中已经对ipv4和ipv6同时做了支持,但是为何在ipv6情况下会connect失败呢。
    查看代码执行过程可以发现,在方法
    -  (BOOL)connectWithAddress4:(NSData *)address4 address6:(NSData *)address6 error:(NSError **)errPtr;
    中BOOL useIPv6变量被置为NO,从而导致代码不执行ipv6的创建操作,而是执行ipv4的创建,从而导致连接始终失败。
    
    接下来我们进行修改:
    在 GCDAsyncSocket.m 找到下面两个方法
    
    - (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];
        }
       // <---增加的代码
        
       ...
          
    }
    
    - (void)setIPv6Enabled:(BOOL)flag
    {
        // Note: YES means kIPv6Disabled is OFF
        
        dispatch_block_t block = ^{
            
            if (flag) {
              //修改的代码-->
    //            config &= ~kIPv6Disabled;// 修改前的代码
                config |= kPreferIPv6;   //修改后代码
                //<---修改的代码
            }
            else
                config |= kIPv6Disabled;
        };
        
        if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey))
            block();
        else
            dispatch_async(socketQueue, block);
    }
    
    这样就可以适配iPV6 了
    

    相关文章

      网友评论

          本文标题:XMPP适配iPV6网络小记

          本文链接:https://www.haomeiwen.com/subject/hcgcvttx.html