Files
zyt/wx/TUICallKit/FIX_SUMMARY.md
2026-03-04 15:32:30 +08:00

297 lines
7.6 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 小程序端无法接听来电 - 修复总结
## 问题描述
Web 端(医生端)发起视频通话后,小程序端(患者端)无法接听,没有任何反应。
## 根本原因
1. **TUICallKit 组件挂载时机不当**:组件在登录前就已挂载,但事件监听未正确设置
2. **事件监听缺失**:初始化后没有设置来电事件监听
3. **缺少初始化等待时间**:初始化后立即设置监听可能导致监听失效
## 已实施的修复
### 修复 1:条件渲染 TUICallKit 组件
**修改文件:** `wx/TUICallKit/pages/call.vue`
**修改内容:**
```vue
<!-- 修改前 -->
<template>
<view>
<TUICallKit></TUICallKit>
...
</view>
</template>
<!-- 修改后 -->
<template>
<view>
<!-- 只在登录后才挂载 TUICallKit -->
<TUICallKit v-if="isLogin"></TUICallKit>
...
</view>
</template>
```
**原因:** 确保组件在登录成功后才挂载,避免未初始化状态下的问题。
### 修复 2:移除不支持的事件监听代码
**修改文件:** `wx/TUICallKit/pages/call.vue`
**修改内容:**
```javascript
// 初始化 TUICallKit
await TUICallKitAPI.init({
sdkAppID: Number(sdkAppId),
userID: userId,
userSig: userSig,
});
console.log('TUICallKit 初始化成功, userId:', userId);
// 等待初始化完成
await new Promise(resolve => setTimeout(resolve, 1000));
// 小程序端使用 TUIStore 监听状态变化,而不是 .on() 方法
// TUICallKit 组件会自动处理来电显示
console.log('=== TUICallKit 初始化完成,等待来电 ===');
isLogin.value = true;
```
**原因:**
- 小程序端的 TUICallKit 不支持 `.on()` 方法
- TUICallKit 组件会自动处理来电显示和交互
- 不需要手动设置事件监听
### 修复 3:增强 userId 格式处理
**修改文件:** `wx/TUICallKit/pages/call.vue`
**修改内容:**
```javascript
const callHandler = async () => {
// ...
// 构建目标用户ID - 确保格式一致
let targetUserId = patientId.value;
if (/^\d+$/.test(patientId.value)) {
// 纯数字,添加 doctor_ 前缀(患者呼叫医生)
targetUserId = `doctor_${patientId.value}`;
}
console.log('准备呼叫用户:', targetUserId);
// 发起通话
await TUICallKitAPI.calls({
userIDList: [targetUserId],
type: 2,
});
// ...
};
```
**原因:** 自动处理 userId 格式,避免格式不匹配导致的问题。
### 修复 4:改进用户界面提示
**修改文件:** `wx/TUICallKit/pages/call.vue`
**修改内容:**
```vue
<input
class="input-box"
v-model="patientId"
:placeholder="!isLogin ? '请输入患者ID(数字)' : '输入医生ID或完整userId(如:doctor_1'"
placeholder-style="color:#BBBBBB;"
/>
<view v-if="isLogin" class="status-info">
<text>当前登录: {{ currentUserId }}</text>
<text class="tip">提示呼叫医生请输入医生ID1或完整IDdoctor_1</text>
</view>
```
**原因:** 提供更清晰的用户指引,减少操作错误。
### 修复 5:增强日志输出
**修改文件:** `wx/TUICallKit/pages/call.vue`
**修改内容:**
```javascript
console.log('=== 小程序端登录信息 ===');
console.log('sdkAppId:', sdkAppId);
console.log('userId:', userId);
console.log('userSig 长度:', userSig?.length);
```
**原因:** 便于排查问题,快速定位错误。
## 测试验证
### 测试步骤
1. **小程序端登录**
```
输入患者ID2
点击"登录"
确认显示:"当前登录: patient_2"
确认控制台显示:"=== 事件监听已设置 ==="
```
2. **Web 端发起呼叫**
```
打开患者详情页
点击"视频通话"按钮
确认控制台显示:"最终使用的 targetUserId: patient_2"
```
3. **小程序端接听**
```
确认自动弹出通话界面
确认控制台显示:"=== 收到来电 ==="
点击"接听"按钮
确认视频和音频正常
```
### 预期结果
**小程序端控制台:**
```
获取签名成功: { userId: "patient_2", sdkAppId: "1400xxxxxx", ... }
=== 小程序端登录信息 ===
sdkAppId: 1400xxxxxx
userId: patient_2
userSig 长度: xxx
TUICallKit 初始化成功, userId: patient_2
=== TUICallKit 初始化完成,等待来电 ===
登录成功
[收到来电时]
TUICallKit 组件会自动弹出来电界面
```
**Web 端控制台:**
```
=== 发起一对一通话 ===
后端返回的 patientUserId: patient_2
最终使用的 targetUserId: patient_2
通话已发起,目标用户: patient_2
>>> 正在呼叫
>>> 通话已接通
```
## 相关文档
1. **CANNOT_RECEIVE_CALL_FIX.md** - 详细的问题诊断与修复指南
2. **CALL_DEBUG_GUIDE.md** - 调试指南,包含常见问题和解决方案
3. **QUICK_FIX.md** - 快速修复指南
4. **TEST_GUIDE.md** - 完整的测试指南
5. **CALL_TROUBLESHOOTING_CHECKLIST.md** - 问题排查清单
## 注意事项
### 1. userId 格式必须一致
- Web 端使用 `patient_2` 呼叫
- 小程序端必须登录为 `patient_2`
- 格式不一致会导致"对方不在线"错误
### 2. SDKAppID 必须一致
- Web 端和小程序端必须使用同一个腾讯云应用
- 检查后端配置文件确保一致
### 3. 小程序必须在前台
- 小程序切换到后台可能无法接收来电
- 测试时确保小程序在前台运行
### 4. 权限必须授予
- 摄像头权限
- 麦克风权限
- 网络权限
### 5. 初始化需要时间
- 登录后等待 1 秒再进行其他操作
- 确保看到"事件监听已设置"日志
## 常见问题
### Q1: 小程序端仍然无法接听怎么办?
**A:** 按以下顺序检查:
1. 确认小程序端已登录(显示"当前登录: patient_X"
2. 确认控制台有"事件监听已设置"日志
3. 确认 userId 格式一致(Web 端和小程序端)
4. 确认 SDKAppID 一致
5. 尝试清除缓存重新登录
### Q2: 提示"对方不在线"怎么办?
**A:** 这是最常见的问题,原因是 userId 格式不匹配:
1. 检查 Web 端控制台:`targetUserId: patient_2`
2. 检查小程序端控制台:`userId: patient_2`
3. 确保两者完全一致
4. 如果不一致,检查后端接口返回的数据
### Q3: 小程序端没有"收到来电"日志怎么办?
**A:** 说明事件监听未生效:
1. 确认初始化成功
2. 确认有"事件监听已设置"日志
3. 尝试重新登录
4. 检查 TUICallKit 组件是否正确挂载
### Q4: 如何确认后端配置正确?
**A:** 检查以下几点:
1. 查看后端日志:`runtime/log/`
2. 确认有"小程序获取患者签名成功"日志
3. 确认有"确保患者IM账号存在"日志
4. 如果有错误日志,根据提示修复
### Q5: 真机测试和开发者工具表现不一致?
**A:** 这是正常的:
1. 优先以真机测试结果为准
2. 开发者工具可能有限制或 bug
3. 建议使用真机调试功能
4. 查看真机控制台日志
## 后续优化建议
### 1. 添加心跳检测
定期检查连接状态,确保在线状态准确。
### 2. 添加重连机制
网络中断后自动重连,提高稳定性。
### 3. 优化错误提示
根据不同错误码给出更具体的提示信息。
### 4. 添加通话质量监控
实时监控通话质量,出现问题时自动调整。
### 5. 添加通话记录
记录通话历史,便于后续查询和统计。
## 技术支持
如果按照本文档操作后仍然无法解决问题,请提供以下信息:
1. 小程序端完整控制台日志(截图)
2. Web 端完整控制台日志(截图)
3. 后端日志文件(`runtime/log/`
4. 腾讯云 SDKAppID(可部分隐藏)
5. 测试环境信息(开发/生产,域名等)
6. 具体的错误提示信息
---
**修复日期:** 2024-03-04
**修复版本:** 2.0
**修复人员:** Kiro AI Assistant
**测试状态:** 待验证