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

Posted

技术标签:

【中文标题】我的自定义本机模块不在 NativeModules 对象中【英文标题】:My custom native module is not present inside NativeModules object 【发布时间】:2021-07-10 15:03:43 【问题描述】:

所以,我想创建一个本机模块,它可以检测应用程序是在模拟器/模拟器还是实际设备上运行。

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 文档来实现 Native Modules。

但我一直面临这个错误,上面写着 “TypeError null 不是对象,正在评估 GetDetails.xyzFunctn”

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

需要帮助的人!

【问题讨论】:

【参考方案1】:

来自文档

如果您不指定名称,则 javascript 模块名称将与 Objective-C 类名称匹配,并删除所有“RCT”或“RK”前缀。

所以不要指定任何名称,

@implementation AbcModule

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

@end

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

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

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

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

【讨论】:

【参考方案2】:

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

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

VSCode 最终不会将 .h 文件添加到所需的资源文件夹中,我已经浪费了 2 周的时间来寻找解决方案,但最后,就是这样,是的,就是这样。

【讨论】:

以上是关于我的自定义本机模块不在 NativeModules 对象中的主要内容,如果未能解决你的问题,请参考以下文章

React-Native 的 Native 端能否向 React 请求信息? (桥接/本机模块)

调用本机模块会引发“无法识别的 objc 方法”错误

调用本机模块会引发“无法识别的 objc 方法”错误

反应本机图像 URI 未显示

在ios5的自定义相册中保存多个图像但不在相机胶卷中?

Springboot jpa:实体无法绑定不在表列中的自定义查询中的数据