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

8.4 KiB
Raw Blame History

小程序端无法接听来电 - 问题诊断与修复

问题现象

Web 端发起视频通话后,小程序端没有任何反应,无法接听来电。

根本原因分析

1. TUICallKit 组件未正确挂载

问题: 小程序端的 TUICallKit 组件在登录前就已经挂载,但可能没有正确初始化监听。

修复:

  • 改为登录后才挂载 TUICallKit 组件
  • 确保组件在登录状态下一直保持挂载

2. 事件监听未正确设置

问题: 初始化后没有设置来电事件监听,导致收到来电时没有响应。

修复:

  • 在初始化成功后立即设置事件监听
  • 添加详细的日志输出

3. IM 账号可能未导入

问题: 患者账号可能没有成功导入到腾讯云 IM 系统。

修复:

  • 后端在生成签名时自动导入账号
  • 添加日志记录导入结果

已实施的修复

修复 1:条件渲染 TUICallKit 组件

<template>
  <view>
    <!-- 只在登录后才挂载 TUICallKit -->
    <TUICallKit v-if="isLogin"></TUICallKit>
    <view class="loginBox">
      <!-- 登录界面 -->
    </view>
  </view>
</template>

修复 2:完善事件监听

// 初始化成功后设置事件监听
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. 输入患者ID2
  2. 点击"登录"
  3. 查看控制台输出:
获取签名成功: { userId: "patient_2", sdkAppId: "1400xxxxxx", ... }
=== 小程序端登录信息 ===
sdkAppId: 1400xxxxxx
userId: patient_2
userSig 长度: xxx
TUICallKit 初始化成功, userId: patient_2
=== 事件监听已设置 ===
  1. 确认界面显示:
    • "当前登录: 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

// Web 端
console.log('Web 端 SDKAppID:', res.sdkAppId)

// 小程序端
console.log('小程序端 SDKAppID:', sdkAppId)

必须完全一致!

检查点 3:确认 userId 格式一致

对比呼叫目标和登录用户:

// Web 端呼叫
console.log('最终使用的 targetUserId:', targetUserId)  // 应该是 patient_2

// 小程序端登录
console.log('userId:', userId)  // 应该是 patient_2

必须完全一致!

检查点 4:确认网络连接

小程序端应该能连接到腾讯云服务器:

// 检查 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. 输入 1doctor_1
  3. 点击"呼叫"
  4. Web 端应该收到来电

技巧 3:查看腾讯云控制台

登录腾讯云控制台:

  1. 进入"即时通信 IM"
  2. 查看"用户管理"
  3. 确认 patient_2doctor_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. 完全重置

# 小程序端
1. 删除小程序
2. 清除微信缓存
3. 重启微信
4. 重新打开小程序

# Web 端
1. 清除浏览器缓存
2. 退出登录
3. 重新登录
4. 刷新页面

2. 检查腾讯云配置

// server/config/trtc.php
return [
    'sdkAppId' => '1400xxxxxx',  // 确保正确
    'secretKey' => 'xxxxxxxx',   // 确保正确
    'expireTime' => 86400
];

3. 手动导入 IM 账号

使用腾讯云控制台手动导入:

  1. 登录腾讯云控制台
  2. 进入"即时通信 IM"
  3. 用户管理 → 导入用户
  4. 导入 patient_2doctor_1

4. 联系技术支持

提供以下信息:

  1. 小程序端完整控制台日志
  2. Web 端完整控制台日志
  3. 后端日志文件
  4. 腾讯云 SDKAppID
  5. 测试环境信息

最后更新: 2024-03-04 版本: 2.0