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;
}
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐