描述
不确定这是个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
截图和视频
- 无响应*
3条答案
按热度按时间holgip5t1#
你好,@birdofpreyru,感谢你提出这个问题。
我认为这是一个bug/未记录的行为。我的假设是,当你将应用程序放入后台时,组件树会被卸载,因此命令不会被发送,而是存储在某种队列中。一旦应用程序回到前台,组件会被重新挂载,队列被清空并执行命令。
如果是这种情况,那么使用这个 template 创建一个简单的复现器应该很容易,你可以在其中添加
react-native-webview
作为依赖项。这将有助于我们调查是否确实是这种情况。我还没有一个干净且快速的解决方案来解决这个问题,可能需要我们进行一些架构讨论,但这肯定是我们想要理解并弄清楚的事情!
bf1o4zei2#
当然,@cipolleschi ,这里是您要找的:
在执行
yarn
之后,您可能希望在Android Studio中打开其Android项目,定位react-native-webview/kotlin+java/com.reactnativecommunity.webview/RNCWebViewManagerImpl.kt
,并在第314行设置断点(它显示为"stopLoading" -> webView.stopLoading()
)。然后从Android Studio以调试模式运行应用程序(并使用开发服务器运行):
(NOBRIDGE) LOG Entering background!
,原生代码中的断点没有被触发。stopLoading()
的断点被触发了。mlmc2os53#
感谢反馈,我们会在0.75.0-rc1发布完成后立即调查这个问题。