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

4.8 KiB

错误处理与排障

公共错误码

需要初始化的扩展能力可能抛出 XuqmError

错误码 含义 宿主处理
XUQM_NOT_READY 自动初始化尚未完成或没有启动 检查配置和 Metro;不要阻断宿主首页
XUQM_NOT_LOGGED_IN 当前操作要求登录 完成宿主登录后重试
XUQM_CONFIG_INVALID 配置格式或签名无效 重新从租户平台下载配置并构建
XUQM_CONFIG_EXPIRED 构建使用的配置已过期 重新生成并构建
XUQM_CONFIG_REVOKED 配置已被租户平台撤销 使用平台当前有效配置重新构建
XUQM_SERVICE_DISABLED 对应服务未开启 隐藏入口或跳过功能

示例:

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:查看 errorCodemessage,但不要阻断应用。

网络状态随检查结果返回,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.camerapermissions.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、用户隐私数据或完整业务响应。