XMPP适配IPV6 (GCDAsyncSocket适配IPV6)

苹果公司要求在6月1号之后上架Appstore的应用必须通过ipv6兼容测试。

最近到了八月份,开始发现新上架的app没有通过,查看了下原因,说没有适配IPV6。

首先在本地搭建一个IPV6的测试环境,使用mac搭建详情请看 http://blog.csdn.net/yuwuchaio/article/details/51459705

如果项目用使用了XMPP 你会发现在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的创建,从而导致连接始终失败。

找到了问题的原因,下面就可以对其进行处理解决。对上文提到的方法进行修改。代码如下:

- (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];
    }

   ...

}

另外在setIPv6Enabled:方法中也做如下的修改

- (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的环境测试了。

时间: 2024-07-30 13:40:11

XMPP适配IPV6 (GCDAsyncSocket适配IPV6)的相关文章

AndroidAutoLayout全新的适配方式堪称适配终结者(转载)

AndroidAutoLayout全新的适配方式堪称适配终结者 转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/49990941: 本文出自:[张鸿洋的博客] 一.概述 相信Android的开发者对于设配问题都比较苦恼,Google官方虽然给出了一系列的建议,但是想要单纯使用这些建议将设备很轻松的做好,还是相当困难的.个人也比较关注适配的问题,之前也发了几篇关于适配的文章,大致有: Android 屏幕适配方案 Android

iOS6和iOS7代码的适配(3)——坐标适配

由于iOS7里面status bar和视图是重叠在一起了,所以应用的y坐标就没法和以前一致了,需要重新计算设定.基本上,你的应用用Xcode5运行一下就能看见这个问题,这里写了一个最简单的例子,一个View上加了一个Label控件,分别在iOS6和iOS7的模拟器上的样子. 从图上明显可以看到,iOS7上的应用y坐标起始计算点是从屏幕顶点算起,而iOS6是从status bar来算起,这个原因是导致一切问题的根源. 好了,找到了问题就好办,我列举一下看到过的尝试过的方法: 1. 修改window

老毛子 Padavan 路由器固件开启教育网 IPv6 并实现IPv6转发

老毛子 Padavan 路由器固件开启教育网 IPv6 并实现IPv6转发 文章目录[隐藏] 一.开启opt环境 二.开启 WAN 端 IPv6 三.安装并运行 6relayd 四.开机自动安装并配置 6relayd 脚本 五.解决 6relayd 自动掉线 六.总结 设置字体大小: 小 中 大 自从给小米路由器mini刷了老毛子固件之后就特别想实现路由器的 IPv6 服务,最近刚到学校就开始折腾,到今天总算是比较完美了.注意:此教程只适用于老毛子Padavan 华硕固件,并且有原生 IPv6

IPv6技术系列⑥——IPv6 SLAAC与有状态自动配置

拓扑结构 1.配置无状态自动获得IP地址(SLAAC) Router0:ipv6 unicast-routing ----开启ipv6路由功能后,才可以发送RAinterface G0/0ipv6 address 2023::2/64no shutdowRouter1:interface G0/0ipv6 address autoconfig执行:show ipv6 interface FastEthernet 0/0查看接口状态 2.调整ND Router0:interface g0/0ipv

IPv6 app适配

参考资料: https://developer.apple.com/library/mac/documentation/NetworkingInternetWeb/Conceptual/NetworkingOverview/UnderstandingandPreparingfortheIPv6Transition/UnderstandingandPreparingfortheIPv6Transition.html#//apple_ref/doc/uid/TP40010220-CH213-SW1

利用IPv6 Tunnel实现IPV6网站发布解决IOS审核的问题

1.打开https://tunnelbroker.net/,选注册 填写注册信息,如下图所示: 登录上图注册的邮箱,会收到一封注册的邮件,打开邮件中的链接,实现用户的注册: 用所创建的帐号登录,选择"Create Regular Tunnel", 在下图中输入本端遂道的地址,选择香港的服务器,选"Create Tunnel" 查看已经创建的遂道,先选"Transit",再选"Free IPv6 Tunnel",就可以显示已经创

iOS开发——适配篇&App适配简单概括

App适配简单概括 1:适配:适应.兼容各种不同的情况 系统适配 针对不同版本的操作系统进行适配 屏幕适配 针对不同大小的屏幕尺寸进行适配 在用户眼中 屏幕是由无数个像素组成的 像素越多,屏幕越清晰 在开发者眼中 屏幕是由无数个点组成的,点又是由像素组成的 像素越多,屏幕越清晰 iOS设置尺寸图 一:Autoresizing:基本的控件布局----掌握 在Autolayout之前,有Autoresizing可以作屏幕适配,但局限性较大,有些任务根本无法完成 相比之下,Autolayout的功能比

iOS - 屏幕适配-之自动适配

最近把xcode升级到7,然后就是各种蛋疼的问题,出现,期中有一个就是屏幕适配的问题,由于 我的项目比较老,所以,一直没怎么注意过屏幕适配,都是ios 自动适配,这在ios8 之前都没有问题,但是在ios9后,这个问题就出现了,启动程序后,,出现上下边黑屏,找了些资料,弄明白: 从Xcode6 GM版本开始,模拟器新增了iPhone6和iPhone6 Plus两种,如果旧的工程直接跑到这两个模拟器中时,默认是"兼容模式",即系统会简单的把内容等比例放大,显示效果有些模糊但尚可接受.此时

Android AutoLayout全新的适配方式 堪称适配终结者

转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/49990941: 本文出自:[张鸿洋的博客] 一.概述 相信Android的开发者对于设配问题都比较苦恼,Google官方虽然给出了一系列的建议,但是想要单纯使用这些建议将设备很轻松的做好,还是相当困难的.个人也比较关注适配的问题,之前也发了几篇关于适配的文章,大致有: Android 屏幕适配方案 Android 百分比布局库(percent-support-lib) 解析与