微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐