React Native - 在 AppDelegate (iOS) 中将事件从 Native 发送到 JavaScri

React Native - Sending events from Native to JavaScript in AppDelegate (iOS)

本文关键字:Native 事件 JavaScri AppDelegate React iOS      更新时间:2023-09-26

在我的 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()

毕竟,我的桥终于没有出错,但是每次我在应用程序代表中使用它时,它都是零。

我哪里出错了?

提前谢谢。

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( 是理想的选择,因为它可以防止您在网桥正确初始化之前意外发送事件(这可能会崩溃或行为异常(。

或者,您也可以使用 NSNotificationCenter。

例如,在 AppDelegate 中处理传入的推送通知

didReceiveRemoteNotification:

发布 NSNotization。在 RCTEventEmitter 的子类中按名称观察此 NSNotization。然后打电话

[self sendEventWithName:@"eventName" body:eventBody];

在相应的选择器中。

参见:在 Objective-C 中通过 NSNotificationCenter 发送和接收消息?