今天的1.0beta6用了以后,很不开心

  1. 项目是beta6之前的版本创建的,每次编native的时候构建一下,重新编译就行了。但是beta6构建出来的工程在ios下却无法再正常运行,提示说"找不到cc.VideoPlayer"。换个新路径构建以后是可以运行的,这说明beta6和之前的native工程不再兼容,意味着必须重新再设置一遍本地工程:拖一遍各种framework,gamecenter,iap,info.plist,各种本地化设置都得再来一遍。一想到这次捣鼓过去以后,以后再更新可能还会出现这种情况就觉得十分烦躁,不知道官方有没有好的办法来解决这一点。
  2. beta6的"jsb.reflection.callStaticMethod"在ios和mac编译后均无法使用,而同样的代码在beta5的时候已经在native下全部通过,项目昨天刚打包上传appstore,结果更新beta6后出现这个问题,哎,再次烦躁。暂时还没排查原因。
  3. beta5之前的版本一直运行得好好的状态机莫名其妙坏了,同一状态会反复进入很多次,天呐!什么鬼?

弄了一天也没弄好beta6,beta5安装包我又删了找不到了,浑身烦躁,今天不弄了!

很抱歉,beta6 引入了一些新的 bug,我们会尽快修复第一个问题。第二个问题,应该是由于你的 Native 类没有放在新的 native 环境中造成的,这个需求,我们后面会通过支持定制 native 引擎来满足

很抱歉内测版还不够稳定,升级前请备份好旧版本…… 话说我们最近处理问题的速度好像提高了,再给我们一点时间,1.1 会让你幸福的。

1赞

:joy:嘴上说不弄,身体还是很诚实的,遛个狗回来又开机了。。。

熊猫大大,

  1. 对于第一点的native环境,不知道你们会用怎样的修复方案?你一说“修复”,我就不知道现在应该是在beta5的基础上维持不动就行了,还是说我先移到beta6,以后你们是在beta6的基础上再修复?我们现在正在编译mac版本的,所以这个问题还比较关心,因为现在beta5和6的native工程不一样。

  2. 我在native环境里面的AppController.mm文件中是有调用那个静态类的,理论上来说,如果native的类没有放到新的环境中,那我编译应该会报错才对,但是我已经成功运行起来了,点了游戏里相应按钮没有输出。不过,这个问题等你回答了我第一个问题以后,我再弄一遍确认一下再来反馈,当时beta5/beta6/mac/ios版本来回切换搞得很混乱。

  3. 第三个问题找到原因了,我在scene的父类和子类里面分别on了CustomEvent,导致同一事件会重复收到两遍,这在beta6以前的版本是正常运行的。看样子beta6以前CustomEvent只能注册一次,beta6可以注册多次。当然,我倒是不存在注册多次这种需求,我是忘了在子类里面删除on的代码,是我代码的问题。我也不知道哪个版本的注册机制才算是对的,所以这个现象还是需要反馈给你们。

:sob:J大,beta5还有吗,求个mac版本…

  1. beta5 的下载链接还在,明天让 @nantas 给你回一个,你可以先用 beta5,然后直接升级到 beta7
  2. 你的 AppController.mm 应该也被新版本引擎给覆盖了,检查一下
  3. 多次 on 的时候如果回调函数或者 target 不同,正确行为的确是多次注册,会多次回调

http://7xougr.dl1.z0.glb.clouddn.com/1.1.0-beta.5/CocosCreator_v1.1.0-beta.5_2016051901.dmg

  1. 好的,谢谢Panda大大、南大。
    不过Panda大大你确定beta7的ios工程是在beta5的基础上来修复吗?我看到beta5放在Classes里面的CCScale9Sprite在beta6放到了cocos2d_libs.xcodeproj里面,其他的改动也还有。 :joy:我现在beta6的ios移得差不多了,beta5的工程被玩坏了,你要是确定可以从beta5升级过来,我就重新再拿beta5弄一遍,要是暂时还不太确定需要再讨论讨论,我就再等等。
  2. 唔,因为工程不兼容,所以换了个地方构建,AppController确实是新的。把AppController拷过去以后,再把静态类删了重新引用,然后七弄八弄的beta6的js->oc正常了。

不过就是oc->js在beta6里面会报这个错:


之前的版本是没有报这个错的,我需要把参数补全吗?还是说这个函数维持原状,beta7恢复?

我们不能保证构建出的工程不会修改啊,这样的话很多原生功能就没办法添加了

对于有较多定制的原生工程,我建议你从现在开始就用脚本实现所有修改,然后把脚本包装成creator插件,每次构建完成后会发送 editor:build-finished 消息出来,在自己的插件里接收后执行工程定制逻辑,该替换的文件替换,该添加的设置添加

虽然对产生的麻烦很抱歉,但我认为正确的流程就应该是这样的

ScriptingCore::getInstance()->evalString(str.c_str(), nullptr); 就可以了

从来没有弄过这方面的东西,完全没有概念,感觉挺麻烦的,等空闲一点了研究一下试试。

我正在弄mac的iap,发现oc->js会出问题。

  1. js->oc以后立即oc->js是ok的。
  2. 反复试了很多遍,只要出现系统对话框(疑似,因为除了这个区别以外,再想不到任何区别,两种方式调用evalString之前打印出来的log都是一样的)以后再oc->js就会出现‘too much recursion’,然后就没有下文了。

出现系统对话框(疑似):

再调用oc->js的evalString方法就会报错

调试发现是在JS_EvaluateScript出不来了


bool ScriptingCore::evalString(const char *string, jsval *outVal, const char *filename, JSContext* cx, JSObject* global)
{
    if (cx == NULL)
        cx = _cx;
    if (global == NULL)
        global = _global.ref().get();

    JSAutoCompartment ac(cx, global);
    JS::RootedObject jsglobal(cx, global);
    return JS_EvaluateScript(cx, jsglobal, string, (unsigned)strlen(string), "ScriptingCore::evalString", 1);
}

怎么破啊? @panda

Too much recursion 应该是递归出不来了。

刚刚手抖了一下,问题还没描述全就发出来了,我重新编辑了一下,panda大大来看看

把你的逻辑代码发出来看看吧


//iAP支付成功以后会调用这个方法,我就是在这里回调js的,支付成功以后会传入商品名字
+ (void) onPayCallback:( std::string & )name
{
    //这里会打印:
    //oc->onPayCallback : Beans
    NSLog(@"oc->onPayCallback : %s",name.c_str());
    std::string pre = "PlatformHelper.onPayCallback(" ;
    std::string end = ",null);" ;
    std::string str = pre + "'" + name.c_str() + "'" + end;
    
    //这里会打印:
    //oc->evalString : PlatformHelper.onPayCallback('Beans',null);
    NSLog(@"oc->evalString : %s",str.c_str());

    //程序能执行完上一句的log,然后到这里就出不来了
    ScriptingCore::getInstance()->evalString( str.c_str() , nullptr );
}

有几个情况:
1.在js->oc的时候会调用pay(name),如果我在pay(name)里面直接onPayCallback(“Beans”)是能正确执行的,逻辑应该没问题。
2.刚刚在ios下跑了,同样的代码,ios是能正确执行的,唯一的不同是ios会先执行回调,然后再同时弹出购买成功的系统对话框,而mac的是弹出系统对话框以后,必须点确定才会调用回调,不知道跟这个有没有关系。

哎,弄了一天了,每次都会在evalString里面异常,什么办法都用了,实在没辙了,我截了几张堆栈图,能看出什么端倪吗大大?最后关头卡在这真是急死了,求江湖救急!

报错:

原生层的逻辑看起来没问题,PlatformHelper.onPayCallback 本身的逻辑呢?

就是因为PlatformHelper.onPayCallback十分确定没有问题才让我找不到一点头绪。而且我换了PlatformHelper里面其他的接口,只要是mac iap成功后出来的都不行,直接调用的都可以。但是无论是直接调还是iap回调,执行的evalString的语句都一模一样。我有怀疑是mac iap的问题,但是就算iap有问题,但问题又是在执行的evalString的时候出现的。所以实在想不通哪有问题。

上着网,用着Unity,看着大家填坑! 等待坑被填满那天起,我再走过去!