react-native-share的Share.open()在华为设备不返回promise成功/失败结果
问题根因
- 华为定制ROM对安卓系统分享行为的返回回调做了私有修改,react-native-share官方默认实现未适配该逻辑,导致分享完成后原生层没有主动触发JS层Promise的回调
- 即使设备同时搭载GMS和HMS,只要是华为鸿蒙系统/EMUI10及以上版本都会触发该兼容问题
可行修复方案
方案一:临时修改node_modules中原生层代码(适合快速验证)
找到路径 node_modules/react-native-share/android/src/main/java/cl/json/RNShare/ShareModule.java,修改onActivityResult方法的逻辑:
原有逻辑是仅当resultCode为Activity.RESULT_OK或者用户取消时才触发回调,华为设备分享完成后返回的resultCode可能为异常值,导致未进入回调分支
添加兜底判断,不管resultCode是什么只要分享流程走完就触发回调:
@Override public void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == SHARE_REQUEST_CODE) { // 新增华为设备兜底逻辑 String manufacturer = android.os.Build.MANUFACTURER; if ("HUAWEI".equalsIgnoreCase(manufacturer) || "HONOR".equalsIgnoreCase(manufacturer)) { if (resultCode == Activity.RESULT_CANCELED && data == null) { promise.reject("SHARE_CANCELED", "User canceled share"); } else { promise.resolve(resultCode == Activity.RESULT_OK ? "SUCCESS" : "UNKNOWN"); } sharedPromise = null; return; } // 原有官方逻辑保持不变 ... } }
修改完成后重新编译安卓项目即可生效。
方案二:使用patch-package固化修改(适合生产环境)
验证方案一可行后,使用patch-package工具生成修改补丁,避免每次重新装包都要手动修改:
- 安装patch-package:
npm install patch-package --save-dev - 执行命令生成补丁:
npx patch-package react-native-share - 在package.json的scripts中添加postinstall钩子,确保每次装包自动应用补丁:
"scripts": { "postinstall": "patch-package" }
方案三:升级适配版本
当前react-native-share官方在v9.4.0及以上版本已经合并了华为设备兼容补丁,直接升级库版本即可解决问题:npm install react-native-share@latest --save
临时规避方案
如果暂时无法修改原生代码,可以在JS层添加超时判断做兜底,避免业务逻辑卡死:
import Share from "react-native-share"; const shareWithTimeout = async (shareOptions, timeout = 30000) => { return Promise.race([ Share.open(shareOptions), new Promise((resolve) => { // 30s兜底,认为分享完成/用户已关闭弹窗 setTimeout(() => resolve("TIMEOUT_FALLBACK"), timeout) }) ]) } // 业务层调用替换原有Share.open const message = "Text to share"; shareWithTimeout({ message }) .then(res => { console.log(res) return true }) .catch(err => { console.log("Exception: ", err) return false })
内容的提问来源于stack exchange,提问作者virtualpathum
相关产品推荐
相关产品推荐

