Cocos Creator:使用 JavaScript 调用 Objective-C 方法的更简单方法

推荐:将NSDT场景编辑器加入你的3D工具链
3D工具集:NSDT简石数字孪生

使用 JavaScript 调用 Objective-C 方法的更简单方法

注意:在 v3.6.0 之后,模块即将弃用,API 会移到命名空间的模块中。jsbnativecc

背景

在 v3.4.0 之前,使用 JavaScript 调用 Objective-C 静态方法中的反射机制,不仅需要严格声明包名和函数签名,还需要严格检查参数数量以保证正常运行,这是一个复杂的步骤。

此外,v3.4.0 中还提供了另一种实验性方法,用于简化从脚本层到本机层的调用。这是一种通道,或者说桥接,在引入其他脚本系统之前命名,意思是作为脚本和原生APP之间通过绑定进行通信的桥梁。JsbBridgeJSB

注意:两种方式都可以正常工作,开发人员可以根据自己的实际需求选择使用它们。要使用上述方式,请查看使用 JavaScript 调用 Objective-C 文档。

JavaScript 接口介绍

脚本级别仅有的两个接口是 和 ,它们分别是传输接收本机层参数。使用时需要注意以下几点:sendToNativeonNative

  • 此功能仍处于试验阶段,仅支持传输。要传输包含多个参数的对象,请考虑将它们转换为传输格式并在不同级别进行解析。stringJSON
  • onNative一次只记录一个函数,并在属性再次出现时重写原始方法。onNativeset
  • 该方法是单向通信,不关心较低级别的返回,也不判断操作是成功还是失败。开发人员需要处理操作本身。sendToScriptJavaScript
// JavaScript
export namespace bridge{
    /**
     * Send to native with at least one argument.
     */
    export function sendToNative(arg0: string, arg1?: string): void;
    /**
     * Save your own callback controller with a JavaScript function,
     * Use 'jsb.bridge.onNative = (arg0: String, arg1: String | null)=>{...}'
     * @param args : received from native
     */
    export function onNative(arg0: string, arg1?: string | null): void;
}

Objective-C 接口介绍

相应的接口也由两个接口主导,包括和:ObjCsendToScriptonScript

  • sendToScript对应于 并表示要传输到的参数。sendToNativeJavaScript
  • onScript对应于 ,表示收到脚本消息后的响应行为。通过创建调用 和 use 来包装行为以启用接口函数。onNativeICallbacksetCallback
//Objective-c
typedef void (^ICallback)(NSString*, NSString*);

@interface JsbBridge : NSObject

+(instancetype)sharedInstance;
-(bool)setCallback:(ICallback)cb;
-(bool)callByScript:(NSString*)arg0 arg1:(NSString*)arg1;
-(void)sendToScript:(NSString*)arg0 arg1:(NSString*)arg1;
-(void)sendToScript:(NSString*)arg0;

@end

基本用法

使用 JavaScript 触发 Objective-C 回调

假设广告界面设置在原生层,那么当玩家点击按钮打开广告时,触发打开广告是顺理成章的。ObjC

打开广告的界面的代码示例如下:

static ICallback cb = ^void (NSString* _arg0, MSString* _arg1){
    //open Ad
}

此时,请先注册打开广告的事件:

JsbBridge* m = [JsbBridge sharedInstance];
[m setCallback:cb];

在图层脚本中对按钮的单击事件执行打开操作:JavaScript

import { native } from 'cc'
public static onclick(){
    // 'usrName' and 'defaultAdUrl' are both string
    native.bridge.sendToNative(usrName, defaultAdUrl);
}

这将通过通道将所需信息发送到图层,以执行打开广告的操作。ObjCnative.Bridge

使用 Objective-C 触发 JavaScript 回调

假设动画播放操作是用 JavaScript 录制的。要在 Objective-C 层中播放此动画,请注册一个事件来播放动画。

首先,定义一个函数来播放动画:

public void playAnimation(animationName: string, isLoop: boolean){
    // Code to play Animation
}

接下来,在 中记录方法:onNative

native.bridge.onNative = (animationName: string, isLoop: String | null):void=>{
    if(isLoop && isLoop == "true") {
        this.playAnimation(animationName, true);
        return;
    }
    this.playAnimation(animationName, false);
    return;
}

代码示例如下:ObjC

JsbBridge* m = [JsbBridge sharedInstance];
[m sendToScript:@"Animation1" arg1:@"true"];

这将调用播放操作。JavaScript

3D建模学习工作室 翻译整理,转载请注明出处

上一篇:Cocos Creator:使用 JavaScript 调用 Java 方法的更简单方法 (mvrlink.com)

下一篇:Cocos Creator:基于JSB桥的事件机械主义 (mvrlink.com)

NSDT场景编辑器 | NSDT 数字孪生 | GLTF在线编辑器 | 3D模型在线转换 | UnrealSynth虚幻合成数据生成器 | 3D模型自动纹理化工具
2023 power by nsdt©鄂ICP备2023000829号