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

479 lines
10 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.
# 收到来电但界面未显示 - 诊断指南
## 📊 日志分析
根据你提供的日志,我们可以确认:
### ✅ 成功的部分
1. **初始化成功**
```
=== TUICallKit 初始化完成,等待来电 ===
```
2. **收到来电信号**
```
[receiveNewInvitation] [newInvite: resume-c2c-new-message]
Step handle-c2c-new-message started
```
3. **消息处理完成**
```
Step emit-c2c-message-event completed
Step create-or-update-conversation-by-message completed
```
### ⚠️ 发现的问题
日志中有一个错误:
```
TypeError: _asyncToGenerator(...).apply is not a function
```
这个错误可能影响了 TUICallKit 组件的正常显示。
## 🔍 可能的原因
### 1. 组件层级问题
TUICallKit 组件可能被其他元素遮挡了。
### 2. 样式问题
TUICallKit 组件可能没有正确的样式,导致不可见。
### 3. 兼容性问题
可能存在 uni-app 版本或 Vue 版本的兼容性问题。
### 4. 组件状态问题
TUICallKit 组件可能没有正确响应来电状态。
## 🛠️ 解决方案
### 方案 1:调整组件层级和样式
修改 `call.vue` 的模板部分:
```vue
<template>
<view class="page-container">
<!-- TUICallKit 组件 - 确保在最上层 -->
<view class="call-kit-wrapper" v-if="isLogin">
<TUICallKit></TUICallKit>
</view>
<!-- 登录界面 -->
<view class="loginBox" :class="{ 'hidden': showingCall }">
<input
class="input-box"
v-model="patientId"
:placeholder="!isLogin ? '请输入患者ID(数字)' : '输入医生ID或完整userId(如:doctor_1'"
placeholder-style="color:#BBBBBB;"
/>
<view class="login">
<button
class="loginBtn"
@click="!isLogin ? loginHandler() : callHandler()"
:disabled="loading"
>
{{ loading ? '加载中...' : (!isLogin ? "登录" : "呼叫") }}
</button>
</view>
<view v-if="isLogin" class="status-info">
<text>当前登录: {{ currentUserId }}</text>
<text class="tip">提示:呼叫医生请输入医生ID(如:1)或完整ID(如:doctor_1</text>
</view>
</view>
</view>
</template>
<style>
.page-container {
width: 100vw;
height: 100vh;
position: relative;
}
.call-kit-wrapper {
position: fixed;
top: 0;
left: 0;
width: 100vw;
height: 100vh;
z-index: 9999;
background-color: rgba(0, 0, 0, 0.8);
}
.loginBox {
margin-top: 200px;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
position: relative;
z-index: 1;
}
.loginBox.hidden {
display: none;
}
/* 其他样式保持不变 */
</style>
```
### 方案 2:使用 TUIStore 监听状态
添加状态监听来确认组件是否正确响应:
```vue
<script setup>
import { ref, onMounted, onUnmounted } from "vue";
import { TUICallKitAPI, TUIStore, StoreName, NAME, CallStatus } from "../src/index";
import TUICallKit from "../src/Components/TUICallKit";
let patientId = ref("2");
let currentUserId = ref("");
let isLogin = ref(false);
let loading = ref(false);
let showingCall = ref(false); // 新增:标记是否正在通话
// 监听通话状态
onMounted(() => {
// 监听通话状态变化
TUIStore.watch(StoreName.CALL, {
[NAME.CALL_STATUS]: (newStatus) => {
console.log('=== 通话状态变化 ===', newStatus);
if (newStatus !== CallStatus.IDLE) {
showingCall.value = true;
console.log('显示通话界面');
} else {
showingCall.value = false;
console.log('隐藏通话界面');
}
}
});
});
onUnmounted(() => {
// 取消监听
TUIStore.unwatch(StoreName.CALL, {
[NAME.CALL_STATUS]: () => {}
});
});
// 其他代码保持不变...
</script>
```
### 方案 3:检查页面配置
确保 `pages.json` 中的配置正确:
```json
{
"pages": [
{
"path": "pages/call",
"style": {
"navigationBarTitleText": "视频通话",
"enablePullDownRefresh": false,
"disableScroll": true
}
}
]
}
```
### 方案 4:强制刷新组件
在收到来电时强制刷新组件:
```javascript
const loginHandler = async () => {
// ... 现有代码 ...
isLogin.value = true;
// 强制刷新组件
await nextTick();
console.log('=== TUICallKit 组件已挂载 ===');
// ... 其他代码 ...
};
```
## 🧪 调试步骤
### 步骤 1:检查组件是否挂载
在控制台执行:
```javascript
console.log('isLogin:', isLogin.value);
console.log('TUICallKit 组件应该已挂载');
```
### 步骤 2:检查通话状态
添加日志查看通话状态:
```javascript
import { TUIStore, StoreName, NAME } from "../src/index";
console.log('当前通话状态:', TUIStore.getData(StoreName.CALL, NAME.CALL_STATUS));
console.log('是否群组通话:', TUIStore.getData(StoreName.CALL, NAME.IS_GROUP));
console.log('通话角色:', TUIStore.getData(StoreName.CALL, NAME.CALL_ROLE));
```
### 步骤 3:检查组件可见性
在微信开发者工具中:
1. 点击"调试器"
2. 选择"Wxml"标签
3. 查找 `TUICallKit` 组件
4. 检查其样式和位置
### 步骤 4:查看完整日志
在控制台查看是否有其他错误信息:
```javascript
// 查找包含 "error" 或 "Error" 的日志
// 查找包含 "TUICallKit" 的日志
```
## 📱 真机测试
开发者工具可能与真机表现不同,建议:
1. **使用真机调试**
- 微信开发者工具 → 预览 → 真机调试
- 查看真机上的表现
2. **查看真机日志**
- 使用 vConsole 或微信开发者工具的远程调试
- 查看真机控制台日志
3. **测试权限**
- 确保真机上已授予摄像头和麦克风权限
- 设置 → 微信 → 权限管理
## 🎯 快速验证
### 验证 1:组件是否挂载
在 `call.vue` 中添加:
```vue
<view class="call-kit-wrapper" v-if="isLogin">
<view class="debug-info">TUICallKit 组件区域</view>
<TUICallKit></TUICallKit>
</view>
<style>
.debug-info {
position: absolute;
top: 0;
left: 0;
background: red;
color: white;
padding: 10px;
z-index: 10000;
}
</style>
```
如果看到红色的"TUICallKit 组件区域",说明组件已挂载。
### 验证 2:状态是否变化
添加状态显示:
```vue
<view v-if="isLogin" class="status-debug">
<text>通话状态: {{ callStatus }}</text>
</view>
<script setup>
import { computed } from "vue";
import { TUIStore, StoreName, NAME } from "../src/index";
const callStatus = computed(() => {
return TUIStore.getData(StoreName.CALL, NAME.CALL_STATUS);
});
</script>
```
### 验证 3:手动触发显示
添加一个测试按钮:
```vue
<button @click="testCallUI">测试通话界面</button>
<script setup>
const testCallUI = () => {
console.log('=== 测试通话界面 ===');
console.log('isLogin:', isLogin.value);
console.log('通话状态:', TUIStore.getData(StoreName.CALL, NAME.CALL_STATUS));
// 强制刷新
isLogin.value = false;
setTimeout(() => {
isLogin.value = true;
}, 100);
};
</script>
```
## 💡 常见问题
### Q1: 组件挂载了但看不到
**A:** 可能是样式问题,尝试:
```css
.call-kit-wrapper {
position: fixed !important;
top: 0 !important;
left: 0 !important;
width: 100vw !important;
height: 100vh !important;
z-index: 9999 !important;
background-color: rgba(0, 0, 0, 0.8) !important;
}
```
### Q2: 日志显示收到来电但界面无反应
**A:** 可能是组件内部状态问题,尝试:
1. 重新登录
2. 清除缓存
3. 重启微信开发者工具
### Q3: 真机和开发者工具表现不同
**A:** 这是正常的,以真机为准:
1. 使用真机调试功能
2. 查看真机日志
3. 在真机上测试完整流程
## 🔧 推荐的完整代码
基于以上分析,这是推荐的完整代码结构:
```vue
<template>
<view class="page-container">
<!-- TUICallKit 组件 -->
<view class="call-kit-wrapper" v-if="isLogin">
<TUICallKit></TUICallKit>
</view>
<!-- 登录界面 -->
<view class="loginBox">
<!-- 登录表单 -->
</view>
<!-- 调试信息(可选) -->
<view v-if="isLogin" class="debug-panel">
<text>登录状态: {{ isLogin }}</text>
<text>用户ID: {{ currentUserId }}</text>
<text>通话状态: {{ callStatus }}</text>
</view>
</view>
</template>
<script setup>
import { ref, computed, onMounted, onUnmounted, nextTick } from "vue";
import { TUICallKitAPI, TUIStore, StoreName, NAME, CallStatus } from "../src/index";
import TUICallKit from "../src/Components/TUICallKit";
// 状态
let patientId = ref("2");
let currentUserId = ref("");
let isLogin = ref(false);
let loading = ref(false);
// 计算属性 - 通话状态
const callStatus = computed(() => {
return TUIStore.getData(StoreName.CALL, NAME.CALL_STATUS) || 'IDLE';
});
// 监听通话状态
onMounted(() => {
console.log('=== 页面已挂载 ===');
TUIStore.watch(StoreName.CALL, {
[NAME.CALL_STATUS]: (newStatus) => {
console.log('=== 通话状态变化 ===', newStatus);
}
});
});
onUnmounted(() => {
TUIStore.unwatch(StoreName.CALL, {
[NAME.CALL_STATUS]: () => {}
});
});
// 登录处理
const loginHandler = async () => {
// ... 现有登录代码 ...
isLogin.value = true;
await nextTick();
console.log('=== TUICallKit 组件已挂载 ===');
console.log('当前通话状态:', callStatus.value);
};
// 其他代码...
</script>
<style>
.page-container {
width: 100vw;
height: 100vh;
position: relative;
}
.call-kit-wrapper {
position: fixed;
top: 0;
left: 0;
width: 100vw;
height: 100vh;
z-index: 9999;
}
.debug-panel {
position: fixed;
bottom: 0;
left: 0;
right: 0;
background: rgba(0, 0, 0, 0.8);
color: white;
padding: 10px;
font-size: 12px;
z-index: 10000;
display: flex;
flex-direction: column;
gap: 5px;
}
/* 其他样式... */
</style>
```
## 📞 下一步
1. **添加调试信息**:使用上面的调试代码
2. **查看状态变化**:确认通话状态是否正确变化
3. **检查组件显示**:确认 TUICallKit 组件是否可见
4. **真机测试**:在真机上测试完整流程
如果问题仍然存在,请提供:
1. 添加调试信息后的完整日志
2. Wxml 面板中 TUICallKit 组件的截图
3. 真机测试的结果
---
**最后更新:** 2024-03-04
**版本:** 1.0