0

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

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

我已经阅读了几个解决方案和文章,但似乎没有任何工作在这里。

需要帮助的家伙!

4

2 回答 2

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不带前缀的。

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

@implementation RCTGetDetails
RCT_EXPORT_MODULE(GetDetails);
// or
// RCT_EXPORT_MODULE();
@end
于 2021-07-10T20:07:18.387 回答
0

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

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

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

于 2021-08-20T16:53:48.837 回答