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

391 lines
8.4 KiB
Markdown
Raw 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 组件未正确挂载
**问题:** 小程序端的 TUICallKit 组件在登录前就已经挂载,但可能没有正确初始化监听。
**修复:**
- 改为登录后才挂载 TUICallKit 组件
- 确保组件在登录状态下一直保持挂载
### 2. 事件监听未正确设置
**问题:** 初始化后没有设置来电事件监听,导致收到来电时没有响应。
**修复:**
- 在初始化成功后立即设置事件监听
- 添加详细的日志输出
### 3. IM 账号可能未导入
**问题:** 患者账号可能没有成功导入到腾讯云 IM 系统。
**修复:**
- 后端在生成签名时自动导入账号
- 添加日志记录导入结果
## 已实施的修复
### 修复 1:条件渲染 TUICallKit 组件
```vue
<template>
<view>
<!-- 只在登录后才挂载 TUICallKit -->
<TUICallKit v-if="isLogin"></TUICallKit>
<view class="loginBox">
<!-- 登录界面 -->
</view>
</view>
</template>
```
### 修复 2:完善事件监听
```javascript
// 初始化成功后设置事件监听
await TUICallKitAPI.init({
sdkAppID: Number(sdkAppId),
userID: userId,
userSig: userSig,
});
// 等待初始化完成
await new Promise(resolve => setTimeout(resolve, 1000));
// 设置所有必要的事件监听
TUICallKitAPI.on('onCallReceived', (data) => {
console.log('=== 收到来电 ===', data);
uni.showToast({
title: '收到来电',
icon: 'none'
});
});
TUICallKitAPI.on('onCallCancelled', (data) => {
console.log('=== 来电已取消 ===', data);
});
TUICallKitAPI.on('onCallEnd', (data) => {
console.log('=== 通话已结束 ===', data);
});
TUICallKitAPI.on('onUserVideoAvailable', (data) => {
console.log('=== 用户视频状态变化 ===', data);
});
TUICallKitAPI.on('onUserAudioAvailable', (data) => {
console.log('=== 用户音频状态变化 ===', data);
});
console.log('=== 事件监听已设置 ===');
```
### 修复 3:增强日志输出
在关键步骤添加详细日志:
- 登录信息
- 初始化状态
- 事件监听设置
- 来电接收
## 测试步骤
### 步骤 1:清除缓存重新测试
1. 微信开发者工具:点击"清缓存" → "全部清除"
2. 真机测试:删除小程序后重新打开
### 步骤 2:小程序端登录
1. 输入患者ID`2`
2. 点击"登录"
3. 查看控制台输出:
```
获取签名成功: { userId: "patient_2", sdkAppId: "1400xxxxxx", ... }
=== 小程序端登录信息 ===
sdkAppId: 1400xxxxxx
userId: patient_2
userSig 长度: xxx
TUICallKit 初始化成功, userId: patient_2
=== 事件监听已设置 ===
```
4. 确认界面显示:
- "当前登录: patient_2"
- 输入框提示变为"输入医生ID或完整userId"
### 步骤 3Web 端发起呼叫
1. Web 端打开患者详情页
2. 点击"视频通话"按钮
3. 查看浏览器控制台:
```
=== 发起一对一通话 ===
后端返回的 patientUserId: patient_2
最终使用的 targetUserId: patient_2
通话已发起,目标用户: patient_2
```
### 步骤 4:小程序端应该收到来电
小程序端控制台应该输出:
```
=== 收到来电 ===
{
inviter: "doctor_1",
inviteeList: ["patient_2"],
callType: 2,
...
}
```
同时:
- 弹出 Toast 提示"收到来电"
- TUICallKit 界面自动显示
- 显示"接听"和"拒绝"按钮
## 如果仍然无法接听
### 检查点 1:确认 IM 账号已导入
查看后端日志(`runtime/log/`):
```
小程序获取患者签名成功 - patient_id: 2, user_id: patient_2
确保患者IM账号存在 - patient_id: 2, user_id: patient_2, nick: 张三
```
如果看到"导入患者IM账号失败",说明 IM 账号导入有问题。
### 检查点 2:确认 SDKAppID 一致
对比 Web 端和小程序端的 SDKAppID
```javascript
// Web 端
console.log('Web 端 SDKAppID:', res.sdkAppId)
// 小程序端
console.log('小程序端 SDKAppID:', sdkAppId)
```
必须完全一致!
### 检查点 3:确认 userId 格式一致
对比呼叫目标和登录用户:
```javascript
// Web 端呼叫
console.log('最终使用的 targetUserId:', targetUserId) // 应该是 patient_2
// 小程序端登录
console.log('userId:', userId) // 应该是 patient_2
```
必须完全一致!
### 检查点 4:确认网络连接
小程序端应该能连接到腾讯云服务器:
```javascript
// 检查 WebSocket 连接
console.log('IM SDK 连接状态:', TUICallKitAPI.getConnectionStatus())
```
如果返回 `DISCONNECTED`,说明网络连接有问题。
### 检查点 5:确认权限已授予
小程序需要以下权限:
- 摄像头权限
- 麦克风权限
- 网络权限
在小程序设置中检查:
设置 → 权限管理 → 允许摄像头和麦克风
## 常见错误及解决方案
### 错误 1:控制台没有"收到来电"日志
**原因:**
- 事件监听未正确设置
- TUICallKit 组件未挂载
- IM 连接断开
**解决:**
1. 确认登录后 `isLogin.value = true`
2. 确认控制台有"事件监听已设置"日志
3. 重新登录小程序
### 错误 2:提示"对方不在线"
**原因:**
- userId 格式不匹配
- 小程序端未登录
- IM 账号未导入
**解决:**
1. 检查 userId 格式是否一致
2. 确认小程序端已登录
3. 查看后端日志确认账号已导入
### 错误 3:小程序闪退或卡死
**原因:**
- 内存不足
- 组件初始化失败
- 权限未授予
**解决:**
1. 重启微信
2. 清除小程序缓存
3. 授予所有必要权限
## 调试技巧
### 技巧 1:使用真机调试
开发者工具可能与真机表现不同,建议:
1. 使用真机调试功能
2. 查看真机控制台日志
3. 测试实际通话效果
### 技巧 2:双向测试
不仅测试 Web → 小程序,也测试小程序 → Web:
**小程序呼叫 Web**
1. 小程序端登录为 `patient_2`
2. 输入 `1``doctor_1`
3. 点击"呼叫"
4. Web 端应该收到来电
### 技巧 3:查看腾讯云控制台
登录腾讯云控制台:
1. 进入"即时通信 IM"
2. 查看"用户管理"
3. 确认 `patient_2``doctor_1` 都已导入
4. 查看"实时监控"了解通话状态
### 技巧 4:抓包分析
使用微信开发者工具的网络面板:
1. 切换到 Network 标签
2. 筛选 WebSocket 连接
3. 查看信令消息
4. 确认收到 INVITE 消息
## 成功标志
当一切正常时,你应该看到:
### 小程序端控制台
```
获取签名成功: { userId: "patient_2", ... }
=== 小程序端登录信息 ===
sdkAppId: 1400xxxxxx
userId: patient_2
TUICallKit 初始化成功, userId: patient_2
=== 事件监听已设置 ===
登录成功
[Web 端发起呼叫后]
=== 收到来电 ===
{
inviter: "doctor_1",
inviteeList: ["patient_2"],
callType: 2
}
```
### 小程序界面
- 自动弹出通话界面
- 显示来电者信息
- 显示"接听"和"拒绝"按钮
- 可以正常接听通话
## 后端日志检查
查看 `server/runtime/log/` 目录下的日志文件:
### 成功的日志示例
```
[info] 小程序获取患者签名成功 - patient_id: 2, user_id: patient_2
[info] 确保患者IM账号存在 - patient_id: 2, user_id: patient_2, nick: 张三
[info] 医生获取通话签名成功 - admin_id: 1, patient_id: 2
```
### 失败的日志示例
```
[error] 获取患者签名失败 - patient_id: 2, error: xxx
[warning] 导入患者IM账号失败 - patient_id: 2, error: xxx
```
如果看到错误日志,需要检查:
1. 腾讯云配置是否正确
2. SDKAppID 和 SecretKey 是否有效
3. 网络连接是否正常
## 终极解决方案
如果以上所有方法都无效,尝试以下步骤:
### 1. 完全重置
```bash
# 小程序端
1. 删除小程序
2. 清除微信缓存
3. 重启微信
4. 重新打开小程序
# Web 端
1. 清除浏览器缓存
2. 退出登录
3. 重新登录
4. 刷新页面
```
### 2. 检查腾讯云配置
```php
// server/config/trtc.php
return [
'sdkAppId' => '1400xxxxxx', // 确保正确
'secretKey' => 'xxxxxxxx', // 确保正确
'expireTime' => 86400
];
```
### 3. 手动导入 IM 账号
使用腾讯云控制台手动导入:
1. 登录腾讯云控制台
2. 进入"即时通信 IM"
3. 用户管理 → 导入用户
4. 导入 `patient_2``doctor_1`
### 4. 联系技术支持
提供以下信息:
1. 小程序端完整控制台日志
2. Web 端完整控制台日志
3. 后端日志文件
4. 腾讯云 SDKAppID
5. 测试环境信息
---
**最后更新:** 2024-03-04
**版本:** 2.0