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

在我的React本地应用程序中,我试图从AppDelegate的本地代码发送到JavaScript。 为此,我打电话给:

[self.bridge.eventDispatcher sendAppEventWithName:@"EventReminder" body:@{@"name": eventName}]; 

在我的应用程序委托。 当然要做到这一点我需要导入:

导入“RCTBridge.h”

导入“RCTEventDispatcher.h”

并合成桥梁

 @synthesize bridge = _bridge; 

但事件之后,桥variables不存在。 为了使这个错误消失,我让我的AppDelegate符合RCTBridgeModule协议,如下所示:

 AppDelegate : UIResponder <UIApplicationDelegate, RCTBridgeModule> 

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

 RCT_EXPORT_MODULE() 

毕竟,我的桥梁终于不是错误,但每次我在AppDelegate中使用它,它是零。

我哪里错了?

提前致谢。

RCTBridge在启动时会创build每个模块类的新实例,所以当您将AppDelegate导出为桥模块时,您要告诉桥创build一个新的AppDelegate,并为其创build一个桥实例。

当应用程序启动时,iOS也会创buildAppDelegate实例,但iOS创build的实例与RCTBridge创build的不同。

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

你有几个select:

1)您可以通过使用RCTBridgeDelegate的extraModules方法创build它时,将您的AppDelegate实例传递到桥。 这可以让你告诉网桥使用现有的模块实例,而不是创build一个新的实例。

2)你可以通过你的RCTRootView访问这个桥,而不是把你的AppDelegate放到一个模块中,这样就可以得到一个self.bridge属性。

3)将需要与桥对话的逻辑从AppDelegate移出一个新的模块。 如果需要由AppDelegate中的事件触发,请使用NSNotifications与模块实例(我们使用RCTPushNotificationManager使用此模式)进行通信。

在这些选项中,

选项1)可能是要做的最复杂的事情。

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

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

或者,您可以使用NSNotificationCenter。

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

 didReceiveRemoteNotification: 

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

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

在相应的select器中。

请参阅: 通过Objective-C中的NSNotificationCenter发送和接收消息?