# 小程序端与 Web 端 API 差异说明 ## 重要提示 ⚠️ 小程序端的 TUICallKit API 与 Web 端有显著差异,不能直接使用 Web 端的事件监听方式。 ## 核心差异 ### 1. 事件监听方式 #### ❌ Web 端方式(小程序端不支持) ```javascript // Web 端可以这样使用 TUICallKitServer.setCallback({ statusChanged: handleStatusChange, afterCalling: handleAfterCalling }); // 或者 TUICallKitAPI.on('onCallReceived', (data) => { console.log('收到来电', data); }); ``` #### ✅ 小程序端正确方式 ```javascript // 小程序端不需要手动监听事件 // TUICallKit 组件会自动处理来电显示 // 只需要: // 1. 初始化 TUICallKit await TUICallKitAPI.init({ sdkAppID: Number(sdkAppId), userID: userId, userSig: userSig, }); // 2. 挂载 TUICallKit 组件 // 组件会自动: // - 监听来电 // - 显示来电界面 // - 处理接听/拒绝 // - 显示通话界面 ``` ### 2. 状态管理 #### Web 端 使用回调函数处理状态变化: ```javascript const handleStatusChange = ({ oldStatus, newStatus }) => { if (newStatus === STATUS.CALLING_C2C_VIDEO) { console.log('通话已接通'); } }; ``` #### 小程序端 使用 TUIStore 监听状态(如果需要): ```javascript import { TUIStore, StoreName, NAME } from '../src/index'; // 监听通话状态 TUIStore.watch(StoreName.CALL, { [NAME.CALL_STATUS]: (newValue) => { console.log('通话状态变化:', newValue); } }); ``` ### 3. 发起通话 #### Web 端 ```javascript await TUICallKitServer.call({ userID: 'patient_2', type: TUICallType.VIDEO_CALL }); ``` #### 小程序端 ```javascript await TUICallKitAPI.calls({ userIDList: ['doctor_1'], type: 2, // 2 表示视频通话 }); ``` 注意差异: - Web 端:`call()` 方法,单数 - 小程序端:`calls()` 方法,复数 - Web 端:`userID` 参数,单个用户 - 小程序端:`userIDList` 参数,用户数组 ## 小程序端正确的使用流程 ### 步骤 1:初始化 ```javascript const loginHandler = async () => { // 1. 获取签名 const signatureData = await getSignatureFromServer(patientId.value); const { sdkAppId, userId, userSig } = signatureData; // 2. 初始化 TUICallKit await TUICallKitAPI.init({ sdkAppID: Number(sdkAppId), userID: userId, userSig: userSig, }); console.log('TUICallKit 初始化成功'); // 3. 设置登录状态(触发组件挂载) isLogin.value = true; // 完成!不需要手动设置事件监听 }; ``` ### 步骤 2:挂载组件 ```vue ``` ### 步骤 3:自动处理来电 当有来电时,TUICallKit 组件会自动: 1. 检测到来电信号 2. 显示来电界面 3. 播放铃声 4. 显示接听/拒绝按钮 5. 处理用户操作 **你不需要做任何额外的事情!** ### 步骤 4:发起通话(可选) ```javascript const callHandler = async () => { let targetUserId = patientId.value; // 如果是纯数字,添加前缀 if (/^\d+$/.test(patientId.value)) { targetUserId = `doctor_${patientId.value}`; } // 发起通话 await TUICallKitAPI.calls({ userIDList: [targetUserId], type: 2, // 2 = 视频通话 }); }; ``` ## 常见错误 ### 错误 1:使用 .on() 方法 ```javascript // ❌ 错误:小程序端不支持 TUICallKitAPI.on('onCallReceived', (data) => { console.log('收到来电', data); }); // 错误信息: // TUICallKitAPI.on is not a function ``` **解决:** 删除所有 `.on()` 调用,让组件自动处理。 ### 错误 2:使用 setCallback ```javascript // ❌ 错误:小程序端不支持 TUICallKitAPI.setCallback({ statusChanged: handleStatusChange }); // 错误信息: // TUICallKitAPI.setCallback is not a function ``` **解决:** 删除 `setCallback` 调用,使用 TUIStore 监听(如果需要)。 ### 错误 3:使用 call() 而不是 calls() ```javascript // ❌ 错误:小程序端使用 calls() await TUICallKitAPI.call({ userID: 'doctor_1', type: 2 }); // 错误信息: // TUICallKitAPI.call is not a function ``` **解决:** 使用 `calls()` 方法,参数为 `userIDList` 数组。 ## 如何监听状态(高级用法) 如果你确实需要监听通话状态,使用 TUIStore: ```javascript import { TUIStore, StoreName, NAME, CallStatus } from '../src/index'; // 在 setup 中 onMounted(() => { // 监听通话状态 TUIStore.watch(StoreName.CALL, { [NAME.CALL_STATUS]: (newStatus) => { console.log('通话状态变化:', newStatus); switch (newStatus) { case CallStatus.IDLE: console.log('空闲状态'); break; case CallStatus.WAITING: console.log('等待接听'); break; case CallStatus.CONNECTED: console.log('通话中'); break; } }, [NAME.IS_GROUP]: (isGroup) => { console.log('是否群组通话:', isGroup); }, [NAME.CALL_ROLE]: (role) => { console.log('通话角色:', role); } }); }); // 在 onUnmounted 中取消监听 onUnmounted(() => { TUIStore.unwatch(StoreName.CALL, { [NAME.CALL_STATUS]: () => {}, [NAME.IS_GROUP]: () => {}, [NAME.CALL_ROLE]: () => {} }); }); ``` ## 可用的 TUIStore 监听项 ```javascript // 通话状态 NAME.CALL_STATUS // 通话状态(IDLE, WAITING, CONNECTED) NAME.CALL_ROLE // 通话角色(CALLER, CALLEE) NAME.CALL_MEDIA_TYPE // 通话类型(VIDEO, AUDIO) NAME.IS_GROUP // 是否群组通话 // 用户信息 NAME.LOCAL_USER_INFO // 本地用户信息 NAME.REMOTE_USER_INFO_LIST // 远程用户列表 // 设备状态 NAME.IS_MUTED // 是否静音 NAME.IS_CAMERA_ON // 摄像头是否开启 NAME.IS_EAR_PHONE // 是否使用听筒 // 其他 NAME.CALL_DURATION // 通话时长 NAME.CALLER_USER_INFO // 主叫用户信息 ``` ## 完整示例 ```vue ``` ## 总结 ### ✅ 小程序端应该做的 1. 初始化 TUICallKit 2. 挂载 TUICallKit 组件 3. 让组件自动处理来电 ### ❌ 小程序端不应该做的 1. 使用 `.on()` 方法监听事件 2. 使用 `setCallback()` 设置回调 3. 使用 `call()` 而不是 `calls()` 4. 手动显示来电界面 ### 🎯 关键点 - **TUICallKit 组件会自动处理一切** - **你只需要初始化和挂载组件** - **如果需要监听状态,使用 TUIStore** - **不要尝试使用 Web 端的 API** --- **最后更新:** 2024-03-04 **版本:** 1.0