479 lines
10 KiB
Markdown
479 lines
10 KiB
Markdown
# 收到来电但界面未显示 - 诊断指南
|
||
|
||
## 📊 日志分析
|
||
|
||
根据你提供的日志,我们可以确认:
|
||
|
||
### ✅ 成功的部分
|
||
|
||
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
|