@tencent-rtc/mcp 1.3.8 → 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +2 -2
- package/resource/doc/{tuicallkit/iOS/faq.md → callkit/faq/android-faq.md} +10 -22
- package/resource/doc/{tuicallkit/android/faq.md → callkit/faq/flutter-faq.md} +10 -22
- package/resource/doc/{tuicallkit/flutter/faq.md → callkit/faq/ios-faq.md} +10 -22
- package/resource/doc/callkit/preset/android/api.md +296 -0
- package/resource/doc/callkit/preset/android/integration.md +430 -0
- package/resource/doc/callkit/preset/flutter/api.md +410 -0
- package/resource/doc/{tuicallkit → callkit/preset}/flutter/integration.md +35 -97
- package/resource/doc/callkit/preset/ios/api.md +80 -0
- package/resource/doc/{tuicallkit/iOS → callkit/preset/ios}/integration.md +37 -118
- package/resource/doc/callkit/preset/react/api.md +501 -0
- package/resource/doc/{tuicallkit → callkit/preset}/react/integration.md +5 -20
- package/resource/doc/callkit/preset/vue/api.md +501 -0
- package/resource/doc/{tuicallkit → callkit/preset}/vue/integration.md +4 -19
- package/resource/doc/{chatuikit → chatkit}/android/faq.md +29 -38
- package/resource/doc/{chatuikit → chatkit}/android/features/theme.md +22 -166
- package/resource/doc/chatkit/android/integration.md +490 -0
- package/resource/doc/chatkit/faq/android_sdk/client-api.md +281 -0
- package/resource/doc/{chatuikit → chatkit}/faq/common/product.md +0 -1
- package/resource/doc/{chatuikit → chatkit}/faq/common/server.md +1 -1
- package/resource/doc/chatkit/faq/flutter_sdk/client-api.md +199 -0
- package/resource/doc/{chatuikit → chatkit}/faq/flutter_sdk/faq.md +3 -3
- package/resource/doc/chatkit/faq/ios_sdk/client-api.md +235 -0
- package/resource/doc/{chatuikit → chatkit}/faq/web_sdk/faq.md +3 -3
- package/resource/doc/{chatuikit → chatkit}/flutter/features/theme.md +22 -166
- package/resource/doc/{chatuikit → chatkit}/flutter/integration.md +19 -88
- package/resource/doc/{chatuikit/iOS → chatkit/ios}/faq.md +29 -38
- package/resource/doc/{chatuikit/iOS → chatkit/ios}/features/theme.md +27 -176
- package/resource/doc/{chatuikit/iOS → chatkit/ios}/integration.md +47 -165
- package/resource/doc/{chatuikit → chatkit}/react/components/avatar.md +0 -33
- package/resource/doc/{chatuikit → chatkit}/react/components/chat-header.md +8 -49
- package/resource/doc/{chatuikit → chatkit}/react/components/chat-setting.md +6 -35
- package/resource/doc/{chatuikit → chatkit}/react/components/chat.md +0 -6
- package/resource/doc/{chatuikit → chatkit}/react/components/component-list.md +0 -11
- package/resource/doc/{chatuikit → chatkit}/react/components/contact-list.md +96 -502
- package/resource/doc/chatkit/react/components/conversation-actions.md +174 -0
- package/resource/doc/chatkit/react/components/conversation-list.md +333 -0
- package/resource/doc/chatkit/react/components/conversation-preview.md +118 -0
- package/resource/doc/chatkit/react/components/conversation-search.md +60 -0
- package/resource/doc/{chatuikit → chatkit}/react/components/message-input.md +36 -337
- package/resource/doc/{chatuikit → chatkit}/react/components/message-list.md +20 -212
- package/resource/doc/chatkit/react/components/search.md +243 -0
- package/resource/doc/{chatuikit → chatkit}/react/components/tuikit.md +1 -47
- package/resource/doc/{chatuikit → chatkit}/react/integration.md +21 -81
- package/resource/doc/{chatuikit → chatkit}/vue/components/avatar.md +0 -33
- package/resource/doc/{chatuikit → chatkit}/vue/components/chat-header.md +7 -48
- package/resource/doc/{chatuikit → chatkit}/vue/components/chat-setting.md +3 -5
- package/resource/doc/{chatuikit → chatkit}/vue/components/chat.md +0 -5
- package/resource/doc/{chatuikit → chatkit}/vue/components/component-list.md +0 -15
- package/resource/doc/chatkit/vue/components/contact-list.md +271 -0
- package/resource/doc/chatkit/vue/components/conversation-actions.md +228 -0
- package/resource/doc/{chatuikit → chatkit}/vue/components/conversation-list.md +42 -492
- package/resource/doc/chatkit/vue/components/conversation-preview.md +213 -0
- package/resource/doc/chatkit/vue/components/conversation-search.md +50 -0
- package/resource/doc/{chatuikit → chatkit}/vue/components/message-input.md +2 -223
- package/resource/doc/{chatuikit → chatkit}/vue/components/message-list.md +23 -252
- package/resource/doc/{chatuikit → chatkit}/vue/components/search.md +73 -640
- package/resource/doc/{chatuikit → chatkit}/vue/components/tuikit.md +7 -21
- package/resource/doc/{chatuikit → chatkit}/vue/components/userpicker.md +3 -62
- package/resource/doc/{chatuikit → chatkit}/vue/faq.md +1 -1
- package/resource/doc/{chatuikit → chatkit}/vue/integration.md +22 -23
- package/resource/doc/livekit/{live → core-sdk/live}/android/live-audience-list.md +18 -89
- package/resource/doc/livekit/{live → core-sdk/live}/android/live-audio-effect.md +34 -192
- package/resource/doc/livekit/{live → core-sdk/live}/android/live-barrage.md +28 -141
- package/resource/doc/livekit/{live → core-sdk/live}/android/live-base-beauty.md +20 -112
- package/resource/doc/livekit/{live → core-sdk/live}/android/live-co-guest-interaction.md +59 -193
- package/resource/doc/livekit/{live → core-sdk/live}/android/live-gift.md +75 -455
- package/resource/doc/livekit/{live → core-sdk/live}/android/live-host-interaction.md +94 -344
- package/resource/doc/livekit/{live → core-sdk/live}/android/live-integration.md +107 -515
- package/resource/doc/livekit/{live → core-sdk/live}/android/live-live-list.md +33 -173
- package/resource/doc/livekit/{live → core-sdk/live}/flutter/live-audience-list.md +14 -93
- package/resource/doc/livekit/{live → core-sdk/live}/flutter/live-audio-effect.md +34 -179
- package/resource/doc/livekit/{live → core-sdk/live}/flutter/live-barrage.md +19 -107
- package/resource/doc/livekit/{live → core-sdk/live}/flutter/live-base-beauty.md +24 -166
- package/resource/doc/livekit/{live → core-sdk/live}/flutter/live-co-guest-interaction.md +56 -163
- package/resource/doc/livekit/{live → core-sdk/live}/flutter/live-gift.md +69 -443
- package/resource/doc/livekit/{live → core-sdk/live}/flutter/live-host-interaction.md +117 -364
- package/resource/doc/livekit/{live → core-sdk/live}/flutter/live-integration.md +107 -492
- package/resource/doc/livekit/{live → core-sdk/live}/flutter/live-live-list.md +23 -165
- package/resource/doc/livekit/{live → core-sdk/live}/ios/live-audience-list.md +35 -111
- package/resource/doc/livekit/{live → core-sdk/live}/ios/live-audio-effect.md +35 -193
- package/resource/doc/livekit/{live → core-sdk/live}/ios/live-barrage.md +31 -144
- package/resource/doc/livekit/{live → core-sdk/live}/ios/live-base-beauty.md +24 -116
- package/resource/doc/livekit/{live → core-sdk/live}/ios/live-co-guest-interaction.md +37 -171
- package/resource/doc/livekit/{live → core-sdk/live}/ios/live-gift.md +79 -459
- package/resource/doc/livekit/{live → core-sdk/live}/ios/live-host-interaction.md +69 -320
- package/resource/doc/livekit/{live → core-sdk/live}/ios/live-integration.md +85 -502
- package/resource/doc/livekit/{live → core-sdk/live}/ios/live-live-list.md +32 -169
- package/resource/doc/livekit/core-sdk/voice/android/voice-audience-list.md +263 -0
- package/resource/doc/livekit/core-sdk/voice/android/voice-audio-effect.md +222 -0
- package/resource/doc/livekit/core-sdk/voice/android/voice-barrage.md +452 -0
- package/resource/doc/livekit/core-sdk/voice/android/voice-co-guest-interaction.md +536 -0
- package/resource/doc/livekit/core-sdk/voice/android/voice-gift.md +442 -0
- package/resource/doc/livekit/core-sdk/voice/android/voice-host-interaction.md +489 -0
- package/resource/doc/livekit/core-sdk/voice/android/voice-integration.md +574 -0
- package/resource/doc/livekit/core-sdk/voice/android/voice-room-list.md +435 -0
- package/resource/doc/livekit/core-sdk/voice/flutter/voice-co-guest-interaction.md +516 -0
- package/resource/doc/livekit/core-sdk/voice/flutter/voice-integration.md +576 -0
- package/resource/doc/livekit/core-sdk/voice/ios/voice-audience-list.md +263 -0
- package/resource/doc/livekit/core-sdk/voice/ios/voice-audio-effect.md +212 -0
- package/resource/doc/livekit/core-sdk/voice/ios/voice-barrage.md +404 -0
- package/resource/doc/livekit/core-sdk/voice/ios/voice-co-guest-interaction.md +499 -0
- package/resource/doc/livekit/core-sdk/voice/ios/voice-gift.md +403 -0
- package/resource/doc/livekit/core-sdk/voice/ios/voice-host-interaction.md +552 -0
- package/resource/doc/livekit/core-sdk/voice/ios/voice-integration.md +514 -0
- package/resource/doc/livekit/core-sdk/voice/ios/voice-room-list.md +348 -0
- package/resource/doc/livekit/faq/common/{error_code.md → error-code.md} +2 -2
- package/resource/doc/livekit/preset/live/vue/api-reference/index.md +780 -0
- package/resource/doc/livekit/preset/live/vue/components/barrage.md +291 -0
- package/resource/doc/livekit/{live → preset/live}/vue/components/co-guest-panel.md +10 -49
- package/resource/doc/livekit/{live → preset/live}/vue/components/live-audience-list.md +26 -144
- package/resource/doc/livekit/{live → preset/live}/vue/components/live-scene-panel.md +12 -75
- package/resource/doc/livekit/{live → preset/live}/vue/components/live-view.md +36 -227
- package/resource/doc/livekit/preset/live/vue/components/stream-mixer.md +215 -0
- package/resource/doc/livekit/preset/live/vue/faq.md +1 -0
- package/resource/doc/livekit/preset/live/vue/live-list-integration.md +241 -0
- package/resource/doc/livekit/preset/live/vue/live-player-desk-integration.md +299 -0
- package/resource/doc/livekit/preset/live/vue/live-player-h5-integration.md +300 -0
- package/resource/doc/livekit/preset/live/vue/live-pusher-integration.md +743 -0
- package/resource/doc/roomkit/vue/faq.md +1 -0
- package/resource/doc/roomkit/vue/features/call-user-to-room.md +17 -53
- package/resource/doc/roomkit/vue/features/device-detection.md +30 -48
- package/resource/doc/roomkit/vue/features/device-state.md +24 -44
- package/resource/doc/roomkit/vue/features/free-beauty-panel.md +13 -36
- package/resource/doc/roomkit/vue/features/room-chat.md +31 -89
- package/resource/doc/roomkit/vue/features/room-participant-state.md +28 -50
- package/resource/doc/roomkit/vue/features/room-state.md +25 -34
- package/resource/doc/roomkit/vue/features/room-view.md +30 -125
- package/resource/doc/roomkit/vue/features/schedule-room.md +9 -40
- package/resource/doc/roomkit/vue/features/screen-share.md +22 -90
- package/resource/doc/roomkit/vue/features/virtual-background.md +13 -29
- package/resource/doc/roomkit/vue/integration.md +173 -337
- package/resource/doc/rtcengine/faq/common/error_code.md +1 -0
- package/resource/doc/rtcengine/faq/web/web.md +14 -24
- package/resource/doc/rtcengine/web/api.md +1 -3
- package/resource/doc/rtcengine/web/how_to_integrated_web_sdk.md +3 -10
- package/resource/doc/rtcengine/web/how_to_run_web_sdk_demo.md +1 -5
- package/resource/doc/rtcengine/web/plugin/20-advanced-customized-capture-rendering.md +1 -2
- package/resource/doc/rtcengine/web/plugin/21-advanced-auto-play-policy.md +2 -4
- package/resource/doc/rtcengine/web/plugin/23-advanced-support-detection.md +3 -5
- package/resource/doc/rtcengine/web/plugin/24-advanced-network-quality.md +1 -7
- package/resource/doc/rtcengine/web/plugin/25-advanced-device-change.md +0 -2
- package/resource/doc/rtcengine/web/plugin/26-advanced-publish-cdn-stream.md +4 -8
- package/resource/doc/rtcengine/web/plugin/27-advanced-small-stream.md +11 -11
- package/resource/doc/rtcengine/web/plugin/28-advanced-beauty.md +12 -88
- package/resource/doc/rtcengine/web/plugin/31-advanced-plugins-overview.md +5 -5
- package/resource/doc/rtcengine/web/plugin/34-advanced-proxy.md +30 -37
- package/resource/doc/rtcengine/web/plugin/36-advanced-virtual-background.md +13 -90
- package/resource/doc/rtcengine/web/plugin/37-advanced-voice-changer.md +1 -2
- package/resource/doc/rtcengine/web/plugin/39-advanced-video-decoder.md +1 -2
- package/resource/doc/rtcengine/web/plugin/40-advanced-video-mixer.md +19 -19
- package/resource/doc/rtcengine/web/plugin/41-advanced-small-stream-auto-switcher.md +1 -1
- package/resource/doc/rtcengine/web/plugin/42-advanced-realtime-transcriber.md +4 -5
- package/resource/doc/rtcengine/web/plugin/43-advanced-face-detection.md +3 -3
- package/resource/doc/trtc/C++/ITRTCCloud.md +686 -2835
- package/resource/doc/trtc/C++/ITRTCStatistics.md +53 -308
- package/resource/doc/trtc/C++/ITXAudioEffectManager.md +202 -1022
- package/resource/doc/trtc/C++/ITXDeviceManager.md +126 -767
- package/resource/doc/trtc/C++/TRTCCloudCallback.md +579 -2147
- package/resource/doc/trtc/C++/TRTCTypeDef.md +703 -3378
- package/resource/doc/trtc/C++/TXLiteAVCode.md +116 -908
- package/resource/doc/trtc/android/TRTCCloud.md +606 -2573
- package/resource/doc/trtc/android/TRTCCloudDef.md +752 -3640
- package/resource/doc/trtc/android/TRTCCloudListener.md +581 -2008
- package/resource/doc/trtc/android/TRTCStatistics.md +48 -278
- package/resource/doc/trtc/android/TXAudioEffectManager.md +202 -1022
- package/resource/doc/trtc/android/TXBeautyManager.md +127 -704
- package/resource/doc/trtc/android/TXDeviceManager.md +51 -318
- package/resource/doc/trtc/android/TXLiteAVCode.md +114 -892
- package/resource/doc/trtc/iOS/TRTCCloud.md +694 -2904
- package/resource/doc/trtc/iOS/TRTCCloudDef.md +726 -3498
- package/resource/doc/trtc/iOS/TRTCCloudDelegate.md +543 -2028
- package/resource/doc/trtc/iOS/TRTCStatistics.md +48 -278
- package/resource/doc/trtc/iOS/TXAudioEffectManager.md +174 -877
- package/resource/doc/trtc/iOS/TXBeautyManager.md +128 -710
- package/resource/doc/trtc/iOS/TXDeviceManager.md +129 -772
- package/resource/doc/trtc/iOS/TXLiteAVCode.md +117 -915
- package/server.js +1 -5
- package/server.js.map +1 -1
- package/tools/call/get_callkit_api.js +32 -0
- package/tools/call/get_callkit_api.js.map +1 -0
- package/tools/call/get_native_call_uikit_integration.js +34 -0
- package/tools/call/get_native_call_uikit_integration.js.map +1 -0
- package/tools/call/{get-web-call-integration.js → get_web_call_uikit_integration.js} +13 -8
- package/tools/call/get_web_call_uikit_integration.js.map +1 -0
- package/tools/chat/get_native_chat_uikit_feature_detail.js +34 -0
- package/tools/chat/get_native_chat_uikit_feature_detail.js.map +1 -0
- package/tools/chat/get_native_chat_uikit_integration.js +45 -0
- package/tools/chat/get_native_chat_uikit_integration.js.map +1 -0
- package/tools/chat/get_web_chat_uikit_component_detail.js +34 -0
- package/tools/chat/get_web_chat_uikit_component_detail.js.map +1 -0
- package/tools/chat/get_web_chat_uikit_integration.js +45 -0
- package/tools/chat/get_web_chat_uikit_integration.js.map +1 -0
- package/tools/common/get_faq.js +265 -0
- package/tools/common/get_faq.js.map +1 -0
- package/tools/common/{get-usersig.js → get_usersig.js} +6 -3
- package/tools/common/get_usersig.js.map +1 -0
- package/tools/common/present_framework_choice.js +63 -0
- package/tools/common/present_framework_choice.js.map +1 -0
- package/tools/definitions/get_callkit_api_def.js +29 -0
- package/tools/definitions/get_callkit_api_def.js.map +1 -0
- package/tools/definitions/get_faq_def.js +17 -18
- package/tools/definitions/get_faq_def.js.map +1 -1
- package/tools/definitions/get_native_call_uikit_integration_def.js +15 -18
- package/tools/definitions/get_native_call_uikit_integration_def.js.map +1 -1
- package/tools/definitions/get_native_chat_uikit_feature_detail_def.js +31 -0
- package/tools/definitions/get_native_chat_uikit_feature_detail_def.js.map +1 -0
- package/tools/definitions/get_native_chat_uikit_integration_def.js +16 -19
- package/tools/definitions/get_native_chat_uikit_integration_def.js.map +1 -1
- package/tools/definitions/get_native_livekit_core_features_def.js +34 -0
- package/tools/definitions/get_native_livekit_core_features_def.js.map +1 -0
- package/tools/definitions/get_native_livekit_core_integration_def.js +34 -0
- package/tools/definitions/get_native_livekit_core_integration_def.js.map +1 -0
- package/tools/definitions/get_native_trtc_sdk_docs_def.js +32 -0
- package/tools/definitions/get_native_trtc_sdk_docs_def.js.map +1 -0
- package/tools/definitions/get_usersig_def.js +17 -22
- package/tools/definitions/get_usersig_def.js.map +1 -1
- package/tools/definitions/get_web_call_uikit_integration_def.js +15 -7
- package/tools/definitions/get_web_call_uikit_integration_def.js.map +1 -1
- package/tools/definitions/get_web_chat_uikit_component_detail_def.js +17 -49
- package/tools/definitions/get_web_chat_uikit_component_detail_def.js.map +1 -1
- package/tools/definitions/get_web_chat_uikit_integration_def.js +16 -19
- package/tools/definitions/get_web_chat_uikit_integration_def.js.map +1 -1
- package/tools/definitions/get_web_live_uikit_integration_def.js +15 -18
- package/tools/definitions/get_web_live_uikit_integration_def.js.map +1 -1
- package/tools/definitions/get_web_livekit_api_def.js +30 -0
- package/tools/definitions/get_web_livekit_api_def.js.map +1 -0
- package/tools/definitions/get_web_livekit_component_detail_def.js +32 -0
- package/tools/definitions/get_web_livekit_component_detail_def.js.map +1 -0
- package/tools/definitions/get_web_room_uikit_integration_def.js +15 -30
- package/tools/definitions/get_web_room_uikit_integration_def.js.map +1 -1
- package/tools/definitions/get_web_roomkit_feature_detail_def.js +31 -0
- package/tools/definitions/get_web_roomkit_feature_detail_def.js.map +1 -0
- package/tools/definitions/get_web_trtc_sdk_api_def.js +27 -0
- package/tools/definitions/get_web_trtc_sdk_api_def.js.map +1 -0
- package/tools/definitions/get_web_trtc_sdk_integration_def.js +27 -0
- package/tools/definitions/get_web_trtc_sdk_integration_def.js.map +1 -0
- package/tools/definitions/get_web_trtc_sdk_plugin_def.js +27 -0
- package/tools/definitions/get_web_trtc_sdk_plugin_def.js.map +1 -0
- package/tools/definitions/present_framework_choice_def.js +24 -12
- package/tools/definitions/present_framework_choice_def.js.map +1 -1
- package/tools/index.js +47 -59
- package/tools/index.js.map +1 -1
- package/tools/live/get_native_livekit_core_features.js +65 -0
- package/tools/live/get_native_livekit_core_features.js.map +1 -0
- package/tools/live/get_native_livekit_core_integration.js +59 -0
- package/tools/live/get_native_livekit_core_integration.js.map +1 -0
- package/tools/live/get_web_live_uikit_integration.js +48 -0
- package/tools/live/get_web_live_uikit_integration.js.map +1 -0
- package/tools/live/get_web_livekit_api.js +32 -0
- package/tools/live/get_web_livekit_api.js.map +1 -0
- package/tools/live/get_web_livekit_component_detail.js +34 -0
- package/tools/live/get_web_livekit_component_detail.js.map +1 -0
- package/tools/room/{get-web-room-integration.js → get_web_room_uikit_integration.js} +13 -14
- package/tools/room/get_web_room_uikit_integration.js.map +1 -0
- package/tools/room/{get-web-room-feature-detail.js → get_web_roomkit_feature_detail.js} +30 -31
- package/tools/room/get_web_roomkit_feature_detail.js.map +1 -0
- package/tools/rtcengine/get_web_trtc_sdk_api.js +31 -0
- package/tools/rtcengine/get_web_trtc_sdk_api.js.map +1 -0
- package/tools/rtcengine/get_web_trtc_sdk_integration.js +31 -0
- package/tools/rtcengine/get_web_trtc_sdk_integration.js.map +1 -0
- package/tools/rtcengine/get_web_trtc_sdk_plugin.js +31 -0
- package/tools/rtcengine/get_web_trtc_sdk_plugin.js.map +1 -0
- package/tools/trtc/get_native_trtc_sdk_docs.js +73 -0
- package/tools/trtc/get_native_trtc_sdk_docs.js.map +1 -0
- package/utils/generate-structured-result.js +61 -17
- package/utils/generate-structured-result.js.map +1 -1
- package/utils/report-cls-client.js +12 -1
- package/utils/report-cls-client.js.map +1 -1
- package/utils/report-es-client.js +2 -2
- package/resource/doc/chatuikit/android/integration.md +0 -287
- package/resource/doc/chatuikit/faq/android_sdk/client-api.md +0 -1371
- package/resource/doc/chatuikit/faq/flutter_sdk/client-api.md +0 -932
- package/resource/doc/chatuikit/faq/ios_sdk/client-api.md +0 -1119
- package/resource/doc/chatuikit/flutter/workflow.md +0 -941
- package/resource/doc/chatuikit/iOS/workflow.md +0 -0
- package/resource/doc/chatuikit/react/components/conversation-list.md +0 -1017
- package/resource/doc/chatuikit/react/components/search.md +0 -745
- package/resource/doc/chatuikit/react/create-group.md +0 -23
- package/resource/doc/chatuikit/react/init.md +0 -26
- package/resource/doc/chatuikit/react/workflow.md +0 -258
- package/resource/doc/chatuikit/vue/components/contact-list.md +0 -679
- package/resource/doc/chatuikit/vue/create-group.md +0 -25
- package/resource/doc/chatuikit/vue/init.md +0 -40
- package/resource/doc/chatuikit/vue/workflow.md +0 -395
- package/resource/doc/livekit/live/android/workflow.md +0 -320
- package/resource/doc/livekit/live/flutter/workflow.md +0 -353
- package/resource/doc/livekit/live/ios/workflow.md +0 -454
- package/resource/doc/livekit/live/vue/components/barrage.md +0 -616
- package/resource/doc/livekit/live/vue/components/stream-mixer.md +0 -446
- package/resource/doc/livekit/live/vue/faq.md +0 -0
- package/resource/doc/livekit/live/vue/live-list-integration.md +0 -200
- package/resource/doc/livekit/live/vue/live-player-desk-integration.md +0 -269
- package/resource/doc/livekit/live/vue/live-player-h5-integration.md +0 -269
- package/resource/doc/livekit/live/vue/live-pusher-integration.md +0 -595
- package/resource/doc/livekit/live/vue/states/live-state.md +0 -3591
- package/resource/doc/livekit/live/vue/workflow.md +0 -218
- package/resource/doc/native_live/android/V2TXLiveCode_api_android.md +0 -312
- package/resource/doc/native_live/android/V2TXLiveDef_api_android.md +0 -430
- package/resource/doc/native_live/android/V2TXLivePlayerObserver_api_android.md +0 -679
- package/resource/doc/native_live/android/V2TXLivePlayer_api_android.md +0 -671
- package/resource/doc/native_live/android/V2TXLivePremier_api_android.md +0 -271
- package/resource/doc/native_live/android/V2TXLivePusherObserver_api_android.md +0 -849
- package/resource/doc/native_live/android/V2TXLivePusher_api_android.md +0 -1046
- package/resource/doc/native_live/flutter/V2TXLiveCode_api_flutter.md +0 -460
- package/resource/doc/native_live/flutter/V2TXLiveDef_api_flutter.md +0 -558
- package/resource/doc/native_live/flutter/V2TXLivePlayerObserver_api_flutter.md +0 -865
- package/resource/doc/native_live/flutter/V2TXLivePlayer_api_flutter.md +0 -657
- package/resource/doc/native_live/flutter/V2TXLivePremier_api_flutter.md +0 -437
- package/resource/doc/native_live/flutter/V2TXLivePusherObserver_api_flutter.md +0 -335
- package/resource/doc/native_live/flutter/V2TXLivePusher_api_flutter.md +0 -748
- package/resource/doc/native_live/iOS/V2TXLiveCode_api_iOS.md +0 -327
- package/resource/doc/native_live/iOS/V2TXLiveDef_api_iOS.md +0 -507
- package/resource/doc/native_live/iOS/V2TXLivePlayerObserver_api_iOS.md +0 -507
- package/resource/doc/native_live/iOS/V2TXLivePlayer_api_iOS.md +0 -659
- package/resource/doc/native_live/iOS/V2TXLivePremier_api_iOS.md +0 -284
- package/resource/doc/native_live/iOS/V2TXLivePusherObserver_api_iOS.md +0 -814
- package/resource/doc/native_live/iOS/V2TXLivePusher_api_iOS.md +0 -1000
- package/resource/doc/roomkit/vue/features/workflow.md +0 -553
- package/resource/doc/roomkit/vue/workflow.md +0 -487
- package/resource/doc/tuicallkit/android/integration.md +0 -286
- package/resource/doc/tuicallkit/android/workflow.md +0 -0
- package/resource/doc/tuicallkit/faq/android_sdk/call-observer-api.md +0 -784
- package/resource/doc/tuicallkit/faq/android_sdk/callkit-api.md +0 -610
- package/resource/doc/tuicallkit/faq/flutter_sdk/call-define-api.md +0 -938
- package/resource/doc/tuicallkit/faq/flutter_sdk/call-observer-api.md +0 -897
- package/resource/doc/tuicallkit/faq/flutter_sdk/callkit-api.md +0 -469
- package/resource/doc/tuicallkit/faq/ios_sdk/call-observer-api.md +0 -781
- package/resource/doc/tuicallkit/faq/ios_sdk/callkit-api.md +0 -398
- package/resource/doc/tuicallkit/flutter/workflow.md +0 -331
- package/resource/doc/tuicallkit/react/api.md +0 -1404
- package/resource/doc/tuicallkit/vue/api.md +0 -1406
- package/resource/doc/tuicallkit/vue/faq.md +0 -36
- package/tools/call/get-native-call-integration.js +0 -43
- package/tools/call/get-native-call-integration.js.map +0 -1
- package/tools/call/get-web-call-api.js +0 -27
- package/tools/call/get-web-call-api.js.map +0 -1
- package/tools/call/get-web-call-integration.js.map +0 -1
- package/tools/chat/get-native-chat-feature-detail.js +0 -30
- package/tools/chat/get-native-chat-feature-detail.js.map +0 -1
- package/tools/chat/get-native-chat-integration.js +0 -45
- package/tools/chat/get-native-chat-integration.js.map +0 -1
- package/tools/chat/get-web-chat-component-detail.js +0 -31
- package/tools/chat/get-web-chat-component-detail.js.map +0 -1
- package/tools/chat/get-web-chat-integration.js +0 -45
- package/tools/chat/get-web-chat-integration.js.map +0 -1
- package/tools/chat/get-web-chat-uikit-init.js +0 -28
- package/tools/chat/get-web-chat-uikit-init.js.map +0 -1
- package/tools/chat/get-web-create-group-doc.js +0 -28
- package/tools/chat/get-web-create-group-doc.js.map +0 -1
- package/tools/common/get-faq.js +0 -91
- package/tools/common/get-faq.js.map +0 -1
- package/tools/common/get-usersig.js.map +0 -1
- package/tools/common/present-framework-choice.js +0 -16
- package/tools/common/present-framework-choice.js.map +0 -1
- package/tools/common/record-prompt.js +0 -55
- package/tools/common/record-prompt.js.map +0 -1
- package/tools/common/record-result.js +0 -60
- package/tools/common/record-result.js.map +0 -1
- package/tools/definitions/get_native_chat_feature_detail_def.js +0 -32
- package/tools/definitions/get_native_chat_feature_detail_def.js.map +0 -1
- package/tools/definitions/get_native_live_api_def.js +0 -23
- package/tools/definitions/get_native_live_api_def.js.map +0 -1
- package/tools/definitions/get_native_live_uikit_extra_features_def.js +0 -87
- package/tools/definitions/get_native_live_uikit_extra_features_def.js.map +0 -1
- package/tools/definitions/get_native_live_uikit_integration_def.js +0 -49
- package/tools/definitions/get_native_live_uikit_integration_def.js.map +0 -1
- package/tools/definitions/get_native_live_uikit_interaction_def.js +0 -74
- package/tools/definitions/get_native_live_uikit_interaction_def.js.map +0 -1
- package/tools/definitions/get_trtc_native_api_def.js +0 -16
- package/tools/definitions/get_trtc_native_api_def.js.map +0 -1
- package/tools/definitions/get_web_call_uikit_api_def.js +0 -23
- package/tools/definitions/get_web_call_uikit_api_def.js.map +0 -1
- package/tools/definitions/get_web_chat_uikit_init_def.js +0 -23
- package/tools/definitions/get_web_chat_uikit_init_def.js.map +0 -1
- package/tools/definitions/get_web_create_group_doc_def.js +0 -18
- package/tools/definitions/get_web_create_group_doc_def.js.map +0 -1
- package/tools/definitions/get_web_live_state_detail_def.js +0 -19
- package/tools/definitions/get_web_live_state_detail_def.js.map +0 -1
- package/tools/definitions/get_web_live_uikit_component_detail_def.js +0 -27
- package/tools/definitions/get_web_live_uikit_component_detail_def.js.map +0 -1
- package/tools/definitions/get_web_room_feature_detail_def.js +0 -95
- package/tools/definitions/get_web_room_feature_detail_def.js.map +0 -1
- package/tools/definitions/get_web_room_state_detail_def.js +0 -19
- package/tools/definitions/get_web_room_state_detail_def.js.map +0 -1
- package/tools/definitions/record_prompt_def.js +0 -53
- package/tools/definitions/record_prompt_def.js.map +0 -1
- package/tools/definitions/record_result_def.js +0 -30
- package/tools/definitions/record_result_def.js.map +0 -1
- package/tools/live/get-native-live-uikit-integration.js +0 -101
- package/tools/live/get-native-live-uikit-integration.js.map +0 -1
- package/tools/live/get-web-live-component-detail.js +0 -31
- package/tools/live/get-web-live-component-detail.js.map +0 -1
- package/tools/live/get-web-live-state-detail.js +0 -31
- package/tools/live/get-web-live-state-detail.js.map +0 -1
- package/tools/live/get-web-live-uikit-integration.js +0 -52
- package/tools/live/get-web-live-uikit-integration.js.map +0 -1
- package/tools/live/get_native_live_uikit_extra_features.js +0 -105
- package/tools/live/get_native_live_uikit_extra_features.js.map +0 -1
- package/tools/live/get_native_live_uikit_interaction.js +0 -101
- package/tools/live/get_native_live_uikit_interaction.js.map +0 -1
- package/tools/native_live/get-native-live-api.js +0 -31
- package/tools/native_live/get-native-live-api.js.map +0 -1
- package/tools/room/get-web-room-feature-detail.js.map +0 -1
- package/tools/room/get-web-room-integration.js.map +0 -1
- package/tools/rtcengine/get-rtcengine-web-sdk-integration.js +0 -28
- package/tools/rtcengine/get-rtcengine-web-sdk-integration.js.map +0 -1
- package/tools/rtcengine/get-trtc-sdk-faq.js +0 -32
- package/tools/rtcengine/get-trtc-sdk-faq.js.map +0 -1
- package/tools/rtcengine/get-trtc-web-sdk-api.js +0 -28
- package/tools/rtcengine/get-trtc-web-sdk-api.js.map +0 -1
- package/tools/rtcengine/get-trtc-web-sdk-faq.js +0 -30
- package/tools/rtcengine/get-trtc-web-sdk-faq.js.map +0 -1
- package/tools/rtcengine/get-trtc-web-sdk-integration.js +0 -29
- package/tools/rtcengine/get-trtc-web-sdk-integration.js.map +0 -1
- package/tools/rtcengine/get-trtc-web-sdk-plugin.js +0 -45
- package/tools/rtcengine/get-trtc-web-sdk-plugin.js.map +0 -1
- package/tools/trtc/get-trtc-native-api.js +0 -31
- package/tools/trtc/get-trtc-native-api.js.map +0 -1
- package/utils/handle-component-name.js +0 -33
- package/utils/handle-component-name.js.map +0 -1
- /package/resource/doc/{chatuikit/android/workflow.md → callkit/core-sdk/.gitkeep} +0 -0
- /package/resource/doc/{tuicallkit/faq/common/error_code.md → callkit/faq/common/error-code.md} +0 -0
- /package/resource/doc/{tuicallkit/react/faq.md → callkit/faq/web-faq.md} +0 -0
- /package/resource/doc/{chatuikit → chatkit}/faq/common/server_error_code.md +0 -0
- /package/resource/doc/{chatuikit → chatkit}/faq/web_sdk/error_code.md +0 -0
- /package/resource/doc/{chatuikit → chatkit}/flutter/faq.md +0 -0
- /package/resource/doc/{chatuikit → chatkit}/react/faq.md +0 -0
- /package/resource/doc/roomkit/faq/common/{error_code.md → error-code.md} +0 -0
|
@@ -0,0 +1,499 @@
|
|
|
1
|
+
**AtomicXCore** provides the [CoGuestStore](https://tencent-rtc.github.io/TUIKit_iOS/documentation/atomicxcore/cogueststore) and [LiveSeatStore](https://tencent-rtc.github.io/TUIKit_iOS/documentation/atomicxcore/liveseatstore) modules, which handle the complete workflow for audience mic-link requests in live streaming scenarios. You don’t need to worry about complex state synchronization or signaling interactions—simply call a few straightforward methods to add robust audio/video interaction between hosts and viewers in your live broadcast. This guide walks you through how to quickly implement voice mic-link functionality in your iOS app using `CoGuestStore` and `LiveSeatStore`.
|
|
2
|
+
|
|
3
|
+
## Core Scenarios
|
|
4
|
+
|
|
5
|
+
`CoGuestStore` and `LiveSeatStore` support the following core live interaction scenarios:
|
|
6
|
+
- **Audience Request to Join Mic**: Viewers can actively request to join the mic; the host can approve or reject these requests.
|
|
7
|
+
|
|
8
|
+
- **Host Invites Audience to Mic**: The host can proactively invite any viewer in the live room to join the mic.
|
|
9
|
+
|
|
10
|
+
- **Host Manages Mic Seats**: The host can manage users on mic seats, including removing users, muting, and locking seats.
|
|
11
|
+
|
|
12
|
+
## Implementation
|
|
13
|
+
|
|
14
|
+
### Step 1: Component Integration
|
|
15
|
+
|
|
16
|
+
Refer to the Quick Start to integrate **AtomicXCore**.
|
|
17
|
+
|
|
18
|
+
### Step 2: Implement Audience Mic-Link Request
|
|
19
|
+
|
|
20
|
+
#### Audience Side Implementation
|
|
21
|
+
|
|
22
|
+
As an audience member, your main tasks are **initiating a request, handling the response**, and **leaving the mic proactively**.
|
|
23
|
+
1. **Initiate Mic-Link Request**
|
|
24
|
+
|
|
25
|
+
When the user taps the "Request Mic-Link" button in the UI, call the `applyForSeat` method.
|
|
26
|
+
|
|
27
|
+
``` swift
|
|
28
|
+
import AtomicXCore
|
|
29
|
+
|
|
30
|
+
let liveId = "Room ID"
|
|
31
|
+
var guestStore: CoGuestStore {
|
|
32
|
+
CoGuestStore.create(liveID: liveID)
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// User taps "Request Mic-Link"
|
|
36
|
+
func requestToConnect() {
|
|
37
|
+
// timeout: Request timeout, e.g., 30 seconds
|
|
38
|
+
guestStore.applyForSeat(timeout: 30.0, extraInfo: nil) { result in
|
|
39
|
+
switch result {
|
|
40
|
+
case .success():
|
|
41
|
+
print("Mic-link request sent, waiting for host response...")
|
|
42
|
+
case .failure(let error):
|
|
43
|
+
print("Failed to send request: \(error.message)")
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
```
|
|
48
|
+
2. **Listen for Host Response**
|
|
49
|
+
|
|
50
|
+
Subscribe to `guestEventPublisher` to receive the host’s response.
|
|
51
|
+
|
|
52
|
+
``` swift
|
|
53
|
+
import AtomicXCore
|
|
54
|
+
import Combine
|
|
55
|
+
|
|
56
|
+
// Subscribe to events during view controller initialization
|
|
57
|
+
func subscribeGuestEvents() {
|
|
58
|
+
guestStore.guestEventPublisher
|
|
59
|
+
.sink { [weak self] event in
|
|
60
|
+
if case let .onGuestApplicationResponded(isAccept, hostUser) = event {
|
|
61
|
+
if isAccept {
|
|
62
|
+
print("Host \(hostUser.userName) accepted your request, preparing to join mic")
|
|
63
|
+
// 1. Open microphone
|
|
64
|
+
DeviceStore.shared.openLocalMicrophone(completion: nil)
|
|
65
|
+
// 2. Update UI, e.g., disable request button, show "on mic" status
|
|
66
|
+
} else {
|
|
67
|
+
print("Host \(hostUser.userName) rejected your request")
|
|
68
|
+
// Show popup to inform user of rejection
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
.store(in: &cancellables) // Manage subscription lifecycle
|
|
73
|
+
}
|
|
74
|
+
```
|
|
75
|
+
3. **Leave Mic Proactively**
|
|
76
|
+
|
|
77
|
+
When an audience member on mic wants to end the interaction, call `disConnect` to return to regular audience status.
|
|
78
|
+
|
|
79
|
+
``` swift
|
|
80
|
+
// User taps "Leave Mic" button
|
|
81
|
+
func leaveSeat() {
|
|
82
|
+
guestStore.disConnect { result in
|
|
83
|
+
switch result {
|
|
84
|
+
case .success():
|
|
85
|
+
print("Successfully left mic")
|
|
86
|
+
case .failure(let error):
|
|
87
|
+
print("Failed to leave mic: \(error.message)")
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
```
|
|
92
|
+
4. **(Optional) Cancel Request**
|
|
93
|
+
|
|
94
|
+
If the audience member wants to withdraw the request before the host responds, call `cancelApplication`.
|
|
95
|
+
|
|
96
|
+
``` swift
|
|
97
|
+
// User taps "Cancel Request" while waiting
|
|
98
|
+
func cancelRequest() {
|
|
99
|
+
guestStore.cancelApplication { result in
|
|
100
|
+
switch result {
|
|
101
|
+
case .success():
|
|
102
|
+
print("Request cancelled")
|
|
103
|
+
case .failure(let error):
|
|
104
|
+
print("Failed to cancel request: \(error.message)")
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
#### Host Side Implementation
|
|
111
|
+
|
|
112
|
+
As the host, your main tasks are **receiving requests, displaying the request list**, and **handling requests**.
|
|
113
|
+
1. **Listen for New Mic-Link Requests**
|
|
114
|
+
|
|
115
|
+
Subscribe to `hostEventPublisher` to be notified immediately when a new audience request arrives.
|
|
116
|
+
|
|
117
|
+
``` swift
|
|
118
|
+
import AtomicXCore
|
|
119
|
+
import Combine
|
|
120
|
+
|
|
121
|
+
let liveId = "Room ID"
|
|
122
|
+
var guestStore: CoGuestStore {
|
|
123
|
+
CoGuestStore.create(liveID: liveID)
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
// Subscribe to host events
|
|
127
|
+
guestStore.hostEventPublisher
|
|
128
|
+
.sink { [weak self] event in
|
|
129
|
+
if case let .onGuestApplicationReceived(guestUser) = event {
|
|
130
|
+
print("Received mic-link request from audience \(guestUser.userName)")
|
|
131
|
+
// Update UI, e.g., show a red dot on the "Request List" button
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
.store(in: &cancellables)
|
|
135
|
+
```
|
|
136
|
+
2. **Display Request List**
|
|
137
|
+
|
|
138
|
+
The `CoGuestStore` state maintains the current list of applicants in real time. Subscribe to it to refresh your UI.
|
|
139
|
+
|
|
140
|
+
``` swift
|
|
141
|
+
import AtomicXCore
|
|
142
|
+
import Combine
|
|
143
|
+
|
|
144
|
+
// Subscribe to state changes
|
|
145
|
+
guestStore.state
|
|
146
|
+
.subscribe(StatePublisherSelector(keyPath: \CoGuestState.applicants)) // Only care about applicant list changes
|
|
147
|
+
.removeDuplicates()
|
|
148
|
+
.sink { applicants in
|
|
149
|
+
print("Current number of applicants: \(applicants.count)")
|
|
150
|
+
// Refresh your "Applicant List" UI here
|
|
151
|
+
// self.applicantListView.update(with: applicants)
|
|
152
|
+
}
|
|
153
|
+
.store(in: &cancellables)
|
|
154
|
+
```
|
|
155
|
+
3. **Handle Mic-Link Requests**
|
|
156
|
+
|
|
157
|
+
When you select an audience member from the list and tap "Accept" or "Reject", call the corresponding method.
|
|
158
|
+
|
|
159
|
+
``` swift
|
|
160
|
+
// Host taps "Accept" button, passing applicant's userID
|
|
161
|
+
func accept(userId: String) {
|
|
162
|
+
guestStore.acceptApplication(userID: userId) { result in
|
|
163
|
+
if case .success = result {
|
|
164
|
+
print("Accepted \(userId)'s request, they are joining the mic")
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
// Host taps "Reject" button
|
|
170
|
+
func reject(userId: String) {
|
|
171
|
+
guestStore.rejectApplication(userID: userId) { result in
|
|
172
|
+
if case .success = result {
|
|
173
|
+
print("Rejected \(userId)'s request")
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
### Step 3: Implement Host-Initiated Mic-Link Invitation
|
|
180
|
+
|
|
181
|
+
#### Host Side Implementation
|
|
182
|
+
1. **Invite Audience to Mic**
|
|
183
|
+
|
|
184
|
+
When the host selects a viewer from the audience list and taps "Invite to Mic", call the `inviteToSeat` method.
|
|
185
|
+
|
|
186
|
+
``` swift
|
|
187
|
+
// Host selects audience and initiates invitation
|
|
188
|
+
func invite(userId: String) {
|
|
189
|
+
// timeout: Invitation timeout
|
|
190
|
+
guestStore.inviteToSeat(userID: userId, timeout: 30.0, extraInfo: nil) { result in
|
|
191
|
+
if case .success = result {
|
|
192
|
+
print("Invitation sent to \(userId), waiting for response...")
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
```
|
|
197
|
+
2. **Listen for Audience Response**
|
|
198
|
+
|
|
199
|
+
Listen for the `onHostInvitationResponded` event via `hostEventPublisher`.
|
|
200
|
+
|
|
201
|
+
``` swift
|
|
202
|
+
// Add to hostEventPublisher subscription
|
|
203
|
+
if case let .onHostInvitationResponded(isAccept, guestUser) = event {
|
|
204
|
+
if isAccept {
|
|
205
|
+
print("Audience \(guestUser.userName) accepted your invitation")
|
|
206
|
+
} else {
|
|
207
|
+
print("Audience \(guestUser.userName) rejected your invitation")
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
#### Audience Side Implementation
|
|
213
|
+
1. **Receive Host Invitation**
|
|
214
|
+
|
|
215
|
+
Listen for the `onHostInvitationReceived` event via `guestEventPublisher`.
|
|
216
|
+
|
|
217
|
+
``` swift
|
|
218
|
+
// Add to guestEventPublisher subscription
|
|
219
|
+
if case let .onHostInvitationReceived(hostUser) = event {
|
|
220
|
+
print("Received mic-link invitation from host \(hostUser.userName)")
|
|
221
|
+
// Show a dialog for the user to choose "Accept" or "Reject"
|
|
222
|
+
// self.showInvitationDialog(from: hostUser)
|
|
223
|
+
}
|
|
224
|
+
```
|
|
225
|
+
2. **Respond to Invitation**
|
|
226
|
+
|
|
227
|
+
When the user makes a choice in the dialog, call the corresponding method.
|
|
228
|
+
|
|
229
|
+
``` swift
|
|
230
|
+
let inviterId = "Host ID who sent the invitation" // Get from onHostInvitationReceived event
|
|
231
|
+
|
|
232
|
+
// User taps "Accept"
|
|
233
|
+
func accept() {
|
|
234
|
+
guestStore.acceptInvitation(inviterID: inviterId) { result in
|
|
235
|
+
if case .success = result {
|
|
236
|
+
// 2. Open microphone
|
|
237
|
+
DeviceStore.shared.openLocalMicrophone(completion: nil)
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
// User taps "Reject"
|
|
243
|
+
func reject() {
|
|
244
|
+
guestStore.rejectInvitation(inviterID: inviterId) { result in
|
|
245
|
+
// ...
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
## Advanced Features
|
|
251
|
+
|
|
252
|
+
Once a user is on mic, the host may need to manage mic seats. The following features are primarily provided by `LiveSeatStore`, which functions with `CoGuestStore`.
|
|
253
|
+
|
|
254
|
+
### On-Mic Users Control Their Own Microphone
|
|
255
|
+
|
|
256
|
+
On-mic users (including the host) can control their own microphone mute status via the `LiveSeatStore` interface.
|
|
257
|
+
|
|
258
|
+
#### Implementation:
|
|
259
|
+
1. **Mute:** Call `muteMicrophone()`. This is a one-way request with no callback.
|
|
260
|
+
|
|
261
|
+
2. **Unmute:** Call `unmuteMicrophone(completion:)`.
|
|
262
|
+
|
|
263
|
+
#### Example Code:
|
|
264
|
+
``` swift
|
|
265
|
+
let seatStore = LiveSeatStore.create(liveID: liveId)
|
|
266
|
+
|
|
267
|
+
seatStore.muteMicrophone() // Mute
|
|
268
|
+
|
|
269
|
+
seatStore.unmuteMicrophone(completion: nil) // Unmute
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
#### unmuteMicrophone Parameters:
|
|
273
|
+
| **Parameter** | **Type** | **Description** |
|
|
274
|
+
| --- | --- | --- |
|
|
275
|
+
| `completion` | `CompletionClosure?` | Callback after the operation completes. |
|
|
276
|
+
|
|
277
|
+
### Host Remotely Controls On-Mic User’s Microphone
|
|
278
|
+
|
|
279
|
+
The host can perform "force mute" or "invite to unmute" operations on other on-mic users.
|
|
280
|
+
|
|
281
|
+
#### Implementation:
|
|
282
|
+
1. **Force Mute (Lock):** The host calls `closeRemoteMicrophone` to forcibly mute the target user's microphone and lock their mic control. The muted user will receive the `onLocalMicrophoneClosedByAdmin` event via `liveSeatEventPublisher`, and their local "Open Microphone" button should become disabled.
|
|
283
|
+
|
|
284
|
+
2. **Invite to Unmute (Unlock):** The host calls `openRemoteMicrophone`—this does not forcibly open the user's mic, but unlocks their mic control, allowing them to unmute themselves. The target user receives the `onLocalMicrophoneOpenedByAdmin` event, their "Open Microphone" button should become enabled, but they remain muted until they unmute themselves.
|
|
285
|
+
|
|
286
|
+
3. **User Unmutes Themselves:** After receiving the unlock notification, the user must actively call `LiveSeatStore`'s `unmuteMicrophone()` to actually unmute and be heard in the room.
|
|
287
|
+
|
|
288
|
+
#### Example Code:
|
|
289
|
+
|
|
290
|
+
##### Host Side:
|
|
291
|
+
``` swift
|
|
292
|
+
let targetUserId = "userD"
|
|
293
|
+
|
|
294
|
+
// 1. Force mute and lock userD
|
|
295
|
+
seatStore.closeRemoteMicrophone(userID: targetUserId) { result in
|
|
296
|
+
if case .success = result {
|
|
297
|
+
print("\(targetUserId) has been muted and locked")
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
// 2. Unlock userD’s microphone control (userD remains muted)
|
|
302
|
+
seatStore.openRemoteMicrophone(userID: targetUserId, policy: .unlockOnly) { result in
|
|
303
|
+
if case .success = result {
|
|
304
|
+
print("Invited \(targetUserId) to open microphone (unlocked)")
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
```
|
|
308
|
+
|
|
309
|
+
##### Audience Side:
|
|
310
|
+
``` swift
|
|
311
|
+
// userD listens for host actions
|
|
312
|
+
seatStore.liveSeatEventPublisher
|
|
313
|
+
.sink { event in
|
|
314
|
+
switch event {
|
|
315
|
+
case .onLocalMicrophoneClosedByAdmin:
|
|
316
|
+
print("Muted by host")
|
|
317
|
+
// self.muteButton.isEnabled = false
|
|
318
|
+
case .onLocalMicrophoneOpenedByAdmin(policy: _):
|
|
319
|
+
print("Host unlocked mute control")
|
|
320
|
+
// self.muteButton.isEnabled = true
|
|
321
|
+
// self.muteButton.setTitle("Open Microphone")
|
|
322
|
+
default:
|
|
323
|
+
break
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
.store(in: &cancellables)
|
|
327
|
+
```
|
|
328
|
+
|
|
329
|
+
#### closeRemoteMicrophone Parameters:
|
|
330
|
+
| **Parameter** | **Type** | **Description** |
|
|
331
|
+
| --- | --- | --- |
|
|
332
|
+
| `userID` | `String` | The userID of the target user. |
|
|
333
|
+
| `completion` | `CompletionClosure?` | Callback after the request completes. |
|
|
334
|
+
|
|
335
|
+
#### openRemoteMicrophone Parameters:
|
|
336
|
+
| **Parameter** | **Type** | **Description** |
|
|
337
|
+
| --- | --- | --- |
|
|
338
|
+
| `userID` | `String` | The userID of the target user. |
|
|
339
|
+
| `completion` | `CompletionClosure?` | Callback after the request completes. |
|
|
340
|
+
|
|
341
|
+
### Host Removes On-Mic User from the Seat
|
|
342
|
+
|
|
343
|
+
#### Implementation:
|
|
344
|
+
1. **Remove User from Mic:** The host can call `kickUserOutOfSeat` to forcibly remove a specified user from the mic seat.
|
|
345
|
+
|
|
346
|
+
2. **Listen for Event Notification:** The removed user will receive the `onKickedOffSeat` event via `CoGuestStore.guestEventPublisher`.
|
|
347
|
+
|
|
348
|
+
#### Example Code:
|
|
349
|
+
``` swift
|
|
350
|
+
// Suppose you want to remove "userB"
|
|
351
|
+
let targetUserId = "userB"
|
|
352
|
+
seatStore.kickUserOutOfSeat(userID: targetUserId) { result in
|
|
353
|
+
switch result {
|
|
354
|
+
case .success:
|
|
355
|
+
print("\(targetUserId) has been removed from the mic seat")
|
|
356
|
+
case .failure(let error):
|
|
357
|
+
print("Failed to remove user: \(error.message)")
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
// "userB" receives the removal event
|
|
362
|
+
guestStore
|
|
363
|
+
.guestEventPublisher
|
|
364
|
+
.receive(on: RunLoop.main)
|
|
365
|
+
.sink { [weak self] event in
|
|
366
|
+
guard let self = self else { return }
|
|
367
|
+
switch event {
|
|
368
|
+
case .onKickedOffSeat(seatIndex: _, hostUser: _):
|
|
369
|
+
// Show toast notification
|
|
370
|
+
default:
|
|
371
|
+
break
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
.store(in: &cancellables)
|
|
375
|
+
|
|
376
|
+
```
|
|
377
|
+
|
|
378
|
+
#### kickUserOutOfSeat Parameters:
|
|
379
|
+
| **Parameter** | **Type** | **Description** |
|
|
380
|
+
| --- | --- | --- |
|
|
381
|
+
| `userID` | `String` | The userID of the user to be removed from the mic seat. |
|
|
382
|
+
| `completion` | `CompletionClosure?` | Callback after the request completes. |
|
|
383
|
+
|
|
384
|
+
### Host Locks and Unlocks Mic Seats
|
|
385
|
+
|
|
386
|
+
The host can lock or unlock a specific mic seat.
|
|
387
|
+
|
|
388
|
+
#### Implementation:
|
|
389
|
+
1. **Lock Seat:** The host can call `lockSeat` to lock the seat at the specified index. Once locked, audience members cannot occupy this seat via `applyForSeat` or `takeSeat`.
|
|
390
|
+
|
|
391
|
+
2. **Unlock Seat:** Call `unlockSeat` to unlock the seat, making it available again.
|
|
392
|
+
|
|
393
|
+
#### Example Code:
|
|
394
|
+
``` swift
|
|
395
|
+
// Lock seat #2
|
|
396
|
+
seatStore.lockSeat(seatIndex: 2) { result in
|
|
397
|
+
if case .success = result {
|
|
398
|
+
print("Seat #2 locked")
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
// Unlock seat #2
|
|
403
|
+
seatStore.unlockSeat(seatIndex: 2) { result in
|
|
404
|
+
if case .success = result {
|
|
405
|
+
print("Seat #2 unlocked")
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
```
|
|
409
|
+
|
|
410
|
+
#### lockSeat Parameters:
|
|
411
|
+
| **Parameter** | **Type** | **Description** |
|
|
412
|
+
| --- | --- | --- |
|
|
413
|
+
| `seatIndex` | `Int` | Index of the seat to lock. |
|
|
414
|
+
| `completion` | `CompletionClosure?` | Callback after the request completes. |
|
|
415
|
+
|
|
416
|
+
#### unlockSeat Parameters:
|
|
417
|
+
| **Parameter** | **Type** | **Description** |
|
|
418
|
+
| --- | --- | --- |
|
|
419
|
+
| `seatIndex` | `Int` | Index of the seat to unlock. |
|
|
420
|
+
| `completion` | `CompletionClosure?` | Callback after the request completes. |
|
|
421
|
+
|
|
422
|
+
### Move Mic Seats
|
|
423
|
+
|
|
424
|
+
Hosts and on-mic users can call `moveUserToSeat(userID:targetIndex:policy:completion:)` to move users between mic seats.
|
|
425
|
+
|
|
426
|
+
#### Implementation:
|
|
427
|
+
1. **Host Moves User to Mic Seat:** The host can use this API to move any user to a specified mic seat. Provide the target user's `userID`, the target seat index as `targetIndex`, and use the `policy` parameter to specify the seat movement strategy if the target seat is occupied (see parameter details below).
|
|
428
|
+
|
|
429
|
+
2. **On-Mic User Moves Themselves:** On-mic users can also call this API to move themselves. In this case, `userID` must be the user's own ID, `targetIndex` is the desired new seat index, and the `policy` parameter is ignored. If the target seat is occupied, the move fails with an error.
|
|
430
|
+
|
|
431
|
+
#### Example Code:
|
|
432
|
+
``` swift
|
|
433
|
+
seatStore.moveUserToSeat(userID: "userC",
|
|
434
|
+
targetIndex: newSeatIndex,
|
|
435
|
+
policy: .abortWhenOccupied) { result in
|
|
436
|
+
if case .success = result {
|
|
437
|
+
print("Successfully moved to seat #\(newSeatIndex)")
|
|
438
|
+
} else {
|
|
439
|
+
print("Move failed, seat may be occupied")
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
```
|
|
443
|
+
|
|
444
|
+
#### moveUserToSeat Parameters:
|
|
445
|
+
| **Parameter** | **Type** | **Description** |
|
|
446
|
+
| --- | --- | --- |
|
|
447
|
+
| `userID` | `String` | The userID of the user to move. |
|
|
448
|
+
| `targetIndex` | `Int` | Target seat index. |
|
|
449
|
+
| `policy` | `MoveSeatPolicy?` | Seat movement policy if the target seat is occupied:<br>- `abortWhenOccupied`: Abort move if seat is occupied (default)<br>- `forceReplace`: Force replace the user on the target seat; replaced user will be removed<br>- `swapPosition`: Swap positions with the user on the target seat. |
|
|
450
|
+
| `completion` | `CompletionClosure?` | Callback after the request completes. |
|
|
451
|
+
|
|
452
|
+
## API Documentation
|
|
453
|
+
|
|
454
|
+
For detailed information about all public interfaces, properties, and methods of [CoGuestStore](https://tencent-rtc.github.io/TUIKit_iOS/documentation/atomicxcore/cogueststore), [LiveSeatStore](https://tencent-rtc.github.io/TUIKit_iOS/documentation/atomicxcore/liveseatstore), and related classes, refer to the official [AtomicXCore](https://tencent-rtc.github.io/TUIKit_iOS/documentation/atomicxcore) framework API documentation. The relevant stores used in this guide are as follows:
|
|
455
|
+
| **Store/Component** | **Feature Description** | **API Documentation** |
|
|
456
|
+
| --- | --- | --- |
|
|
457
|
+
| CoGuestStore | Audience mic-link management: mic-link requests/invitations/accept/reject, member permission control (microphone/camera), state synchronization. | [API Documentation](https://tencent-rtc.github.io/TUIKit_iOS/documentation/atomicxcore/cogueststore) |
|
|
458
|
+
| LiveSeatStore | Mic seat management: mute/unmute, lock/unlock seats, remove users from mic, remote mic control, mic seat list state monitoring | [API Documentation](https://tencent-rtc.github.io/TUIKit_iOS/documentation/atomicxcore/liveseatstore) |
|
|
459
|
+
|
|
460
|
+
## FAQs
|
|
461
|
+
|
|
462
|
+
### What’s the difference between voice room mic-link and video live mic-link implementation?
|
|
463
|
+
|
|
464
|
+
The main differences are in business logic and UI presentation:
|
|
465
|
+
- `Video Live: `The core is the video feed. Use `LiveCoreView` as the main component to render video streams for the host and mic-linked viewers. The UI focuses on video layout and sizing, and you can add overlays (nickname, placeholder image) via `VideoViewDelegate`. Both camera and microphone can be enabled.
|
|
466
|
+
|
|
467
|
+
- `Voice Room:` The core is the mic seat grid. Do not use `LiveCoreView`; instead, build a grid UI (e.g., `UICollectionView`) based on the `LiveSeatStore`'s `state` (especially `seatList`). The UI focuses on real-time display of each seat’s `SeatInfo` status: occupied, muted, locked, and speaking status. Only the microphone needs to be enabled.
|
|
468
|
+
|
|
469
|
+
### How do I refresh mic seat info (e.g., occupied, muted) in the UI in real time?
|
|
470
|
+
|
|
471
|
+
Subscribe to the `seatList` property in `LiveSeatState`, which is a reactive `[SeatInfo]` array. Any changes will notify you to re-render the mic seat list. Iterate through this array to:
|
|
472
|
+
- Get user info on each seat via `seatInfo.userInfo`.
|
|
473
|
+
|
|
474
|
+
- Check if a seat is locked via `seatInfo.isLocked`.
|
|
475
|
+
|
|
476
|
+
- Check mic status of the user via `seatInfo.userInfo.microphoneStatus`.
|
|
477
|
+
|
|
478
|
+
### What’s the difference between microphone interfaces in LiveSeatStore and DeviceStore?
|
|
479
|
+
|
|
480
|
+
This is an important distinction. `DeviceStore` manages the physical device, while `LiveSeatStore` manages mic seat business logic (audio stream).
|
|
481
|
+
|
|
482
|
+
`DeviceStore`:
|
|
483
|
+
- `openLocalMicrophone`: Requests system permission and starts the microphone hardware for audio capture. This is a time-consuming operation.
|
|
484
|
+
|
|
485
|
+
- `closeLocalMicrophone`: Stops audio capture and releases the microphone device.
|
|
486
|
+
|
|
487
|
+
`LiveSeatStore`:
|
|
488
|
+
|
|
489
|
+
- `muteMicrophone`: Mute. Stops sending local audio stream to remote, but the microphone hardware remains running.
|
|
490
|
+
|
|
491
|
+
- `unmuteMicrophone`: Unmute. Resumes sending audio stream to remote.
|
|
492
|
+
|
|
493
|
+
**Recommended workflow: **"Open the device once, control mute/unmute while on mic"
|
|
494
|
+
|
|
495
|
+
1. **When joining mic:** When an audience member successfully joins the mic, call `openLocalMicrophone` once to start the device.
|
|
496
|
+
|
|
497
|
+
2. **While on mic:** All "mute" and "unmute" actions while on mic should use `muteMicrophone` and `unmuteMicrophone` to control the audio stream.
|
|
498
|
+
|
|
499
|
+
3. **When leaving mic:** When leaving mic (e.g., calling `disconnect`), call `closeLocalMicrophone` to release the device.
|