求助,native.reflection.callStaticMethod ios 函数调用失败

  • Creator 版本: 3.6.2
  • 目标平台: IOS
  • 手机型号: iphone 15
  • 编辑器操作系统: mac mini m2

游戏倒没有闪退,但是调用无返回,控制台有报错信息,同样的函数调用在Android中正常执行并返回了,不知道哪里少配置了还是写错了,有知道的大神麻烦帮回答下,感谢!

控制台报错:

[ERROR]: [SE_ERROR] (/Users/qtz/Work/h5/engine/native/cocos/bindings/manual/JavaScriptObjCBridge.mm, 326): call (AppUtils.getVersionName) failed, result code: -2

TS代码:

 if (NATIVE && sys.os == sys.OS.IOS) {
       let versionName = native.reflection.callStaticMethod("AppUtils", "getVersionName", "");
      console.log(`app version: ${versionName}`)
 } else if (NATIVE && sys.os == sys.OS.ANDROID) {
       let versionName = native.reflection.callStaticMethod("com/cocos/lib/AppUtils", "getVersionName", "()Ljava/lang/String;");
       console.log(`app version: ${versionName}`)
 }

IOS 工程中确定已经在 compile souces 中包含这个类的编译
AppUtils.h:

#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN

@interface AppUtils : NSObject
+(NSString*) getVersionCode;
+(NSString*) getVersionName;
@end
NS_ASSUME_NONNULL_END

AppUtils.mm

#import "AppUtils.h"
@implementation AppUtils
+(NSString *) getVersionCode{
    NSLog(@"call getVersionCode");
    // 省略
    return @"1";
}

+(NSString*) getVersionName{
NSLog(@"call getVersionName");
    // 省略
    return @"1.0.0";
}
@end

显而易见
-2 : 参数个数传递不对

我这两个函数都是无参函数,但是 callStaticMethod 第一个参数是类名,第二个是函数名,按照 IOS 的函数定义来说,第三个参数应该不传才对,但是 callStaticMethod 第三个参数是 函数参数签名,必填项native.reflection.callStaticMethod(“AppUtils”, “getVersionName”) 这样写的话 ts 这边会报错的呢,咋办呢?我试过第三个参数传 null 也不行

把.d.ts里面第三个参数变成可选参数

1赞

真的可以。感谢大佬 :ox:

-3 是什么, 哪里看错误吗对照表

给报错信息吧,我忘了

20:52:38 [ERROR]: [SE_ERROR] (/Applications/Cocos/Creator/3.8.7/CocosCreator.app/Contents/Resources/resources/3d/engine/native/cocos/bindings/manual/JavaScriptObjCBridge.mm, 326): call (AppUtils.getVersionName) failed, result code: -3
20:52:38 [ERROR]: E/ [ERROR] Failed to invoke JavaScriptObjCBridge_callStaticMethod

源码
ts。
native.reflection.callStaticMethod(“AppUtils”, “getVersionName”, “”);

oc
.h
#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

@interface AppUtils : NSObject

+(NSString*) getVersionCode;

+(NSString*) getVersionName:(NSString *)message;

@end

NS_ASSUME_NONNULL_END

.mm
#import “AppUtils.h”
@implementation AppUtils
+(NSString *) getVersionCode{
NSLog(@“call getVersionCode”);
// 省略
return @“1”;
}

+(NSString*) getVersionName:(NSString *)message {
NSLog(@“call getVersionName”);
// 省略
return @“1.0.0”;
}
@end

TS报错不用管,直接用设备运行就行了。按照2.x的写法做就行,传惨也一样按照2.x的调用,iOS真机能直接运行。

@dream_chou93

。我拿抠门老板半个月了测试机还没弄来。 意思是真机能正常运行是吧

方法名的冒号很重要

改成

native.reflection.callStaticMethod(“AppUtils”, “getVersionName:”, “”);

如果有多个“冒号”(参数),就要加多个冒号

。。确实可以了。。。感谢您的回复。感谢! :nose:

可以的,我用的3.8.7没问题的。

第三个参数报错就报错呗,不用管,ios不需要签名