开发者问题收集

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

2021-07-10
1251

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

在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”

我已经尝试了几种解决方案和文章,但似乎都不起作用。

需要帮助!

3个回答

来自文档

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 类声明是否需要以“RCT”或“RK”为前缀。但因为这两个前缀似乎都是有效的,所以您应该能够只使用不带前缀的 AbcModule

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

@implementation RCTGetDetails
RCT_EXPORT_MODULE(GetDetails);
// or
// RCT_EXPORT_MODULE();
@end
Ol Sen
2021-07-10

好吧,如果有人遇到这个问题,并且觉得他们的代码应该可以工作,但实际上却不行,而且网上的任何解决方案对你来说都不起作用。

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

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

Manoj Yadav
2021-08-20

在您的 .m 文件中,假设 GetDetails 是 NSObject .swift 的一个类 您需要:

@interface RCT_EXTERN_MODULE(WidgetManager, NSObject)
// method to export
RCT_EXTERN_METHOD(isAuthenticated: (BOOL *)isAuthenticated)
@end

在您的 GetDetails.swift 中:

@objc(GetDetails)
class GetDetails: NSObject {

@objc(isAuthenticated:)
  func isAuthenticated(_ isAuthenticated: Bool) {
}
}
zdravko zdravkin
2023-01-26