【3.5.2】Objective-C 触发 JavaScript 的回调:sendToScript 报错

和这个基本一样,不过他的方法我这里并不是。

官方的cocs-example-demo 工程也看过了,使用OnScriptEventListener包了一个 block,真的只能传常量,传变量也走不通。

老哥你咋解决?

我现在是这么干的

@interface WeChatModule ()

// 要持有一个引用
@property (nonatomic, copy) OnScriptEventListener sendAuthRequestListener;

@end

// 下面找个合适的地方初始化

 __weak typeof(self) weakSelf = self;
    
    self.sendAuthRequestListener = ^(NSString *arg) {
        __strong typeof(weakSelf) strongSelf = weakSelf;
        [strongSelf sendAuthRequest:arg];
    };
    [[JsbBridgeWrapper sharedInstance] addScriptEventListener:[WeChatEvents WECHAT_SEND_AUTH_REQUEST] listener:self.sendAuthRequestListener];

没解决,你这个方法我试过,不行

我现在想进游戏直接发,不走 block,也不行。

[m dispatchEventToScript:@“actionAppleLoginInfo” arg:callbackStr];

压根也发不了。直接报错。

你是发事件给js的话 你先确保一下js已经初始化完了?

那肯定,也就是一个回调而已:

jsb.bridge.onNative = (methodName: string, arg1?: string | null) => {
console.log(TAG, "onNative methodName: " + methodName + " is: " +arg1);
};

如果你js的监听事件已经注册完了 iOS再派发事件还报错的话 我也不清楚了

嗯 我打算放弃了,还是用老方法

郁闷了,老方法也是报错,另外几个 reflection 方式倒是正常的,唯独这里直接调就不行。

看不懂这个报错是什么意思:

这个报错就是访问了不存在的内存地址 一般是对象提前释放了导致的 正常来说类给他一个引用就不会提前释放的。。

貌似找到原因了:可能是我那个代码需要在主线程中执行,但我不知道怎么在 oc / oc++ 中把那个调 JS 的代码改到主线程中,你知道代码怎么修改吗?

我继续搜索一下

 dispatch_async(dispatch_get_main_queue(), ^{
    
  });
1赞

官方文档里找到类似的描述:

image

但那个 Application 类压根就找不到。估计这个文档也好久没更新了。

嗯,我先试试

太感谢了兄弟,没错,终于解决了!!!

线程安全

注意,如果相关代码涉及到原生 UI 的部分,就需要考虑线程安全问题,详情请参考:线程安全
CC_CURRENT_ENGINE()->getScheduler()->performFunctionInCocosThread(={
//TO DO
JsbBridge* m = [JsbBridge sharedInstance];
[m sendToScript:cmd arg1:message];
});