1

我试图理解其代码由 djinni 生成的iOS 本机模块。

根据 React Native doc,您必须RCT_EXPORT_MODULE()在代码中包含宏。这个工作样本没有。

后来在文档中说例外是 Swift,没有这样的宏。

除非我错了,否则情况并非如此。

我试图在我自己的项目中复制使用 djinni 生成的代码,但是当我运行它时,它失败了,因为 React Native 无法加载我的本机模块:

undefined 不是一个对象(评估 'HelloWorld.getHelloWorld')

我想知道是否可以单步执行 NativeModule 请求代码:

var HelloWorld = NativeModules.HelloWorld;

了解发生了什么。

谢谢你的帮助。

4

1 回答 1

0

好吧,谜团解开了。

秘密位于 AppDelegate 实现中:

  RCTBridge *bridge = [[RCTBridge alloc] initWithDelegate:moduleInitialiser launchOptions:nil];

  RCTRootView *rootView = [[RCTRootView alloc] initWithBridge:bridge
                                                   moduleName:@"ExampleProject"
                                            initialProperties:nil];

RCTRootView 指针通过调用初始化

initWithBridge

当然,您必须事先分配 RCTBridge 对象。

在该用例RCT_Export_Module中不需要宏,您只需提供模块名称:

+ (NSString *)moduleName
{
   return @"HelloWorld";
}

宏会自动为您执行此操作。

我还在使用:

initWithBundleURL

在我自己的项目中,从一个基本的 create-react-app 应用程序复制而来。

RCTRootView *rootView = [[RCTRootView alloc] initWithBundleURL:jsCodeLocation
                                                 moduleName:@"ExampleProject"
                                          initialProperties:nil
                                              launchOptions:launchOptions];

编辑 1:好的,我可能还有另一个问题。它不适用于 javascript 重新加载,因此仅在应用程序第一次运行时。当启用远程 JS 调试时,它也根本不起作用。奇怪的...

于 2018-05-02T13:11:31.707 回答