【问题标题】:React Native - Sending events from Native to JavaScript in AppDelegate (iOS)React Native - 在 AppDelegate (iOS) 中将事件从 Native 发送到 JavaScript
【发布时间】:2016-05-13 13:14:20
【问题描述】:

在我的 React 本机应用程序中,我试图将事件从本机代码发送到 AppDelegate 中的 JavaScript。为此,我调用:

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

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

导入“RCTBridge.h”

导入“RCTEventDispatcher.h”

并合成桥梁

@synthesize bridge = _bridge;

但在此之后,bridge 变量不存在。为了消除这个错误,我让我的 AppDelegate 符合 RCTBridgeModule 协议,如下所示:

AppDelegate : UIResponder <UIApplicationDelegate, RCTBridgeModule>

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

RCT_EXPORT_MODULE()

毕竟我的桥最终没有报错,但每次我在 AppDelegate 中使用它时,它都是 nil。

我哪里错了?

提前致谢。

【问题讨论】:

    标签: javascript ios react-native


    【解决方案1】:

    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) 从技术角度来看是理想的,因为它可以防止您在网桥正确初始化之前意外发送事件(这可能会崩溃或出现意外行为)。

    【讨论】:

    • 感谢您的详细回复!这回答了我的问题!
    • 你有一些适合初学者的示例代码吗?我正在尝试发送一个事件以从 -(void)applicationWillEnterForeground:(UIApplication*)application {-(void)applicationDidEnterBackground:(UIApplication*)application { 做出本机反应
    • @pomo 对于选项 3。看看 react-native AppState implementation github.com/facebook/react-native/blob/master/React/Modules/…
    【解决方案2】:

    您也可以使用 NSNotificationCenter。

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

    didReceiveRemoteNotification:
    

    发布 NSNotification。在 RCTEventEmitter 的子类中按名称观察此 NSNotification。然后调用

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

    在相应的选择器中。

    见:Send and receive messages through NSNotificationCenter in Objective-C?

    【讨论】:

      猜你喜欢
      • 2019-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-13
      • 1970-01-01
      • 2016-07-01
      • 1970-01-01
      相关资源
      最近更新 更多