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

前端之家收集整理的这篇文章主要介绍了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相关文章