Cocos Creator与ios交互通信(object | 您所在的位置:网站首页 › js和ios交互 › Cocos Creator与ios交互通信(object |
Cocos Creator与xcode交互
首先,从Cocos Creator打出xcode工程 iOS 平台上使用 Javascript 直接调用 Objective-C 方法cocos creator 官方文档: https://docs.cocos.com/creator/manual/zh/advanced-topics/oc-reflection.html 使用 Creator 打包的 iOS / Mac 原生应用中,我们也提供了在 iOS 和 Mac 上 JavaScript 通过原生语言的反射机制直接调用 Objective-C 函数的方法,示例代码如下: var result = jsb.reflection.callStaticMethod(className, methodName, arg1, arg2, .....);在 jsb.reflection.callStaticMethod 方法中,我们通过传入 OC 的类名,方法名,参数就可以直接调用 OC 的静态方法,并且可以获得 OC 方法的返回值。注意仅仅支持调用可访问类的静态方法。 类参数中的类名,只需要传入 OC 中的类名即可,与 Java 不同,类名并不需要路径。比如你在工程底下新建一个类 NativeOcClass,只要你将他引入工程,那么他的类名就是 NativeOcClass,你并不需要传入它的路径。 +(BOOL)callNativeUIWithTitle:(NSString *)title andContent:(NSString *)content; 方法 1.JS 到 OC 的反射仅支持 OC 中类的静态方法。2.方法名比较需要注意。我们需要传入完整的方法名,特别是当某个方法带有参数的时候,需要将它的 : 也带上。根据下面的例子,此时的方法名是 callNativeUIWithTitle:andContent:,不要漏掉了中间的 :。3.如果是没有参数的函数,那么就不需要 :。如下面代码中的方法名是 callNativeWithReturnString,由于没有参数,就不需要 :,跟 OC 的 method 写法一致。 +(NSString *)callNativeWithReturnString; 示例jsb.reflection.callStaticMethod(“类名”,“方法名”,“参数1”,“参数2”,…) var ret = jsb.reflection.callStaticMethod("NativeOcClass", "callNativeUIWithTitle:andContent:", "cocos2d-js", "Yes! you call a Native UI from Reflection"); Objective-C 执行 JS 代码 官方文档反过来,我们也可以通过 evalString 在 C++ / Objective-C 中执行 JavaScript 代码 Application::getInstance()->getScheduler()->performFunctionInCocosThread([=](){ se::ScriptEngine::getInstance()->evalString(script.c_str()); });这里需要注意:除非明确当前线程是 主线程,否则都需要将函数分发到主线程执行。 详细这里官方给出的文档很简短,不是很详细,对于新手很容易看懵 解释核心代码是这句,这句话的意思是通过evalString来执行一段js/ts的代码,script.c_str()就是需要执行的需要执行的代码。 其中"转义为" se::ScriptEngine::getInstance()->evalString(script.c_str()); 示例 std::string param001 = [cmdStr UTF8String]; //可以理解为:调用 cc.find() 函数在场景中查找 Canvas 节点,在利用 getComponent() 函数获取该节点下 名为 game.ts 的脚本。最后调用 脚本中的成员函数 GetAward(),此函数有一个参数。 std::string jsCallStr = cocos2d::StringUtils::format("cc.find('Canvas').getComponent('game').GetAward(\"%s\");", param001.c_str()); //通过evalString执行上面的代码 se::ScriptEngine::getInstance()->evalString(jsCallStr.c_str()); 注意这里工程是cocos creator打出来的xcode工程 se 报错需要引入 #import "cocos/scripting/js-bindings/jswrapper/SeApi.h"std 报错引入 cocos creator 3.1以下可以使用 #import "cocos2d.h"还有个需要注意点的object-c调用js的文件以.mm为后缀 在xcode里面.h是头文件,.m是支持Object-c语法的文件,.mm是既支持object-c语法也支持c++语法的文件 如果一直报无法找到头文件的错,可以试下找到xcode工程的build settings下的search paths下User Header Search Paths 添加一句 ${SRCROOT} Objective-C单例 //单例 + (GDTAppDelegate *)shareInstance { static dispatch_once_t onceToken; static GDTAppDelegate *_instance = nil; dispatch_once(&onceToken, ^{ if(_instance == nil) { _instance = [[GDTAppDelegate alloc] init]; } }); return _instance; } |
CopyRight 2018-2019 实验室设备网 版权所有 |