React Native – 在AppDelegate(iOS)中将事件从Native发送到JavaScript

在我的React本机应用程序中,我正在尝试将本地代码中的事件发送到AppDelegate中的 JavaScript.为此,我打电话给:
[self.bridge.eventdispatcher sendAppEventWithName:@"EventReminder"
                                           body:@{@"name": eventName}];

在我的应用代表中.当然要做到这一点我需要导入:

导入“RCTBridge.h”

导入“RCTEventdispatcher.h”

并合成桥梁

@synthesize bridge = _bridge;

但是在此之后的事件中,桥变量不存在.为了使这个错误消失,我使我的AppDelegate符合RCTBridgeModule协议,如下所示:

AppDelegate : UIResponder <UIApplicationDelegate,RCTBridgeModule>

然后在我的AppDelegate.m中,我做了:

RCT_EXPORT_MODULE()

毕竟我的桥终于没有错误,但每次我在AppDelegate中使用它,它都是零.

我哪里错了?

提前致谢.

RCTBridge在启动时创建每个模块类的新实例,因此当您将AppDelegate导出为桥接模块时,您告诉桥接器创建新的AppDelegate,并为其提供桥接实例.

iOS还会在应用程序启动时创建AppDelegate实例,但iOS创建的实例与RCTBridge创建的实例不同.

所以基本上,你有两个AppDelegate实例:你试图访问self.bridge的那个实例,它不是由RCTBridge创建的,所以没有对它的引用,而是由RCTBridge创建的实例,它有一个桥,但不是您的UIApplication的委托,并且没有运行您的代码.

你有几个选择:

1)当您使用RCTBridgeDelegate的extraModules方法创建AppDelegate实例时,可以将其传递到桥中.这允许您告诉桥使用模块的现有实例,而不是创建新模块.

2)您可以通过RCTRootView访问网桥,而不是将AppDelegate变为模块,以便为其提供self.bridge属性.

3)将需要与桥接通信的逻辑从AppDelegate移出到新模块中.如果需要由AppDelegate中的事件触发,请使用NSNotifications与模块实例进行通信(我们将此模式用于RCTPushnotificationmanager).

在这些选项中,

选项1)可能是最复杂的正确做法.

选项2)可能是最容易做到的,因为你可能已经在AppDelegate中有一个RCTRootView实例,你可以参考.

选项3)从技术角度来看是理想的,因为它可以防止您在桥接器正确初始化之前意外发送事件(可能会崩溃或出现意外行为).

相关文章

一、前言 在组件方面react和Vue一样的,核心思想玩的就是组件...
前言: 前段时间学习完react后,刚好就接到公司一个react项目...
前言: 最近收到组长通知我们项目组后面新开的项目准备统一技...
react 中的高阶组件主要是对于 hooks 之前的类组件来说的,如...
我们上一节了解了组件的更新机制,但是只是停留在表层上,例...
我们上一节了解了 react 的虚拟 dom 的格式,如何把虚拟 dom...