@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,514 @@
|
|
|
1
|
+
This document guides you through building a voice chat room application with host broadcasting and audience participation features using the **AtomicXCore** SDK's `LiveListStore` and `LiveSeatStore`.
|
|
2
|
+
|
|
3
|
+
## Core Concepts
|
|
4
|
+
| **Core Concept** | **Type** | **Core Responsibilities & Description** |
|
|
5
|
+
| --- | --- | --- |
|
|
6
|
+
| `LiveListStore` | `class` | - `createLive()`: Start live stream as host.<br>- `endLive()`: End live stream as host.<br>- `joinLive()`: Audience joins live room.<br>- `leaveLive()`: Leave live room. |
|
|
7
|
+
| `LiveInfo` | `struct` | - `liveID`: Unique room identifier.<br>- `seatLayoutTemplateID`: Layout template ID (e.g., 600 for dynamic grid). |
|
|
8
|
+
| `LiveSeatStore` | `class` | - Core seat management class. Manages all seat information and seat-related operations in the room.<br>- Provides a real-time seat list data stream via liveSeatState.seatList. |
|
|
9
|
+
| `LiveSeatState` | `struct` | Represents the current state of all seats.<br>- `seatList`: a StateFlow containing the real-time seat list.<br>- `speakingUsers`: users currently speaking and their volume. |
|
|
10
|
+
| `SeatInfo` | `class` | Data model for a single seat. The seat list (seatList) emitted by LiveSeatStore is a list of SeatInfo objects.<br>Key fields:<br>- `index`: seat position.<br>- `isLocked`: whether the seat is locked.<br>- `userInfo`: user information for the seat. If the seat is empty, this field is empty. |
|
|
11
|
+
| `SeatUserInfo` | `class` | Detailed data model for the user occupying a seat. When a user successfully takes a seat, the userInfo field in SeatInfo is populated.<br>Key fields:<br>- `userID`: unique user ID.<br>- `userName`: user nickname.<br>- `avatarURL`: user avatar URL.<br>- `microphoneStatus`: microphone status (on/off).<br>- `cameraStatus`: camera status (on/off). |
|
|
12
|
+
|
|
13
|
+
## Prerequisites
|
|
14
|
+
|
|
15
|
+
### Step 1: Activate the Service
|
|
16
|
+
|
|
17
|
+
See Activate Service to obtain either the trial or paid version of the SDK.Then, go to [the Console](https://console.trtc.io/app) for application management, and get the following:
|
|
18
|
+
- `SDKAppID`: Application identifier (required). Tencent Cloud uses `SDKAppID` for billing and details.
|
|
19
|
+
|
|
20
|
+
- `SDKSecretKey`: Application secret key, used to initialize the configuration file with secret information.
|
|
21
|
+
|
|
22
|
+
### Step 2: Import AtomicXCore into Your Project
|
|
23
|
+
1. **Install the Component**: Add `pod 'AtomicXCore'` to your `Podfile`, then run `pod install`.
|
|
24
|
+
|
|
25
|
+
``` ruby
|
|
26
|
+
target 'xxxx' do
|
|
27
|
+
pod 'AtomicXCore'
|
|
28
|
+
end
|
|
29
|
+
```
|
|
30
|
+
2. **Configure App Permissions**: Add camera and microphone usage descriptions to your app's `Info.plist` file.
|
|
31
|
+
|
|
32
|
+
``` xml
|
|
33
|
+
<key>NSMicrophoneUsageDescription</key>
|
|
34
|
+
<string>TUILiveKit needs microphone permission to enable sound in recorded videos</string>
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
### Step 3: Implement Login Logic
|
|
38
|
+
|
|
39
|
+
Call `LoginStore.shared.login` in your project to complete authentication. **This is required before using any functionality of AtomicXCore**.
|
|
40
|
+
|
|
41
|
+
> **Note:**
|
|
42
|
+
>
|
|
43
|
+
|
|
44
|
+
> We recommend calling LoginStore.shared.login only after your app's own user authentication is successful, to ensure clear and consistent login logic.
|
|
45
|
+
>
|
|
46
|
+
|
|
47
|
+
``` swift
|
|
48
|
+
import AtomicXCore
|
|
49
|
+
|
|
50
|
+
// AppDelegate.swift
|
|
51
|
+
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
|
|
52
|
+
LoginStore.shared.login(sdkAppID: 1400000001, // Replace with your SDKAppID
|
|
53
|
+
userID: "test_001", // Replace with your UserID
|
|
54
|
+
userSig: "xxxxxxxxxxx") { result in // Replace with your UserSig
|
|
55
|
+
switch result {
|
|
56
|
+
case .success(let info):
|
|
57
|
+
debugPrint("login success")
|
|
58
|
+
case .failure(let error):
|
|
59
|
+
debugPrint("login failed code:\(error.code), message:\(error.message)")
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
return true
|
|
63
|
+
}
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
**Login API Parameter Description**
|
|
67
|
+
| Parameter | Type | Description |
|
|
68
|
+
| --- | --- | --- |
|
|
69
|
+
| `sdkAppID` | `Int` | Get this from [TRTC console > Application management](https://console.trtc.io/app). |
|
|
70
|
+
| `userID` | `String` | The unique ID for the current user. Must contain only English letters, numbers, hyphens, and underscores. |
|
|
71
|
+
| `userSig` | `String` | A ticket for Tencent Cloud authentication. Please note:<br>- **Development Environment**: You can use the local `GenerateTestUserSig.genTestSig` function to generate a UserSig or generate a temporary UserSig via the [UserSig Generation Tool](https://console.trtc.io/usersig).<br>- **Production Environment**: To prevent key leakage, you must use a server-side method to generate UserSig. For details, see Generating UserSig on the Server.<br>- For more information, see How to Calculate and Use UserSig. |
|
|
72
|
+
|
|
73
|
+
## Building a Basic Voice Chat Room
|
|
74
|
+
|
|
75
|
+
### Step 1: Host Room Creation
|
|
76
|
+
|
|
77
|
+
Follow these steps to quickly set up a voice chat room as the host.
|
|
78
|
+
|
|
79
|
+
#### **1. Initialize the Seat Store**
|
|
80
|
+
|
|
81
|
+
In your host `ViewController`, instantiate `LiveSeatStore`. Use the Combine framework to observe changes in `liveSeatStore.state` for real-time seat updates and UI rendering.
|
|
82
|
+
``` swift
|
|
83
|
+
import UIKit
|
|
84
|
+
import AtomicXCore
|
|
85
|
+
import Combine
|
|
86
|
+
|
|
87
|
+
class YourAnchorViewController: UIViewController {
|
|
88
|
+
|
|
89
|
+
private let liveListStore = LiveListStore.shared
|
|
90
|
+
private let deviceStore = DeviceStore.shared
|
|
91
|
+
|
|
92
|
+
// Initialize LiveSeatStore with liveID
|
|
93
|
+
private let liveID = "test_voice_room_001"
|
|
94
|
+
private lazy var liveSeatStore = LiveSeatStore.create(liveID: liveID)
|
|
95
|
+
|
|
96
|
+
// Manage subscription lifecycle
|
|
97
|
+
private var cancellables = Set<AnyCancellable>()
|
|
98
|
+
|
|
99
|
+
override func viewDidLoad() {
|
|
100
|
+
super.viewDidLoad()
|
|
101
|
+
// Initialize your layout here
|
|
102
|
+
// setupUI()
|
|
103
|
+
|
|
104
|
+
// Listen for seat list changes
|
|
105
|
+
observeSeatList()
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
private func observeSeatList() {
|
|
109
|
+
// Subscribe to seat list updates and refresh seat UI
|
|
110
|
+
liveSeatStore.state
|
|
111
|
+
.subscribe(StatePublisherSelector(keyPath: \LiveSeatState.seatList))
|
|
112
|
+
.removeDuplicates()
|
|
113
|
+
.receive(on: DispatchQueue.main)
|
|
114
|
+
.sink { [weak self] seatInfoList in
|
|
115
|
+
// Update seat UI with seatInfoList
|
|
116
|
+
// Example: self?.updateMicSeatView(seatInfoList)
|
|
117
|
+
print("Seat list updated: \(seatInfoList.count) seats")
|
|
118
|
+
}
|
|
119
|
+
.store(in: &cancellables)
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
#### **2. **Turn On Microphone
|
|
125
|
+
|
|
126
|
+
Turn On Microphone by calling `openLocalMicrophone` from `DeviceStore`:
|
|
127
|
+
``` swift
|
|
128
|
+
import UIKit
|
|
129
|
+
import AtomicXCore
|
|
130
|
+
|
|
131
|
+
class YourAnchorViewController: UIViewController {
|
|
132
|
+
// ... other code ...
|
|
133
|
+
|
|
134
|
+
private func openDevices() {
|
|
135
|
+
DeviceStore.shared.openLocalMicrophone(completion: nil)
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
#### **3. Start Voice Chat**
|
|
141
|
+
|
|
142
|
+
Start the voice chat room by invoking `createLive` on `LiveListStore`:
|
|
143
|
+
``` swift
|
|
144
|
+
import UIKit
|
|
145
|
+
import AtomicXCore
|
|
146
|
+
|
|
147
|
+
class YourAnchorViewController: UIViewController {
|
|
148
|
+
// ... other code ...
|
|
149
|
+
private let liveID = "test_voice_room_001"
|
|
150
|
+
|
|
151
|
+
override func viewDidLoad() {
|
|
152
|
+
super.viewDidLoad()
|
|
153
|
+
// ... other code ...
|
|
154
|
+
|
|
155
|
+
// Start voice chat
|
|
156
|
+
startLive()
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
private func startLive() {
|
|
160
|
+
var liveInfo = LiveInfo()
|
|
161
|
+
|
|
162
|
+
liveInfo.liveID = liveID
|
|
163
|
+
liveInfo.liveName = "test voice chat room"
|
|
164
|
+
liveInfo.seatTemplate = SeatLayoutTemplate.AudioSalon(seatCount: 9) // Set the live streaming template to the voice chat room template, with 9 seats
|
|
165
|
+
liveInfo.seatMode = .apply
|
|
166
|
+
|
|
167
|
+
liveListStore.createLive(liveInfo) { [weak self] result in
|
|
168
|
+
guard let self = self else { return }
|
|
169
|
+
switch result {
|
|
170
|
+
case .success(let liveInfo):
|
|
171
|
+
print("Response startLive onSuccess")
|
|
172
|
+
// Host is on seat by default; unmute microphone if needed
|
|
173
|
+
liveSeatStore.unmuteMicrophone(completion: nil)
|
|
174
|
+
case .failure(let errorInfo):
|
|
175
|
+
print("Response startLive onError: \(errorInfo.message)")
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
**LiveInfo Parameter Reference:**
|
|
183
|
+
| **Parameter Name** | **Type** | **Required** | **Description** |
|
|
184
|
+
| --- | --- | --- | --- |
|
|
185
|
+
| `liveID` | `String` | Required | Unique identifier for the live room |
|
|
186
|
+
| `liveName` | `String` | Optional | Room title |
|
|
187
|
+
| `notice` | `String` | Optional | Room announcement |
|
|
188
|
+
| `isMessageDisable` | `Bool` | Optional | Mute chat (`true`: muted, `false`: not muted) |
|
|
189
|
+
| `isPublicVisible` | `Bool` | Optional | Public visibility (`true`: visible, `false`: not visible) |
|
|
190
|
+
| `seatMode` | `TakeSeatMode` | Optional | Seat mode (`.free`: free seat, `.apply`: apply for seat) |
|
|
191
|
+
| `seatTemplate` | `SeatLayoutTemplate` | Required | Seat layout template ID |
|
|
192
|
+
| `coverURL` | `String` | Optional | Room cover image URL |
|
|
193
|
+
| `backgroundURL` | `String` | Optional | Room background image URL |
|
|
194
|
+
| `categoryList` | `[NSNumber]` | Optional | Room category tags |
|
|
195
|
+
| `activityStatus` | `Int` | Optional | Live activity status |
|
|
196
|
+
| `isGiftEnabled` | `Bool` | Optional | Enable gift feature (`true`: enabled, `false`: disabled) |
|
|
197
|
+
|
|
198
|
+
#### **4. Build the Mic Seat UI**
|
|
199
|
+
|
|
200
|
+
> **Note:**
|
|
201
|
+
>
|
|
202
|
+
|
|
203
|
+
> For seat UI logic and effects, refer to the open-source [SeatGridView.swift](https://github.com/Tencent-RTC/TUIKit_iOS/blob/main/live/Sources/SeatGridview/SeatGridView.swift) in TUILiveKit.
|
|
204
|
+
>
|
|
205
|
+
|
|
206
|
+
Use your `LiveSeatStore` instance to subscribe to `state.seatList` and update the UI in real time:
|
|
207
|
+
``` swift
|
|
208
|
+
import UIKit
|
|
209
|
+
import AtomicXCore
|
|
210
|
+
import Combine
|
|
211
|
+
|
|
212
|
+
class YourAnchorViewController: UIViewController {
|
|
213
|
+
// ... other code ...
|
|
214
|
+
private var cancellables = Set<AnyCancellable>()
|
|
215
|
+
private lazy var liveSeatStore = LiveSeatStore.create(liveID: "your_live_id")
|
|
216
|
+
|
|
217
|
+
override func viewDidLoad() {
|
|
218
|
+
super.viewDidLoad()
|
|
219
|
+
// ... other code ...
|
|
220
|
+
|
|
221
|
+
observeSeatList()
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
private func observeSeatList() {
|
|
225
|
+
liveSeatStore.state
|
|
226
|
+
.subscribe(StatePublisherSelector(keyPath: \LiveSeatState.seatList))
|
|
227
|
+
.removeDuplicates()
|
|
228
|
+
.receive(on: DispatchQueue.main)
|
|
229
|
+
.sink { [weak self] seatInfoList in
|
|
230
|
+
// seatInfoList contains the latest seat data
|
|
231
|
+
print("Seat list updated: \(seatInfoList.count) seats")
|
|
232
|
+
}
|
|
233
|
+
.store(in: &cancellables)
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
#### **5. End Voice Chat**
|
|
239
|
+
|
|
240
|
+
To end the session, call `endLive` on `LiveListStore`. The SDK will handle stream termination and room cleanup.
|
|
241
|
+
``` swift
|
|
242
|
+
import UIKit
|
|
243
|
+
import AtomicXCore
|
|
244
|
+
import RTCRoomEngine
|
|
245
|
+
|
|
246
|
+
class YourAnchorViewController: UIViewController {
|
|
247
|
+
// ... other code ...
|
|
248
|
+
|
|
249
|
+
private func stopLive() {
|
|
250
|
+
liveListStore.endLive { result in
|
|
251
|
+
switch result {
|
|
252
|
+
case .success(let data):
|
|
253
|
+
print("endLive success")
|
|
254
|
+
case .failure(let errorInfo):
|
|
255
|
+
print("endLive error: \(errorInfo.message)")
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
### Step 2: Audience Joins the Voice Chat Room
|
|
263
|
+
|
|
264
|
+
Enable audience members to join the voice chat room with the following steps.
|
|
265
|
+
|
|
266
|
+
#### **1. Initialize the Seat Store**
|
|
267
|
+
|
|
268
|
+
In your audience `ViewController`, instantiate `LiveSeatStore` and subscribe to `state.seatList` for seat UI updates.
|
|
269
|
+
``` swift
|
|
270
|
+
import UIKit
|
|
271
|
+
import AtomicXCore
|
|
272
|
+
import Combine
|
|
273
|
+
|
|
274
|
+
class YourAudienceViewController: UIViewController {
|
|
275
|
+
|
|
276
|
+
private let liveListStore = LiveListStore.shared
|
|
277
|
+
|
|
278
|
+
// Use the same liveID as the host
|
|
279
|
+
private let liveID = "test_voice_room_001"
|
|
280
|
+
private lazy var liveSeatStore = LiveSeatStore.create(liveID: liveID)
|
|
281
|
+
|
|
282
|
+
private var cancellables = Set<AnyCancellable>()
|
|
283
|
+
|
|
284
|
+
override func viewDidLoad() {
|
|
285
|
+
super.viewDidLoad()
|
|
286
|
+
// Initialize your layout here
|
|
287
|
+
// setupUI()
|
|
288
|
+
|
|
289
|
+
observeSeatList()
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
private func observeSeatList() {
|
|
293
|
+
liveSeatStore.state
|
|
294
|
+
.subscribe(StatePublisherSelector(keyPath: \LiveSeatState.seatList))
|
|
295
|
+
.removeDuplicates()
|
|
296
|
+
.receive(on: DispatchQueue.main)
|
|
297
|
+
.sink { [weak self] seatInfoList in
|
|
298
|
+
// Update seat UI with seatInfoList
|
|
299
|
+
// Example: self?.updateMicSeatView(seatInfoList)
|
|
300
|
+
print("AudienceVC Seat list updated: \(seatInfoList.count) seats")
|
|
301
|
+
}
|
|
302
|
+
.store(in: &cancellables)
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
```
|
|
306
|
+
|
|
307
|
+
#### **2. Join the Voice Chat Room**
|
|
308
|
+
|
|
309
|
+
Join the room by calling `joinLive` on `LiveListStore`:
|
|
310
|
+
``` swift
|
|
311
|
+
import UIKit
|
|
312
|
+
import AtomicXCore
|
|
313
|
+
|
|
314
|
+
class YourAudienceViewController: UIViewController {
|
|
315
|
+
|
|
316
|
+
// ... other code ...
|
|
317
|
+
override func viewDidLoad() {
|
|
318
|
+
super.viewDidLoad()
|
|
319
|
+
// ... other code ...
|
|
320
|
+
|
|
321
|
+
joinLive()
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
private func joinLive() {
|
|
325
|
+
liveListStore.joinLive(liveID: liveID) { result in
|
|
326
|
+
DispatchQueue.main.async {
|
|
327
|
+
switch result {
|
|
328
|
+
case .success(let liveInfo):
|
|
329
|
+
print("joinLive success")
|
|
330
|
+
case .failure(let errorInfo):
|
|
331
|
+
print("joinLive error: \(errorInfo.message)")
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
```
|
|
338
|
+
|
|
339
|
+
#### **3. Build the Mic Seat UI**
|
|
340
|
+
|
|
341
|
+
Building the seat UI for audience members is identical to the host process. Refer to the host Build the Mic Seat UI.
|
|
342
|
+
|
|
343
|
+
#### **4. Leave the Voice Chat Room**
|
|
344
|
+
|
|
345
|
+
To leave the room, call `leaveLive` on `LiveListStore`:
|
|
346
|
+
``` swift
|
|
347
|
+
import UIKit
|
|
348
|
+
import AtomicXCore
|
|
349
|
+
|
|
350
|
+
class YourAudienceViewController: UIViewController {
|
|
351
|
+
// ... other code ...
|
|
352
|
+
|
|
353
|
+
private func leaveLive() {
|
|
354
|
+
liveListStore.leaveLive { result in
|
|
355
|
+
switch result {
|
|
356
|
+
case .success:
|
|
357
|
+
print("leaveLive success")
|
|
358
|
+
case .failure(let errorInfo):
|
|
359
|
+
print("leaveLive error: \(errorInfo.message)")
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
```
|
|
365
|
+
|
|
366
|
+
### Run and Test
|
|
367
|
+
|
|
368
|
+
After completing these steps, you will have a functional voice chat live streaming room. For advanced features, see "Enriching Voice Chat Room Scenarios" below.
|
|
369
|
+
|
|
370
|
+
## Advanced Features
|
|
371
|
+
|
|
372
|
+
### Implementing Speaking Wave Animation for Users on Seat
|
|
373
|
+
|
|
374
|
+
In voice chat rooms, it's common to show a wave animation over the avatar of users who are currently speaking. `LiveSeatStore` provides a `speakingUsers` stream for this purpose.
|
|
375
|
+
|
|
376
|
+
#### Example
|
|
377
|
+
|
|
378
|
+
#### Implementation
|
|
379
|
+
|
|
380
|
+
> **Note:**
|
|
381
|
+
>
|
|
382
|
+
|
|
383
|
+
> For a complete implementation of the speaking wave animation, refer to [SeatGridView.swift](https://github.com/Tencent-RTC/TUIKit_iOS/blob/main/live/Sources/SeatGridview/SeatGridView.swift) in TUILiveKit.
|
|
384
|
+
>
|
|
385
|
+
|
|
386
|
+
In your `YourAnchorViewController` or `YourAudienceViewController`, subscribe to `speakingUsers` and update the UI accordingly:
|
|
387
|
+
``` swift
|
|
388
|
+
import UIKit
|
|
389
|
+
import AtomicXCore
|
|
390
|
+
import Combine
|
|
391
|
+
|
|
392
|
+
class YourAnchorViewController: UIViewController {
|
|
393
|
+
// ... (other code omitted) ...
|
|
394
|
+
private var cancellables = Set<AnyCancellable>()
|
|
395
|
+
|
|
396
|
+
override func viewDidLoad() {
|
|
397
|
+
super.viewDidLoad()
|
|
398
|
+
// ... (other code omitted) ...
|
|
399
|
+
|
|
400
|
+
observeSpeakingUsersState()
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
private func observeSpeakingUsersState() {
|
|
404
|
+
liveSeatStore.state
|
|
405
|
+
.subscribe(StatePublisherSelector(keyPath: \LiveSeatState.speakingUsers))
|
|
406
|
+
.removeDuplicates()
|
|
407
|
+
.receive(on: DispatchQueue.main)
|
|
408
|
+
.sink { [weak self] speakingUserMap in
|
|
409
|
+
// Update UI to indicate which users are speaking
|
|
410
|
+
print("Speaking users updated: \(speakingUserMap.count) users")
|
|
411
|
+
}
|
|
412
|
+
.store(in: &cancellables)
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
```
|
|
416
|
+
|
|
417
|
+
### Synchronizing Custom Status in Live Streaming Room
|
|
418
|
+
|
|
419
|
+
In live streaming room, the host may need to synchronize custom information to all audience members, such as "current room topic" or "background music info". Use the `metaData` feature of LiveListStore to achieve this.
|
|
420
|
+
|
|
421
|
+
#### Implementation
|
|
422
|
+
1. On the host side, set custom information (recommended as JSON) to one or more keys using the `updateLiveMetaData` API. AtomicXCore will synchronize these changes in real time to all audience members.
|
|
423
|
+
|
|
424
|
+
2. On the audience side, subscribe to `LiveListState.currentLive` and listen for changes in `metaData`. When a relevant key is updated, parse its value and update your business state.
|
|
425
|
+
|
|
426
|
+
#### Code Example
|
|
427
|
+
``` swift
|
|
428
|
+
import AtomicXCore
|
|
429
|
+
import Combine
|
|
430
|
+
|
|
431
|
+
// 1. Define a background music model (recommended: Codable)
|
|
432
|
+
struct MusicModel: Codable {
|
|
433
|
+
let musicId: String
|
|
434
|
+
let musicName: String
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
// 2. Host side: Push background music info
|
|
438
|
+
func updateBackgroundMusic(music: MusicModel) {
|
|
439
|
+
guard let jsonData = try? JSONEncoder().encode(music),
|
|
440
|
+
let jsonString = String(data: jsonData, encoding: .utf8) else { return }
|
|
441
|
+
|
|
442
|
+
let metaData = ["music_info": jsonString]
|
|
443
|
+
|
|
444
|
+
LiveListStore.shared.updateLiveMetaData(metaData) { result in
|
|
445
|
+
if case .success = result {
|
|
446
|
+
print("Background music \(music.musicName) pushed successfully")
|
|
447
|
+
} else if case .failure(let error) = result {
|
|
448
|
+
print("Background music push failed: \(error.message)")
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
|
|
453
|
+
// 3. Audience side: Subscribe and update business logic
|
|
454
|
+
private func subscribeToDataUpdates() {
|
|
455
|
+
LiveListStore.shared.state
|
|
456
|
+
// Listen for metaData changes in the current room
|
|
457
|
+
.subscribe(StatePublisherSelector(keyPath: \LiveListState.currentLive))
|
|
458
|
+
.map { $0.metaData["music_info"] }
|
|
459
|
+
.removeDuplicates()
|
|
460
|
+
.receive(on: DispatchQueue.main)
|
|
461
|
+
.sink { jsonString in
|
|
462
|
+
guard let jsonString = jsonString,
|
|
463
|
+
let data = jsonString.data(using: .utf8),
|
|
464
|
+
let music = try? JSONDecoder().decode(MusicModel.self, from: data) else {
|
|
465
|
+
return
|
|
466
|
+
}
|
|
467
|
+
// Update business state, play new music
|
|
468
|
+
// ... (e.g.: playMusic(music))
|
|
469
|
+
}
|
|
470
|
+
.store(in: &cancellables)
|
|
471
|
+
}
|
|
472
|
+
```
|
|
473
|
+
|
|
474
|
+
## Enriching Voice Chat Room Scenarios
|
|
475
|
+
|
|
476
|
+
After implementing the basic voice chat room, enhance your application with the following features:
|
|
477
|
+
| **Feature** | **Description** | **Store** | **Implementation Guide** |
|
|
478
|
+
| --- | --- | --- | --- |
|
|
479
|
+
| **Audience Take Seat** | Audience members can apply to take a seat and interact with the host in real time. | [CoGuestStore](https://tencent-rtc.github.io/TUIKit_iOS/documentation/atomicxcore/cogueststore) | Implementation |
|
|
480
|
+
| **Host Cross-Room PK** | Hosts from different rooms can connect for interaction or PK. | [CoHostStore](https://tencent-rtc.github.io/TUIKit_iOS/documentation/atomicxcore/cohoststore)<br>[BattleStore](https://tencent-rtc.github.io/TUIKit_iOS/documentation/atomicxcore/battlestore) | Implementation |
|
|
481
|
+
| **Add Barrage Chat** | Room members can send and receive real-time text messages. | [BarrageStore](https://tencent-rtc.github.io/TUIKit_iOS/documentation/atomicxcore/barragestore) | Implementation |
|
|
482
|
+
| **Gift System** | Audience can send virtual gifts to hosts to increase interaction and engagement. | [GiftStore](https://tencent-rtc.github.io/TUIKit_iOS/documentation/atomicxcore/giftstore) | Implementation |
|
|
483
|
+
|
|
484
|
+
## API Documentation
|
|
485
|
+
| **Store/Component** | **Description** | **API Docs** |
|
|
486
|
+
| --- | --- | --- |
|
|
487
|
+
| `LiveListStore` | Manages the full live room lifecycle: create, join, leave, destroy room; query room list; modify room info; listen for room status changes. | [API Documentation](https://tencent-rtc.github.io/TUIKit_iOS/documentation/atomicxcore/liveliststore) |
|
|
488
|
+
| `LiveSeatStore` | Seat management: handle seat list, user status, seat operations (take seat, leave seat, kick, lock, toggle mic/camera), and seat events. | [API Documentation](https://tencent-rtc.github.io/TUIKit_iOS/documentation/atomicxcore/liveseatstore) |
|
|
489
|
+
| `DeviceStore` | Audio/video device control: microphone, camera, screen sharing, device status monitoring. | [API Documentation](https://tencent-rtc.github.io/TUIKit_iOS/documentation/atomicxcore/devicestore/) |
|
|
490
|
+
| `CoGuestStore` | Audience co-host management: application, invitation, acceptance, rejection, member permissions, status sync. | [API Documentation](https://tencent-rtc.github.io/TUIKit_iOS/documentation/atomicxcore/cogueststore/) |
|
|
491
|
+
| `CoHostStore` | Host cross-room connection: supports multiple layouts, initiate/accept/reject connection, manage co-host interaction. | [API Documentation](https://tencent-rtc.github.io/TUIKit_iOS/documentation/atomicxcore/cohoststore/) |
|
|
492
|
+
| `BattleStore` | Host PK battle: initiate PK, manage PK status, synchronize scores, listen for battle results. | [API Documentation](https://tencent-rtc.github.io/TUIKit_iOS/documentation/atomicxcore/battlestore) |
|
|
493
|
+
| `GiftStore` | Gift interaction: fetch gift list, send/receive gifts, listen for gift events. | [API Documentation](https://tencent-rtc.github.io/TUIKit_iOS/documentation/atomicxcore/giftstore/) |
|
|
494
|
+
| `BarrageStore` | Barrage (chat overlay): send text/custom barrage, maintain barrage list, monitor barrage status. | [API Documentation](https://tencent-rtc.github.io/TUIKit_iOS/documentation/atomicxcore/barragestore) |
|
|
495
|
+
| `LikeStore` | Like interaction: send likes, listen for like events, synchronize like count. | [API Documentation](https://tencent-rtc.github.io/TUIKit_iOS/documentation/atomicxcore/likestore) |
|
|
496
|
+
| `LiveAudienceStore` | Audience management: get real-time audience list, count, entry/exit events. | [API Documentation](https://tencent-rtc.github.io/TUIKit_iOS/documentation/atomicxcore/liveaudiencestore) |
|
|
497
|
+
| `AudioEffectStore` | Audio effects: voice change, reverb, in-ear monitoring, effect switching. | [API Documentation](https://tencent-rtc.github.io/TUIKit_iOS/documentation/atomicxcore/audioeffectstore) |
|
|
498
|
+
| `BaseBeautyStore` | Basic beauty: adjust smoothing/whitening/redness (0-100), reset beauty status, synchronize effect parameters. | [API Documentation](https://tencent-rtc.github.io/TUIKit_iOS/documentation/atomicxcore/basebeautystore) |
|
|
499
|
+
|
|
500
|
+
## FAQs
|
|
501
|
+
|
|
502
|
+
### Why is there no sound after the audience calls joinLive?
|
|
503
|
+
- **Check device permissions**: Ensure your app declares and requests microphone access (`NSMicrophoneUsageDescription`) in `Info.plist`.
|
|
504
|
+
|
|
505
|
+
- **Check host configuration**: Verify the host has enabled the microphone via `DeviceStore.shared.openLocalMicrophone(completion: nil)`.
|
|
506
|
+
|
|
507
|
+
- **Check network**: Confirm the device has a stable network connection.
|
|
508
|
+
|
|
509
|
+
### Why is the seat list not displayed or not updating?
|
|
510
|
+
- **Check store initialization**: Confirm you create the `LiveSeatStore` instance (`LiveSeatStore.create(liveID: liveID)`) with the same `liveID` before calling `createLive` or `joinLive`.
|
|
511
|
+
|
|
512
|
+
- **Check data subscription**: Make sure you use Combine to subscribe to `liveSeatStore.state.seatList`, and the `cancellables` lifecycle matches your `ViewController`.
|
|
513
|
+
|
|
514
|
+
- **Check API calls**: Ensure `createLive` (host) or `joinLive` (audience) was called successfully (check the `.success` branch in `switch result`).
|