iOS 上的 DeviceEventEmitter

Posted

技术标签:

【中文标题】iOS 上的 DeviceEventEmitter【英文标题】:DeviceEventEmitter on iOS 【发布时间】:2019-03-29 08:02:37 【问题描述】:

我正在开发一个 react-native 应用程序。我正在尝试从本机代码向我的反应本机代码发出事件。这适用于 android,但适用于 ios

我正在成功监听从我的原生 Android 代码发送的事件。然而,在 iOS 上运行时,我的 react 本机应用程序并没有“拾取”相同的事件,并试图找出原因。

我有连接到 MQTT 代理的代码。该代码是为 iOS 和 Android 原生编写的。在连接过程中,我将连接状态从我的本机代码发送到 react-native。这在 Android 上运行良好。使用 reactContext.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class).emit(eventName, eventString) 方法从我的 Android 代码发送的事件按预期到达我的反应本机代码。但是,在我的 iOS 代码中,正在发送使用 sendEvent() 方法传输的消息,但我没有在我的 react-native 代码中接收它们。我什至在我的 iOS 模拟器中收到黄色警告,指出“发送 Status 时没有注册监听器。发送事件的我的 Swift 类扩展了 RCTEventEmitter 类。

希望这是人们需要帮助的所有细节。我没有太多使用 DeviceEventEmitter 的经验,也没有太多使用 Swift 和 iOS 的经验。主要是一个Android人,所以这有点令人困惑。我猜它实际上超级简单,但我有点迷茫。

this.handleMqttStatusChange = this.handleMqttStatusChange.bind(this);
DeviceEventEmitter.addListener("Status", this.handleMqttStatusChange);

以下 Swift 代码发送事件。

self.sendEvent(withName: "Status", body: ["status":"Connecting"]);

发送事件的 Swift 类扩展了 RCTEventEmitter。

class AwsIotModule: RCTEventEmitter 

我的 Android Java 文件扩展了 ReactContextBaseJavaModule。

public class AwsIotModule extends ReactContextBaseJavaModule 

下面的java方法用于发送事件。

private void sendEvent(ReactContext reactContext,
                           String eventName,
                           @Nullable WritableMap params) 
        reactContext.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
                .emit(eventName, params);
    

【问题讨论】:

【参考方案1】:

好吧,我想通了。我在我的 react-native 代码中继续使用 NativeEventEmitter 而不是 DeviceEmitter。现在事件正在被 Android 和 iOS 上的 react-native 接收。

【讨论】:

您能否提供代码或示例来说明您如何解决此问题?

以上是关于iOS 上的 DeviceEventEmitter的主要内容,如果未能解决你的问题,请参考以下文章

DeviceEventEmitter 在屏幕锁定时停止向应用程序发送事件

ReactNative进阶(三十九):DeviceEventEmitter 实现发送和监听消息

react-native ios项目+内存泄漏

React Native跳转Android原生界面

ReactNative进阶(四十六):页面跳转及传参

在 iOS 上的 branch.io 上的两个应用程序中支持相同的自定义域