我的自定义本机模块不在 NativeModules 对象中

My custom native module is not present inside NativeModules object

所以,我想创建一个本机模块来检测应用程序是否在 emulator/simulator 或实际设备上 运行。

在 android 上一切正常,但我在 iOS 上遇到问题。

我创建了一个 AbcModule.h 和一个 AbcModule.m 文件

#import <React/RCTBridgeModule.h>
@interface AbcModule : NSObject <RCTBridgeModule>
@end

这是AbcModule.h

#import "AbcModule.h"

@implementation AbcModule

RCT_EXPORT_MODULE(GetDetails);

- (BOOL) xyzFunctn {
    #if TARGET_IPHONE_SIMULATOR
        return YES;
    #else
        return NO;
    #endif
}

RCT_EXPORT_METHOD(xyzFunctn: (RCTPromiseResolveBlock)resolve rejecter: (RCTPromiseRejectBlock)reject) {
    resolve self.xyzFunctn;
}

@end

这是AbcModule.m

这里我已经按照 react native 文档实现了原生模块。

但我一直面临这个错误,它说 “TypeError null 不是一个对象,评估 GetDetails.xyzFunctn”

我浏览了多个解决方案和文章,但似乎没有任何效果。

需要帮助的人!

来自文档

If you do not specify a name, the JavaScript module name will match the Objective-C class name, with any "RCT" or "RK" prefixes removed.

所以不要指定任何名称,

@implementation AbcModule

// To export a module named AbcModule
RCT_EXPORT_MODULE();

@end

在你的情况下,它应该可以从 JS 中访问 AbcModule

但是文档并不清楚 Objective-C Class 声明是否需要用前缀“RCT”或“RK”来编写..但是因为这两个前缀似乎都有效,你应该可以只使用不带前缀的 AbcModule

换句话说,如果你想在 JS 中使用 GetDetails,你需要相应地命名你的接口和实现

@implementation RCTGetDetails
RCT_EXPORT_MODULE(GetDetails);
// or
// RCT_EXPORT_MODULE();
@end

好吧,如果有人遇到这个问题并且觉得他们的代码应该可以工作但事实并非如此,并且任何在线解决方案也不适合您。

试试这个: 当您为 header 和 objective-c 或 swift 文件创建 .h 和 .m 文件时,请确保您在 Xcode 而不是 VSCode 中创建。

VSCode 最终没有将您的 .h 文件添加到所需的资源文件夹中,我浪费了 2 周的时间试图找到解决方案,但最后,就是这样,是的,就是这样.