XuqmGroup-Web/docs-site/docs/rn/troubleshooting.md
2026-07-29 02:43:17 +08:00

143 行
4.8 KiB
Markdown

此文件含有模棱两可的 Unicode 字符

此文件含有可能会与其他字符混淆的 Unicode 字符。 如果您是想特意这样的,可以安全地忽略该警告。 使用 Escape 按钮显示他们。

# 错误处理与排障
## 公共错误码
需要初始化的扩展能力可能抛出 `XuqmError`
| 错误码 | 含义 | 宿主处理 |
| --- | --- | --- |
| `XUQM_NOT_READY` | 自动初始化尚未完成或没有启动 | 检查配置和 Metro;不要阻断宿主首页 |
| `XUQM_NOT_LOGGED_IN` | 当前操作要求登录 | 完成宿主登录后重试 |
| `XUQM_CONFIG_INVALID` | 配置格式或签名无效 | 重新从租户平台下载配置并构建 |
| `XUQM_CONFIG_EXPIRED` | 构建使用的配置已过期 | 重新生成并构建 |
| `XUQM_CONFIG_REVOKED` | 配置已被租户平台撤销 | 使用平台当前有效配置重新构建 |
| `XUQM_SERVICE_DISABLED` | 对应服务未开启 | 隐藏入口或跳过功能 |
示例:
```ts
import { XuqmError } from '@xuqm/rn-common'
try {
await operation()
} catch (error) {
if (error instanceof XuqmError) {
reportNonBlockingError(error.code)
return
}
throw error
}
```
## App 启动正常,但扩展功能不可用
1. 确认 `src/assets/config/` 只有一个 `.xuqmconfig`
2. 确认 Metro 只使用一个 Xuqm 包装器。
3. 确认配置来自当前公有化或私有化租户平台,不能混用。
4. 查看 `XuqmSDK.getInitializationState()`
5. 检查租户平台是否已开启对应服务。
6. 如果服务要求登录,确认已经调用公共 `login`
扩展服务失败不应导致宿主白屏。不要在根组件渲染前无限等待网络初始化。
## Common-only 工程提示未初始化
Common 的网络、文件、时间和 UI 能力不要求初始化。出现未初始化错误通常表示调用了
需要平台配置的扩展 API,或直接调用了 `getConfig()`
Common-only 工程应当:
- 不放 `.xuqmconfig`
- 不使用 Metro 自动配置包装器。
- 不调用 `XuqmSDK.awaitInitialization()`
- 业务网络使用绝对 URL 或 `configureHttp`
## 配置构建失败
构建期失败是预期的安全门禁,常见原因:
- 配置文件超过一个。
- 文件内容被编辑、损坏或不属于当前应用。
- 配置过期或已撤销。
- 公有化配置用于私有化应用,或反向混用。
不要通过跳过校验生成安装包,应从租户平台重新下载配置。
## Update 不弹更新
先检查 `checkAppUpdate()` 的结构化状态:
- `LOGIN_REQUIRED`:未登录时正常跳过。
- `SERVICE_DISABLED`:租户平台未启用 Update。
- `NO_UPDATE`:没有适用于当前版本、设备或灰度身份的更新。
- `FAILED`:查看 `errorCode``message`,但不要阻断应用。
网络状态随检查结果返回,SDK 不替宿主决定是否允许移动网络下载。
## 插件打不开
1. Debug 确认 Metro 属于当前工程并能正常 Fast Refresh。
2. 运行 `pnpm run xuqm:doctor`
3. 确认模块 ID 与 `xuqm.modules.json` 一致。
4. 检查插件入口是否调用 `definePlugin`
5. 更新检查失败时,确认宿主仍会尝试打开本地版本。
6. 只有插件实际启动失败才记录启动失败,网络检查失败不是插件启动失败。
## BugCollect 没有数据
确认:
- 用户已经同意隐私声明。
- 租户平台已开启 BugCollect。
- 当前不是默认禁止自动上报的 Debug 行为。
- Release 构建没有启用应急关闭。
- 测试页调用 `sendTestErrorAndFlush` 时能看到明确错误。
BugCollect 失败不能影响宿主功能,不要通过抛出全局异常验证生产采集。
## XWebView 摄像头或麦克风失败
同时满足以下条件才会授权:
- 宿主声明并获得系统权限。
- `permissions.camera``permissions.microphone` 已开启。
- 当前网页 Origin 精确命中 `allowedOrigins`
- 自定义 `onRequest` 没有拒绝。
协议、端口或子域名变化都会形成不同 Origin。
## Push 没有通知
检查系统通知权限、设备厂商通道、包名与签名、租户平台服务状态、用户离线推送开关和免
打扰时间。RN 页面不应以是否缓存到厂商 Token 判断最终绑定状态。
## 从历史接入方式迁移
当前版本不再使用以下方式:
- 手动传 AppKey 初始化。
- 页面或子模块分别初始化、登录。
- 宿主手工传入应用商店地址。
- Update 的旧 Bundle 下载与应用方法。
- RN 页面手工注册推送 Token。
- XWebView 的扁平参数和全局控制器。
迁移步骤:
1. 下载并放置唯一配置文件。
2. 使用一个 Metro 包装器。
3. 隐私授权同步一次。
4. 登录和登出只调用 Common。
5. 按本文各模块页面替换旧 API。
6. 删除宿主重复的 SDK 状态、地址和 Token 缓存。
## 提交问题时提供
- SDK 包名与精确版本。
- React Native、Android/iOS 和设备系统版本。
- 公有化或私有化类型,不提供服务端秘密。
- 初始化状态、结构化错误码和最小复现路径。
- 已脱敏日志。
不要上传 `.xuqmconfig`、Token、用户隐私数据或完整业务响应。