React Native WebView v11在Android端选择/上传文件时崩溃问题求助
这个是react-native-webview 11.x版本的已知原生层缺陷:安卓端文件选择逻辑中,接收系统相册/文件选择器返回结果时,持有的回调Promise实例未做非空校验,当Activity被系统临时回收重建后Promise实例丢失,调用resolve方法就会触发空指针崩溃。
以下是可行的修复方案:
方案1:升级react-native-webview版本
官方在v11.26.1及之后的11.x小版本中已经修复了该空指针问题,无需修改业务代码,直接升级依赖即可:
npm install react-native-webview@11.26.1 # 或使用yarn yarn add react-native-webview@11.26.1
方案2:无法升级版本时的原生层修复
在安卓项目的MainActivity.java中重写onActivityResult方法,捕获该异常避免崩溃:
@Override public void onActivityResult(int requestCode, int resultCode, Intent data) { try { super.onActivityResult(requestCode, resultCode, data); } catch (NullPointerException e) { // 捕获react-native-webview文件选择回调的空指针异常,避免崩溃 if (e.getMessage() != null && e.getMessage().contains("com.facebook.react.bridge.Promise.resolve")) { // 可自行补充业务侧的错误提示逻辑 } else { throw e; } } }
方案3:JS层临时规避
给现有WebView组件添加安卓端文件访问相关属性,部分场景下可降低崩溃概率:
<WebView style={styles.webView} containerStyle={resolvedWebViewStyles} ref={webviewRef} decelerationRate="normal" // Make scrolling feel native on iOS source={{uri: reConstructedUri}} onLoadEnd={handleLoadEnd} injectedJavaScript={INJECTED_JAVASCRIPT} onMessage={() => {}} javaScriptEnabled // 新增安卓端文件访问权限配置 allowFileAccess={true} allowFileAccessFromFileURLs={true} allowUniversalAccessFromFileURLs={true} />
如果以上方案都不满足需求,可直接拦截WebView的文件选择请求,通过RN端自研的文件选择能力完成上传后,将文件内容/路径通过postMessage回传给WebView,完全绕过原生WebView的自带文件选择逻辑。
内容的提问来源于stack exchange,提问作者Lulzim Fazlija
相关产品推荐
相关产品推荐

