react-native [Android] NativeCommands交付的时间与TurboModule方法的调用以及AppState更改的时间

mrfwxfqh  于 22天前  发布在  React
关注(0)|答案(3)|浏览(21)

描述

不确定这是个bug,还是新架构的特性,但这是我的场景。我的应用使用RN 0.74.2,新架构无桥接。它有一个内部Web服务器(我的@dr.pogodin/react-native-static-server——一个TurboModule),还有一个WebView(我稍微改进过的react-native-webview的fork——一个Fabric组件),它从那个Web服务器加载资源。当应用进入后台时,我想通过RN WebView中止任何正在进行的加载,然后关闭服务器。为了实现这一点,我监听AppState的变化,当状态变为background时调用RN WebView的stopLoading()方法,以及我的服务器的stop()命令;两者都通过WebView情况中的Fabric的NativeCommand传递给原生层,而在服务器的情况下通过TurboModule方法调用。
现在我在Android上测试它,有很多调试日志和本地调试器。我看到以下情况:

  • 我将应用发送到后台。
  • WebView的stopLoading()和服务器的stop()都在JS层被调用。
  • 服务器的TurboModule stop()操作在原生层成功执行,甚至成功地发出了一个通知,告知服务器已停止(使用RCTDeviceEventEmitter),这样在JS层就会打印一条消息到控制台,告知服务器已成功停止。
  • 然而;WebViews的stopLoading()命令在原生层没有被触发——直到应用程序再次回到前台,立即在此之后,我通过调试器捕获到它已经被触发

在这里,尤其是考虑到TurboModule没有问题触发原生调用,并且在应用程序状态变为background后立即向JS传递回退事件,我认为这也应该适用于Fabric组件;然而,事实并非如此。你认为呢?这是个bug吗?还是当前新架构对组件的实现的限制?或者是RN WebView的代码使用了一种过时的方法来操作原生命令(尽管看起来它遵循了what is currently documented here)?

重现步骤

N/A

React Native版本

0.74.2

受影响的平台

运行时-Android

领域

其他(请指定)

npx react-native info的输出

N/A

堆栈跟踪或日志

N/A

可重现者

https://github.com/birdofpreyru/issue-45017

截图和视频

  • 无响应*
holgip5t

holgip5t1#

你好,@birdofpreyru,感谢你提出这个问题。
我认为这是一个bug/未记录的行为。我的假设是,当你将应用程序放入后台时,组件树会被卸载,因此命令不会被发送,而是存储在某种队列中。一旦应用程序回到前台,组件会被重新挂载,队列被清空并执行命令。
如果是这种情况,那么使用这个 template 创建一个简单的复现器应该很容易,你可以在其中添加 react-native-webview 作为依赖项。这将有助于我们调查是否确实是这种情况。
我还没有一个干净且快速的解决方案来解决这个问题,可能需要我们进行一些架构讨论,但这肯定是我们想要理解并弄清楚的事情!

bf1o4zei

bf1o4zei2#

当然,@cipolleschi ,这里是您要找的:
在执行 yarn 之后,您可能希望在Android Studio中打开其Android项目,定位 react-native-webview/kotlin+java/com.reactnativecommunity.webview/RNCWebViewManagerImpl.kt ,并在第314行设置断点(它显示为 "stopLoading" -> webView.stopLoading() )。
然后从Android Studio以调试模式运行应用程序(并使用开发服务器运行):

  • 它打开了,加载了RN网站。
  • 您按下模拟器(或设备)的主屏幕按钮。
  • 应用程序进入后台,dev server控制台打印出 (NOBRIDGE) LOG Entering background! ,原生代码中的断点没有被触发。
  • 现在您按模拟器中的应用程序图标将其带回前台 - 现在 stopLoading() 的断点被触发了。
mlmc2os5

mlmc2os53#

感谢反馈,我们会在0.75.0-rc1发布完成后立即调查这个问题。

相关问题