You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

react-native-share的Share.open()在华为设备不返回promise成功/失败结果

华为设备react-native-share调用Share.open无返回值修复方案

问题根因

  • 华为定制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工具生成修改补丁,避免每次重新装包都要手动修改:

  1. 安装patch-package:npm install patch-package --save-dev
  2. 执行命令生成补丁:npx patch-package react-native-share
  3. 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 05:24:00