NativeModules 对象中不存在我的自定义本机模块
因此,我想创建一个本机模块,它将检测应用程序是在模拟器/模拟器还是实际设备上运行。
在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 类声明是否需要以“RCT”或“RK”为前缀。但因为这两个前缀似乎都是有效的,所以您应该能够只使用不带前缀的
AbcModule
。
换句话说,如果您想在 JS 内部使用
GetDetails
,您需要相应地命名您的接口和实现
@implementation RCTGetDetails
RCT_EXPORT_MODULE(GetDetails);
// or
// RCT_EXPORT_MODULE();
@end
好吧,如果有人遇到这个问题,并且觉得他们的代码应该可以工作,但实际上却不行,而且网上的任何解决方案对你来说都不起作用。
试试这个: 当你为头文件和 objective-c 或 swift 文件创建 .h 和 .m 文件时,确保在 Xcode 中执行,而不是在 VSCode 中执行。
VSCode 最终不会在所需的资源文件夹中添加你的 .h 文件,我浪费了 2 周的时间试图找到解决方案,但最后,就是这样,是的,就是这样。
在您的 .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) {
}
}