{"_id":"@bingtang-rn/react-native-exceptions-manager","_rev":"2-50b58ea568f85c17b6450150a141fd27","name":"@bingtang-rn/react-native-exceptions-manager","dist-tags":{"latest":"0.2.1"},"versions":{"0.2.0":{"name":"@bingtang-rn/react-native-exceptions-manager","version":"0.2.0","keywords":["react-native","harmony","harmonyos","react-native-exceptions-manager"],"license":"MIT","_id":"@bingtang-rn/react-native-exceptions-manager@0.2.0","maintainers":[{"name":"luyizouyuan","email":"189605613@qq.com"}],"homepage":"https://gitcode.com/rn_ohos_plugin/react_native_exceptions_manager","dist":{"shasum":"74168aaeb314983575a0e4aaf3e80e35f92ec841","tarball":"https://registry.npmjs.org/@bingtang-rn/react-native-exceptions-manager/-/react-native-exceptions-manager-0.2.0.tgz","fileCount":31,"integrity":"sha512-JsxMiHkrsQ1OVrkPGimGdo6Vs7CfgmGfVlCEdNZqurhZG89LdTgjgb2k6hz3cHsNwwrXLa1gartYf2xhggTD1Q==","signatures":[{"sig":"MEUCIQD8sYUU99hyCZpynMbtEL2EM3JNPsGnTdnDYAY7kLNzXQIgYfsCJzWPSJwUSoa6XCHT0mXnmi9hCzqfvPgAJKYLmVY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":81249},"main":"./src/index.ts","module":"./src/index.ts","engines":{"node":">=18"},"gitHead":"f9cf9152dbceef555988755971a8e034aa6dd443","harmony":{"alias":"react-native-exceptions-manager","autolinking":{"ohPackageName":"@oh-rn/react-native-exceptions-manager","cppPackageClassName":"ExceptionsManagerPackage","etsPackageClassName":"ExceptionsManagerPackage","cmakeLibraryTargetName":"exceptions_manager"},"codegenConfig":[{"version":1,"specPaths":["./src/specs/v1"]}]},"private":false,"scripts":{"prepare":"echo skip","codegen-lib":"react-native codegen-harmony --cpp-output-path ./harmony/exceptions_manager/src/main/cpp/generated --ets-output-path ./harmony/exceptions_manager/src/main/ets/generated"},"_npmUser":{"name":"luyizouyuan","email":"189605613@qq.com"},"repository":{"url":"https://gitcode.com/rn_ohos_plugin/react_native_exceptions_manager","type":"git"},"_npmVersion":"11.12.1","description":"适配鸿蒙版本，提供react_native_exceptions_manager组件。","directories":{},"_nodeVersion":"24.15.0","react-native":"./src/index.ts","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.6.3","metro":"^0.81.0","react":"18.2.0","typescript":"5.0.4","@types/react":"18.2.79","react-native":"0.72.5","@react-native/typescript-config":"0.79.5","@react-native-oh/react-native-harmony-cli":"^0.77.50"},"peerDependencies":{"react-native":">=0.72"},"_npmOperationalInternal":{"tmp":"tmp/react-native-exceptions-manager_0.2.0_1785417852441_0.8149679923479871","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"_id":"@bingtang-rn/react-native-exceptions-manager@0.2.1","dist":{"shasum":"2b7125e44a3e1b312c183cd50bd87d2120b06849","tarball":"https://registry.npmjs.org/@bingtang-rn/react-native-exceptions-manager/-/react-native-exceptions-manager-0.2.1.tgz","fileCount":31,"integrity":"sha512-QHf9onpjQQcL5rJ138Z1PyjFLCzOhUxLsOdR6hpilikMMu6eBA+3hzP8uuB3kLBKmGUpwIHzZeJ3++N0WwDCmg==","signatures":[{"sig":"MEQCIE2A3lrwTWkSxUXtDm4QdzSiB0z2MCKnpvInmT0QDSDhAiATPsktcNzfpRJkIR6ACnbNqJXPlD7GlECzYFgOXwe9mA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIFWQzGzTZ2pxp4VB31Nbux3GqDsv1tVhnSouW+XadKTdAiACudlxIz0G/fb3IxXawPRBXMSNVOAdWmXpspNwCSXFEQ=="}],"unpackedSize":37190},"main":"./src/index.ts","name":"@bingtang-rn/react-native-exceptions-manager","_from":"file:bingtang-rn-react-native-exceptions-manager-0.2.1.tgz","module":"./src/index.ts","engines":{"node":">=18"},"harmony":{"alias":"react-native-exceptions-manager","autolinking":{"ohPackageName":"@bingtang-rn/react-native-exceptions-manager","cppPackageClassName":"ExceptionsManagerPackage","etsPackageClassName":"ExceptionsManagerPackage","cmakeLibraryTargetName":"exceptions_manager"},"codegenConfig":[{"version":1,"specPaths":["./src/specs/v1"]}]},"license":"MIT","private":false,"scripts":{"prepare":"echo skip","codegen-lib":"react-native codegen-harmony --cpp-output-path ./harmony/exceptions_manager/src/main/cpp/generated --ets-output-path ./harmony/exceptions_manager/src/main/ets/generated"},"version":"0.2.1","_npmUser":{"name":"luyizouyuan","email":"189605613@qq.com"},"homepage":"https://gitcode.com/rn_ohos_plugin/react_native_exceptions_manager","keywords":["react-native","harmony","harmonyos","react-native-exceptions-manager"],"_resolved":"D:\\code\\rn\\npm\\batch\\react_native_exceptions_manager\\bingtang-rn-react-native-exceptions-manager-0.2.1.tgz","_integrity":"sha512-QHf9onpjQQcL5rJ138Z1PyjFLCzOhUxLsOdR6hpilikMMu6eBA+3hzP8uuB3kLBKmGUpwIHzZeJ3++N0WwDCmg==","repository":{"url":"https://gitcode.com/rn_ohos_plugin/react_native_exceptions_manager","type":"git"},"_npmVersion":"11.12.1","description":"适配鸿蒙版本，提供react_native_exceptions_manager组件。","directories":{},"maintainers":[{"name":"luyizouyuan","email":"189605613@qq.com"}],"_nodeVersion":"24.15.0","react-native":"./src/index.ts","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.6.3","metro":"^0.81.0","react":"18.2.0","typescript":"5.0.4","@types/react":"18.2.79","react-native":"0.72.5","@react-native/typescript-config":"0.79.5","@react-native-oh/react-native-harmony-cli":"^0.77.50"},"peerDependencies":{"react-native":">=0.72"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/react-native-exceptions-manager_0.2.1_1790568946784_0.2670765968443918"}}},"time":{"created":"2026-07-30T13:24:11.724Z","modified":"2026-09-28T04:15:47.049Z","0.2.0":"2026-07-30T13:24:12.637Z","0.2.1":"2026-09-28T04:15:46.865Z"},"license":"MIT","homepage":"https://gitcode.com/rn_ohos_plugin/react_native_exceptions_manager","keywords":["react-native","harmony","harmonyos","react-native-exceptions-manager"],"repository":{"url":"https://gitcode.com/rn_ohos_plugin/react_native_exceptions_manager","type":"git"},"description":"适配鸿蒙版本，提供react_native_exceptions_manager组件。","maintainers":[{"name":"luyizouyuan","email":"189605613@qq.com"}],"readme":"# @bingtang-rn/react-native-exceptions-manager for HarmonyOS\r\n\r\n本项目基于 [react-native-exceptions-manager](ssh://git@github.com/Richard-Cao/react-native-exceptions-manager) 开发，为 React Native 鸿蒙（OpenHarmony）适配版本。如果在使用过程中有任何问题，可以在GitCode提Issue，会及时跟进。issue地址：[issues](https://gitcode.com/rn_ohos_plugin/react_native_exceptions_manager/issues)。\r\n\r\n## 版本对应关系\r\n\r\n| 鸿蒙适配包版本 | 原始库版本 | 支持 RN 版本 | Autolink | 编译 API 版本 |\r\n| ------------ | ---------- | ------------ | -------- | ------------- |\r\n| 见发布记录 | 0.2.0 | 0.72+ | 是 | API17+ |\r\n\r\n## 安装\r\n\r\n```bash\r\nnpm install @bingtang-rn/react-native-exceptions-manager\r\n```\r\n\r\n## 使用\r\n\r\n```tsx\r\nimport RKExceptionsManager from 'react-native-exceptions-manager';\r\n\r\n// 报告致命异常（JS 层捕获后发送到宿主应用）\r\nRKExceptionsManager.reportFatalException(\r\n  'Unhandled JS Error',\r\n  [\r\n    { methodName: 'render', file: 'index.bundle', lineNumber: 42, column: 15 },\r\n    { methodName: 'processChild', file: '123.js', lineNumber: 100 },\r\n  ],\r\n  1,\r\n);\r\n\r\n// 报告非致命异常（仅记录日志）\r\nRKExceptionsManager.reportSoftException(\r\n  'Soft Error',\r\n  [{ methodName: 'onPress', file: 'App.js', lineNumber: 30 }],\r\n  2,\r\n);\r\n```\r\n\r\n> import 时使用原库名 `'react-native-exceptions-manager'`，而非鸿蒙包名（RNOH alias 自动映射）。\r\n\r\n**平台差异**：\r\n- HarmonyOS 上 `reportFatalException` 通过 `commonEventManager.publish` 发布自定义公共事件（对应 Android 的 `sendBroadcast`），宿主应用需通过 `commonEventManager.subscribe` 订阅 action 为 `com.richardcao.android.REACT_NATIVE_CRASH_REPORT_ACTION` 的事件来接收异常信息。\r\n- `reportSoftException` 在 HarmonyOS 上通过 `hilog.error` 输出日志（对应 Android 的 `FLog.e`）。\r\n\r\n**权限要求**：\r\n- 发布自定义公共事件无需额外权限声明。\r\n\r\n## Link\r\n\r\n| 版本 | 是否支持 Autolink |\r\n|------|------------------|\r\n| 当前版本 | 是 |\r\n\r\n如使用版本支持 Autolink 且工程已接入，可跳过手动配置。\r\n\r\n<details>\r\n<summary>Manual Link 配置</summary>\r\n\r\n> **说明**：本模块需要同时在 C++ 侧和 ETS 侧注册 Package。\r\n\r\n### 1. Overrides RN SDK\r\n\r\n在工程根目录 `oh-package.json5` 添加：\r\n\r\n```json\r\n{\r\n  \"overrides\": {\r\n    \"@rnoh/react-native-openharmony\": \"./react_native_openharmony\"\r\n  }\r\n}\r\n```\r\n\r\n### 2. 引入原生端依赖\r\n\r\n打开 `entry/oh-package.json5`，添加：\r\n\r\n```json\r\n\"dependencies\": {\r\n  \"@bingtang-rn/react-native-exceptions-manager\": \"file:../../node_modules/@bingtang-rn/react-native-exceptions-manager/harmony/exceptions_manager.har\"\r\n}\r\n```\r\n\r\n执行 `ohpm install`。\r\n\r\n### 3. 配置 CMakeLists\r\n\r\n打开 `entry/src/main/cpp/CMakeLists.txt`，添加：\r\n\r\n```cmake\r\nset(OH_MODULES \"${CMAKE_CURRENT_SOURCE_DIR}/../../../oh_modules\")\r\n\r\nadd_subdirectory(\"${OH_MODULES}/@bingtang-rn/react-native-exceptions-manager/src/main/cpp\" ./exceptions_manager)\r\n\r\ntarget_link_libraries(rnoh_app PUBLIC exceptions_manager)\r\n```\r\n\r\n### 4. 注册 Package（C++ 侧）\r\n\r\n打开 `entry/src/main/cpp/PackageProvider.cpp`，添加：\r\n\r\n```cpp\r\n#include \"ExceptionsManagerPackage.h\"\r\n\r\nstd::vector<std::shared_ptr<Package>> PackageProvider::getPackages(Package::Context ctx) {\r\n    return {\r\n        std::make_shared<ExceptionsManagerPackage>(ctx),\r\n    };\r\n}\r\n```\r\n\r\n### 5. 注册 Package（ETS 侧）\r\n\r\n打开 `entry/src/main/ets/RNPackagesFactory.ets`，添加：\r\n\r\n```typescript\r\nimport { ExceptionsManagerPackage } from '@bingtang-rn/react-native-exceptions-manager/ts';\r\n\r\nexport function createRNPackages(ctx: RNPackageContext): RNPackage[] {\r\n  return [\r\n    new ExceptionsManagerPackage(ctx),\r\n  ];\r\n}\r\n```\r\n\r\n</details>\r\n\r\n## 属性 / API\r\n\r\n| API | 描述 | 参数 | 返回值 | HarmonyOS 支持 |\r\n|-----|------|------|--------|----------------|\r\n| reportFatalException | 报告致命 JS 异常，发布自定义公共事件 | title: string, details: Object[], exceptionId: number | void | ✅ 完全支持 |\r\n| reportSoftException | 报告非致命 JS 异常，记录日志 | title: string, details: Object[], exceptionId: number | void | ✅ 完全支持 |\r\n| updateExceptionMessage | 更新异常消息 | title: string, details: Object[], exceptionId: number | void | ✅ 完全支持（空实现，与 Android 一致） |\r\n| dismissRedbox | 关闭红框提示 | 无 | void | ✅ 完全支持（空实现，与 Android 一致） |\r\n\r\n### 平台差异\r\n- `reportFatalException`：Android 使用 `BroadcastReceiver + Intent` 发送异常广播；HarmonyOS 使用 `commonEventManager.publish` 发布自定义公共事件，宿主需订阅相同 action 接收。异常信息以 `parameters['JavascriptException']` 字符串传递（Android 为 `RuntimeException` 对象 extra）。\r\n- `reportSoftException`：Android 使用 `FLog.e` 输出；HarmonyOS 使用 `hilog.error` 输出。\r\n\r\n### 未实现功能\r\n| 功能 | 原因 |\r\n|-----|------|\r\n| NativeModuleCallExceptionHandler | RNOH 框架不提供等效的 `NativeModuleCallExceptionHandler` 机制。原 Android 构造函数通过 `reactContext.setNativeModuleCallExceptionHandler` 捕获 native 调用异常并广播；HarmonyOS 无直接对应 API。宿主应用如需捕获全局 JS 异常，可在 EntryAbility 中使用 `errorManager.on('error')` 注册全局异常观测器。 |\r\n\r\n### 使用限制\r\n- 模块名 `RKExceptionsManager` 与 RN 内置 ExceptionsManager 同名，原 Android 端通过 `canOverrideExistingModule=true` 覆盖系统模块。HarmonyOS 上是否能覆盖系统模块取决于 RNOH 版本和运行时行为。\r\n\r\n## 快速验证（运行 Example）\r\n\r\n### 前置条件\r\n\r\n| 依赖 | 版本要求 |\r\n|------|----------|\r\n| Node.js | >= 18 |\r\n| DevEco Studio | 5.0+ / 6.0+ |\r\n| HarmonyOS SDK | API 17+ |\r\n\r\n### 运行步骤\r\n\r\n**1. 克隆仓库**\r\n\r\n```bash\r\ngit clone <仓库地址>\r\ncd <仓库目录>\r\n```\r\n\r\n**2. 安装依赖并构建**\r\n\r\n```bash\r\nnpm install --legacy-peer-deps\r\nnpm pack           # 生成 tgz 包（会自动触发 prepare 构建 JS 产物）\r\n```\r\n\r\n**3. 进入 example 目录，安装依赖**\r\n\r\n```bash\r\ncd example\r\nnpm install --legacy-peer-deps\r\n```\r\n\r\n**4. 生成 JS Bundle**\r\n\r\n```bash\r\nnpm run dev\r\n```\r\n\r\n产物：`harmony/entry/src/main/resources/rawfile/bundle.harmony.js`\r\n\r\n**5. 用 DevEco Studio 打开鸿蒙工程**\r\n\r\n- 打开 DevEco Studio\r\n- 选择 `example/harmony` 目录\r\n- 等待 Sync 完成\r\n\r\n**6. 编译并运行 HAP**\r\n\r\n在 DevEco Studio 中点击运行按钮，将 HAP 安装到设备/模拟器。\r\n\r\n> **注意**：Example 中已预置插件依赖和 Package 注册，无需手动配置 Link。\r\n\r\n## 约束与限制\r\n\r\n### 兼容性\r\n\r\n- RNOH: 0.72+\r\n- HarmonyOS SDK: API 17+\r\n- DevEco Studio: 5.0+\r\n\r\n## 遗留问题\r\n\r\n- `NativeModuleCallExceptionHandler` 功能未实现：RNOH 框架无等效机制，宿主应用需自行使用 `errorManager.on('error')` 捕获全局异常。\r\n\r\n## 开源协议\r\n\r\n本项目基于 [MIT](./LICENSE) 协议，详见 LICENSE 文件。\r\n","readmeFilename":"README.md"}