{"_id":"@bingtang-rn/react-native-settings","_rev":"2-f841551120cc276557a07ddbc93642ea","name":"@bingtang-rn/react-native-settings","dist-tags":{"latest":"1.0.3"},"versions":{"1.0.2":{"name":"@bingtang-rn/react-native-settings","version":"1.0.2","keywords":["react-native","harmony","harmonyos","react-native-settings"],"license":"MIT","_id":"@bingtang-rn/react-native-settings@1.0.2","maintainers":[{"name":"luyizouyuan","email":"189605613@qq.com"}],"homepage":"https://gitcode.com/rn_ohos_plugin/react_native_settings","dist":{"shasum":"1635cf918cdadcf162d1737c4bb6e9bb70707626","tarball":"https://registry.npmjs.org/@bingtang-rn/react-native-settings/-/react-native-settings-1.0.2.tgz","fileCount":31,"integrity":"sha512-59/N/XG17DO75Ptso3cTqxkXhe3n31gm/wK9oW+JtEaA1L6IQFpuA2wFEmHcFjUqZPWoF/lSQhcBzLJFVvp9PQ==","signatures":[{"sig":"MEUCIF8+EEkBoNabFzWvwBDLPipAH3Fy4A6WsWRvUuSME5EYAiEAx1YbKZf8ycvuLVD1Xpd1PmVVroIRDFdcHJ4gVX902wI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":49798},"main":"./src/index.ts","module":"./src/index.ts","engines":{"node":">=18"},"gitHead":"6a6a99ad9e11e03aeb3c15e6e35b1261d06a1cb2","harmony":{"alias":"react-native-settings","autolinking":{"ohPackageName":"@oh-rn/react-native-settings","cppPackageClassName":"SettingsPackage","etsPackageClassName":"SettingsPackage","cmakeLibraryTargetName":"settings"},"codegenConfig":[{"version":1,"specPaths":["./src/specs/v1"]}]},"private":false,"scripts":{"prepare":"echo skip","codegen-lib":"react-native codegen-harmony --cpp-output-path ./harmony/settings/src/main/cpp/generated --ets-output-path ./harmony/settings/src/main/ets/generated"},"_npmUser":{"name":"luyizouyuan","email":"189605613@qq.com"},"repository":{"url":"https://gitcode.com/rn_ohos_plugin/react_native_settings","type":"git"},"_npmVersion":"11.12.1","description":"适配鸿蒙版本，提供react_native_settings组件。","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-settings_1.0.2_1785417642533_0.1904966632000662","host":"s3://npm-registry-packages-npm-production"}},"1.0.3":{"_id":"@bingtang-rn/react-native-settings@1.0.3","dist":{"shasum":"81ad7adb649300a17f335f3bd492af5276aac692","tarball":"https://registry.npmjs.org/@bingtang-rn/react-native-settings/-/react-native-settings-1.0.3.tgz","fileCount":31,"integrity":"sha512-vpLCcxEoMKZsyWKzBfSUv4S3Bo3SW4CCbIkoYToDtn0dFXgR9ssuLq8n1BreeIHdUxEEssf/L9OSJv3egMh7/Q==","signatures":[{"sig":"MEQCIH4M6xZ1kcm8YJP8etj3xARKK9SmonKFLtoHJPFkXB15AiAqWbfYAIz6qYg882nS14Ft31e5pU+qYehxldvv/3H+LQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIFOrKahZ7NWFELH6bHv6Giy/TARCuDi/aiVQlLImEbPeAiAnue+whgMI4Vx9V2JO15WhsH40WHLg9zi2+lS+339log=="}],"unpackedSize":49940},"main":"./src/index.ts","name":"@bingtang-rn/react-native-settings","_from":"file:bingtang-rn-react-native-settings-1.0.3.tgz","module":"./src/index.ts","engines":{"node":">=18"},"harmony":{"alias":"react-native-settings","autolinking":{"ohPackageName":"@bingtang-rn/react-native-settings","cppPackageClassName":"SettingsPackage","etsPackageClassName":"SettingsPackage","cmakeLibraryTargetName":"settings"},"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/settings/src/main/cpp/generated --ets-output-path ./harmony/settings/src/main/ets/generated"},"version":"1.0.3","_npmUser":{"name":"luyizouyuan","email":"189605613@qq.com"},"homepage":"https://gitcode.com/rn_ohos_plugin/react_native_settings","keywords":["react-native","harmony","harmonyos","react-native-settings"],"_resolved":"D:\\code\\rn\\npm\\batch\\react_native_settings\\bingtang-rn-react-native-settings-1.0.3.tgz","_integrity":"sha512-vpLCcxEoMKZsyWKzBfSUv4S3Bo3SW4CCbIkoYToDtn0dFXgR9ssuLq8n1BreeIHdUxEEssf/L9OSJv3egMh7/Q==","repository":{"url":"https://gitcode.com/rn_ohos_plugin/react_native_settings","type":"git"},"_npmVersion":"11.12.1","description":"适配鸿蒙版本，提供react_native_settings组件。","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-settings_1.0.3_1790569668028_0.8570987726673631"}}},"time":{"created":"2026-07-30T13:20:42.351Z","modified":"2026-09-28T04:27:48.313Z","1.0.2":"2026-07-30T13:20:42.676Z","1.0.3":"2026-09-28T04:27:48.119Z"},"license":"MIT","homepage":"https://gitcode.com/rn_ohos_plugin/react_native_settings","keywords":["react-native","harmony","harmonyos","react-native-settings"],"repository":{"url":"https://gitcode.com/rn_ohos_plugin/react_native_settings","type":"git"},"description":"适配鸿蒙版本，提供react_native_settings组件。","maintainers":[{"name":"luyizouyuan","email":"189605613@qq.com"}],"readme":"# @bingtang-rn/react-native-settings for HarmonyOS\r\n\r\n本项目基于 [react-native-settings](git@github.com:rmrs/react-native-settings) 开发，为 React Native 鸿蒙（OpenHarmony）适配版本。如果在使用过程中有任何问题，可以在GitCode提Issue，会及时跟进。issue地址：[issues](https://gitcode.com/rn_ohos_plugin/react_native_settings/issues)。\r\n\r\n## 版本对应关系\r\n\r\n| 鸿蒙适配包版本 | 原始库版本 | 支持 RN 版本 | Autolink | 编译 API 版本 |\r\n| ------------ | ---------- | ------------ | -------- | ------------- |\r\n| 1.0.2 | 1.0.2 | 0.72+ | 是 | API17+ |\r\n\r\n## 安装\r\n\r\n```bash\r\nnpm install @bingtang-rn/react-native-settings\r\n```\r\n\r\n## 使用\r\n\r\n```tsx\r\nimport RNSettings from 'react-native-settings';\r\n\r\n// 查询位置开关\r\nRNSettings.getSetting(RNSettings.LOCATION_SETTING).then(result => {\r\n  if (result === RNSettings.ENABLED) {\r\n    console.log('location is enabled');\r\n  }\r\n});\r\n\r\n// 跳转位置设置页，返回后 resolve 最新状态\r\nRNSettings.openSetting(RNSettings.ACTION_LOCATION_SOURCE_SETTINGS).then(\r\n  result => {\r\n    console.log('location is now', result);\r\n  },\r\n);\r\n\r\n// 监听位置开关变化\r\nimport { DeviceEventEmitter } from 'react-native';\r\nDeviceEventEmitter.addListener(RNSettings.GPS_PROVIDER_EVENT, e => {\r\n  console.log(e[RNSettings.LOCATION_SETTING]);\r\n});\r\n```\r\n\r\n> import 时使用原库名 `'react-native-settings'`，由 RNOH alias 映射到 `@bingtang-rn/react-native-settings`，无需修改业务代码。\r\n\r\n**平台差异**：\r\n- 飞行模式查询（`AIRPLANE_MODE_SETTING`）为语义降级：HarmonyOS 无公开飞行模式查询 API，使用 `radio.isRadioOn()` 间接推断（`airplaneOn = !isRadioOn`）。用户单独关闭蜂窝时会误判为飞行模式已开。\r\n- 无障碍字幕 API（`CAPTIONING_SETTINGS`）自 API 12 起废弃，部分设备可能不可用。\r\n- `openSetting(ACTION_AIRPLANE_MODE_SETTINGS)` 跳转移动网络页（无独立飞行模式设置页 URI）。\r\n\r\n**权限要求**：\r\n- 飞行模式查询需在 `module.json5` 声明 `ohos.permission.GET_NETWORK_INFO`（normal 级，安装时授予）。\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-settings\": \"file:../../node_modules/@bingtang-rn/react-native-settings/harmony/settings.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-settings/src/main/cpp\" ./settings)\r\n\r\ntarget_link_libraries(rnoh_app PUBLIC settings)\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 \"SettingsPackage.h\"\r\n\r\nstd::vector<std::shared_ptr<Package>> PackageProvider::getPackages(Package::Context ctx) {\r\n    return {\r\n        std::make_shared<SettingsPackage>(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 SettingsPackage from '@bingtang-rn/react-native-settings';\r\n\r\nexport function createRNPackages(ctx: RNPackageContext): RNPackage[] {\r\n  return [\r\n    new SettingsPackage(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| getSetting(LOCATION_SETTING) | 查询位置服务总开关 | LOCATION_SETTING | Promise<'ENABLED'\\|'DISABLED'> | ✅ 完全支持 |\r\n| getSetting(AIRPLANE_MODE_SETTING) | 查询飞行模式状态 | AIRPLANE_MODE_SETTING | Promise<'ENABLED'\\|'DISABLED'> | ⚠️ 部分支持（radio.isRadioOn 间接推断，语义降级） |\r\n| getSetting(CAPTIONING_SETTINGS) | 查询无障碍字幕开关 | CAPTIONING_SETTINGS | Promise<'ENABLED'\\|'DISABLED'> | ⚠️ 部分支持（API 12 起废弃，部分设备不可用） |\r\n| openSetting(ACTION_LOCATION_SOURCE_SETTINGS) | 跳转位置设置页 | ACTION_LOCATION_SOURCE_SETTINGS | Promise<'ENABLED'\\|'DISABLED'> | ✅ 完全支持 |\r\n| openSetting(ACTION_AIRPLANE_MODE_SETTINGS) | 跳转飞行模式设置页 | ACTION_AIRPLANE_MODE_SETTINGS | Promise<'ENABLED'\\|'DISABLED'> | ⚠️ 部分支持（跳转移动网络页，无独立飞行模式设置页） |\r\n| openSetting(ACTION_CAPTIONING_SETTINGS) | 跳转字幕设置页 | ACTION_CAPTIONING_SETTINGS | Promise<'ENABLED'\\|'DISABLED'> | ⚠️ 部分支持（跳转辅助功能首页，无独立字幕设置页） |\r\n| GPS_PROVIDER_EVENT | 位置开关变化事件 | 无 | {LOCATION_SETTING: 'ENABLED'\\|'DISABLED'} | ✅ 完全支持 |\r\n| AIRPLANE_MODE_EVENT | 飞行模式变化事件 | 无 | {AIRPLANE_MODE_SETTING: 'ENABLED'\\|'DISABLED'} | ✅ 完全支持 |\r\n| CAPTIONING_EVENT | 字幕开关变化事件 | 无 | {CAPTIONING_SETTINGS: 'ENABLED'\\|'DISABLED'} | ⚠️ 部分支持（API 12 起废弃） |\r\n| 常量导出 | 事件名/设置名/ACTION名/ENABLED·DISABLED | — | — | ✅ 完全支持 |\r\n\r\n### 平台差异\r\n- `getSetting(AIRPLANE_MODE_SETTING)`：HarmonyOS 无公开飞行模式查询 API，使用 `@ohos.telephony.radio.isRadioOn()` 间接推断（`airplaneOn = !isRadioOn`）。飞行模式开启时蜂窝无线电通常关闭，但用户单独关闭蜂窝时会误判为飞行模式已开。\r\n- `getSetting(CAPTIONING_SETTINGS)`：`accessibility.getCaptionsManager()` 自 API 12 起废弃，部分设备可能返回固定值或不可用。\r\n- `openSetting(ACTION_AIRPLANE_MODE_SETTINGS)`：HarmonyOS 系统设置无独立飞行模式设置页 URI，跳转到 `mobile_network_entry`（移动网络页）作为最近邻入口。\r\n- `openSetting(ACTION_CAPTIONING_SETTINGS)`：HarmonyOS 系统设置无独立字幕设置页 URI，跳转到 `accessibility_feature`（辅助功能首页）。\r\n- 常量 `ACTION_*` 值取键名本身（与 Android 的 `Settings.ACTION_*` 不同），跨平台契约 `openSetting(RNSettings.ACTION_*)` 保持一致。\r\n\r\n### 使用限制\r\n- 飞行模式查询需声明 `ohos.permission.GET_NETWORK_INFO`（normal 级，安装时授予，无需运行时申请）。\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- `CAPTIONING_SETTINGS` 查询与 `CAPTIONING_EVENT` 事件依赖的 `CaptionsManager` 自 API 12 起废弃，系统不再开放相关功能，在 API17+ 设备上可能不可用。\r\n- `AIRPLANE_MODE_SETTING` 查询为语义降级（`radio.isRadioOn()` 间接推断），与原库 Android 实现的精确查询不完全对等。\r\n\r\n## 开源协议\r\n\r\n本项目基于 [MIT License](https://github.com/rmrs/react-native-settings/blob/master/LICENSE.md)，详见 [LICENSE](./LICENSE) 文件。\r\n","readmeFilename":"README.md"}