如何在 React Native 中将事件从 iOS 发送到 javascript

Posted

技术标签:

【中文标题】如何在 React Native 中将事件从 iOS 发送到 javascript【英文标题】:How to send event from iOS to javascript in React Native 【发布时间】:2016-07-20 01:26:46 【问题描述】:

我正在 ios 应用程序中执行异步操作。它是由javascript触发的。完成后(在应用程序中的某个位置),我想让 javascript 知道。 我目前的解决方案是继承自RCTEventEmitter的原生模块,方法如下:

@interface MyEventEmitter : RCTEventEmitter
// ...
end
@implementation
- (void)giveSomethingToJS:(NSString *)something 
  [self sendEventWithName:@"SOME_NAME" body:something];

@end

然后,当我的异步工作完成后,我调用这个方法:

MyEventEmitter *emitter = [[MyEventEmitter alloc] init];
[emitter giveSomethingToJS:@];

很明显,emitter.bridge 为 nil,应用程序由于断言 bridge != nil 而崩溃。那么我应该如何获得桥梁并让*emitter(实例)知道。或者我怎样才能在初始化桥接的情况下获得正确的实例?

提前致谢!

【问题讨论】:

【参考方案1】:

问题在于,在 React-Native iOS SDK 中,RCTEventEmitter 子类不应由您初始化。 React-Native SDK 实际上处理你的 RCTEventEmitters 的初始化。

正如 Arthur 所指出的,使用NSNotificationCenter 与您的RCTEventEmitter 交流是一个很好的策略。如果您需要指向这些事件发射器的指针,您还可以创建一个自定义单例类并在初始化时向其注册 RCTEventEmitter。

【讨论】:

这是我为这个问题找到的最有帮助的答案,并清楚地解释了原因。可以在这里找到一个实现:gist.github.com/brennanMKE/1ebba84a0fd7c2e8b481e4f8a5349b99 非常感谢!【参考方案2】:

我有一个快速修复,不是一个很好的主意,但实现了我想要的。

问题是我无法获取MyEventEmitter 的实例,所以我改用原生代码中的通知中心来通知实例。

[[NSNotificationCenter defaultCenter] addObserverForName:@"NATIVE_WEIXIN_LOGIN_RESP_CODE"
                                                  object:nil
                                                  queue:nil
                                             usingBlock:^(NSNotification * _Nonnull notification) 
                                               SendAuthResp *resp = notification.object;
                                                 [self sendEventWithName:@"WEIXIN_LOGIN_RESP_CODE" body:resp.code];
                                               ];

你还能在 React Native 中发布我想要的正确方法吗?

【讨论】:

以上是关于如何在 React Native 中将事件从 iOS 发送到 javascript的主要内容,如果未能解决你的问题,请参考以下文章

如何在 React Native 中将矢量从类组件传递到另一个组件?

如何在 react-native 中将函数的结果从一个组件传递到另一个组件?

[React Native][IOS] 应用被通知打开时如何捕捉事件

如何在 React Native 中将 UInt16 或字节转换为心跳率

在 React-Native 中将 RCTRootView 作为子视图添加到 rootViewController

Crashlytics 不在 iOS 上发送事件