苹果官方出了新的规定,要求新上架的app都必须单独支持ipv6-only的网络。

具体的要求链接:https://developer.apple.com/library/mac/documentation/NetworkingInternetWeb/Conceptual/NetworkingOverview/UnderstandingandPreparingfortheIPv6Transition/UnderstandingandPreparingfortheIPv6Transition.html#//apple_ref/doc/uid/TP40010220-CH213-SW13

热心的网友来了个中文版本的:

http://kepenj.me/2016/05/22/Supporting-IPv6/

全民神魔跟三打白骨精两个项目用的还是两年前的cocos2dx3.0rc版本,明显各种不支持。而且我们自己重写了socket,所以需要修改的地方有下面三个:

1.curl

开始的时候,自己上curl上了个最新的源码,替换掉旧的,结果不行。

然后发现原来还有个libcurl.a的库要替换的。一并替换了,也是不行的。

然后就把电脑里的好几个版本都拿去替换,还是不行。

最后,实在没办法,跑去cocos2d-x官网看有没有相关历史版本可以尝试使用的。结果看到这个:

[3.11.] 支持IPV6-Only网络
[3.11] Chipmunk升级到v7.0.1
[3.11] JSB使用新的内存模型,在JS脚本不需要关心对象的生命周期,该特性默认关闭
[3.11] CURL升级到v7.
[3.11] OpenSSL升级到v1..2g
[3.11] 可以使用VSCode或者新版本的Firefox调试JSB程序
[3.11] 全面升级 WebGL 渲染器

也就是官网特地加多个版本,去解决这个IPV6-Only网络的问题。

知道这个就好办了,直接下载最新的引擎。拿里面的关于curl的库跟源码对旧项目进行替换。

a库那里有个问题稍微测试下,旧版本的cocos2dx只有libhcurl.a,而新版本的是有libcurl.a, libssl.a, libcrypto.a,三个都要加进去,而且还要加到项目的引用。

2.host to ip
域名到ip的转换。

我们的服务器是配置了域名,然后把客户端连接的时候,先进行域名到ip的转换。再用ip去连接服务器。

原来我们用的是 gethostbyname的方法去获取ipv4的ip。上面发的链接里有提到这个问题,ipv6要用gethostbyname2。

也是做了尝试,实在c语言水平有限,而且也不知道怎么去判断网络是ipv4还是ipv6的问题。

最后找到了另外一个域名转换ip的方法。就是用getaddrinfo,这个方法的好处在于,解决了转换IP,又解决了判断网络。

这个是oc代码。

- (NSString *) getIPWithHostName:(const NSString *)hostName {
struct addrinfo * result;
struct addrinfo * res;
char ipv4[];
char ipv6[];
int error;
BOOL IS_IPV6 = FALSE;
bzero(&ipv4, sizeof(ipv4));
bzero(&ipv4, sizeof(ipv6)); error = getaddrinfo([hostName UTF8String], NULL, NULL, &result);
if(error != ) {
NSLog(@"error in getaddrinfo:%d", error);
return nil;
}
for(res = result; res!=NULL; res = res->ai_next) {
char hostname[] = "";
error = getnameinfo(res->ai_addr, res->ai_addrlen, hostname, , NULL, , );
if(error != ) {
NSLog(@"error in getnameifno: %s", gai_strerror(error));
continue;
}
else {
switch (res->ai_addr->sa_family) {
case AF_INET:
memcpy(ipv4, hostname, );
break;
case AF_INET6:
memcpy(ipv6, hostname, );
IS_IPV6 = TRUE;
default:
break;
}
NSLog(@"hostname: %s ", hostname);
}
}
freeaddrinfo(result);
if(IS_IPV6 == TRUE) return [NSString stringWithUTF8String:ipv6];
return [NSString stringWithUTF8String:ipv4];
}

3.socket

ipv6里面,对socket的创建及连接都需要有相关的修改。

感谢这位仁兄提供的解决方法。

http://blog.csdn.net/hepeng597/article/details/7803277

照着上面这个链接的对比方法,对socket进行修改即可。

这里有个小技巧,如果有需要对连接地址进行网络判断的话,可以判断ip地址里是否有冒号 ":"

c语言里可以用这个判断 strchr(server, ':') != NULL

cocos2dx解决苹果正版ipv6的问题的更多相关文章

  1. 解决苹果mac远程桌面无VDI客户端

    解决苹果mac远程桌面云aDesk无VDI客户端 因集团办公工作需要使用桌面云aDesk 在深信服官网并未有mac 的VDI Client客户端 mac电脑可通过Google浏览器访问VDI的服务器地 ...

  2. 配置阿里云ECS支持IPv6,解决苹果app审核失败问题

    前几天iOS的App提交给苹果审核没通过,给出的原因是:该应用在 IPv6 的环境下无法使用.检查发现:阿里云优化过的系统没有启用IPv6协议,需要配置启用一下,但是只单独启用IPv6也是无法直接提供 ...

  3. 苹果审核ipv6海外解决思路-About APP Store

    原始简书文章地址(也是我自己的) 首先声明,一我不负责涉及你们内部服务器. 二是好好读文章,别人能过,你们也能过 苹果6月1日出的IPV6协议阻碍了国内大多数积极开发者,我司也不外乎,经过三次被拒后, ...

  4. 用尽洪荒之力解决Apple Store ipv6审核通关---linux服务器支持ipv6

         强势的库克时代到来,苹果开启了强制IPV6审核,大家也知道中国现在的情况,除了教育网实验性的支持IPV6,ISP运营商还不支持,想必大家都陆陆续续的遭受到了苹果无情的拒绝,以前开个加急,审核 ...

  5. js解决苹果移动端300ms延迟的问题

    做移动端页面开发的可能会了解到,ios系统click事件会有卡顿的现象,这个问题的根源是苹果本身自带的safari有双击放大页面的功能,再次双击会返回到原始尺寸,所以在第一次点击的系统会延迟300ms ...

  6. 解决苹果电脑(mac)管理员账户变成了普通用户后不能解锁用户与群组的问题

    亲们,我先说说前因,然后再说一下解决方法. 前因 今天不知怎么就想把苹果电脑原来的名字给改一下,于是就做了下面的操作(你们不要这样做) 1.系统偏好设置→用户与组群→当前管理员用户→(右键)高级选项 ...

  7. 完美解决苹果电脑mac终端无法输入大写T的问题

    [本文出自天外归云的博客园] 最近突然发现我的苹果电脑mac终端无法输入大写字母T,今天终于在同事的帮助下解决了!之前在网上查解决方法,感觉步骤描述欠佳!今天记录一下这个踩坑经验: 完美解决! 首先打 ...

  8. cocos2d-x解决中文乱码问题的几种办法

    昨天改写cocos2d-x的例程,想在其基础上加上一个计分系统.没有分数实在让人没有玩下去的动力! 我在主场景上加上了一个CCLabelTTF,用于显示分数. 但是意外的发现,当内容含有中文时,CCL ...

  9. [Cocos2d-x]解决Android平台ndk-build时不自动删除外部库

    参考链接: http://blog.chinaunix.net/uid-26009923-id-3430612.html http://hi.baidu.com/hpyfei/item/52a2b21 ...

随机推荐

  1. TP框架常用配置

    <?php// +----------------------------------------------------------------------// | ThinkPHP [ WE ...

  2. Redis不同类型方法整合

    1     对value操作的命令 exists(key):确认一个key是否存在 del(key):删除一个key type(key):返回值的类型 keys(pattern):返回满足给定patt ...

  3. <<小朋友的数字>>核心代码

    for(i=l;i<=n;i++) { a[i]=read(); t=t+a[i]; if (t>maxn) maxn=t if( t<0) t=0; b[i]=maxn; }

  4. webservice通信调用天气预报接口实例

    转载:http://www.cnblogs.com/warrior4236/p/5668449.html 一:环境搭建 1:新建一个java project工程weatherInf 2:引入相应的ja ...

  5. UWP消息通知

    在Windows 10通常是使用Toast通知方式进行的消息通知,但是在应用通知是不需要通知带有音效的,但是又不能在系统通知中心留下记录,那么需要监听ToastNotification实例的Dismi ...

  6. 关于在linux中使用图形界面的网络管理工具

    有好几种自动设置的工具可以选择(既然说是自动设置的工具,那就说明有手动设置的工具,例如 使用 ip, iw, iwconfig 这些命令设置网络),例如:Connman, netctl, Networ ...

  7. Monkey的ADB命令简单使用示例和解析

    进行简单的压力测试: 1. adb shell monkey –p 包名 –v-v 3000 >E:\bugLog.txt -v -v 标识打印的日志的详细级别为2级,更高级有3级,也可以用1级 ...

  8. Saltstack

    一.Satlstack的概述 Saltstack是什么? Salt是一种和以往不同的基础设施管理方法,它是建立在大规模系统高速通讯能力可以大幅提升的想法上.这种方法使得Salt成为一个强大的能够解决基 ...

  9. 简明外贸报价单(Price List)范本

    简明外贸报价单(Price List)范本 简明外贸报价单(Price List)范本 报价单 Price List 报价日期:年 月   日 Supplier Address 供应商 公司地址 Co ...

  10. angularJS之$watch的一个小介绍

    现在最近公司项目使用angularJS进行开发:以前也接触过但是不多,趁着现在熟悉回来. 如题,angular中$watch也是我们在开发的时候需要的各种监听: $watch接收3个参数,第一个是对象 ...