@tencent-rtc/mcp 1.4.6 → 1.6.0-beta.1

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.
Files changed (552) hide show
  1. package/cursor-setting.png +0 -0
  2. package/knowledge/bm25-cache.js +74 -0
  3. package/knowledge/bm25-cache.js.map +1 -0
  4. package/knowledge/bm25.js +148 -0
  5. package/knowledge/bm25.js.map +1 -0
  6. package/knowledge/build-index.js +70 -0
  7. package/knowledge/build-index.js.map +1 -0
  8. package/knowledge/chunker.js +168 -0
  9. package/knowledge/chunker.js.map +1 -0
  10. package/knowledge/content-loader.js +40 -0
  11. package/knowledge/content-loader.js.map +1 -0
  12. package/knowledge/doc-url-resolver.js +143 -0
  13. package/knowledge/doc-url-resolver.js.map +1 -0
  14. package/knowledge/extractors.js +26 -0
  15. package/knowledge/extractors.js.map +1 -0
  16. package/knowledge/path-meta.js +185 -0
  17. package/knowledge/path-meta.js.map +1 -0
  18. package/knowledge/search/exact-lookup.js +498 -0
  19. package/knowledge/search/exact-lookup.js.map +1 -0
  20. package/knowledge/search/filter-pool.js +105 -0
  21. package/knowledge/search/filter-pool.js.map +1 -0
  22. package/knowledge/search/product-scope-intent.js +41 -0
  23. package/knowledge/search/product-scope-intent.js.map +1 -0
  24. package/knowledge/search/requires-framework.js +82 -0
  25. package/knowledge/search/requires-framework.js.map +1 -0
  26. package/knowledge/search/search-knowledge.js +230 -0
  27. package/knowledge/search/search-knowledge.js.map +1 -0
  28. package/mcp-server-prompt.png +0 -0
  29. package/package.json +1 -1
  30. package/resource/_schema/feature-aliases.yaml +10 -0
  31. package/resource/_schema/goal-tags.yaml +72 -0
  32. package/resource/_schema/products.yaml +19 -0
  33. package/resource/_schema/trtc-intents.yaml +27 -0
  34. package/resource/_schema/types.yaml +43 -0
  35. package/resource/index/component-slugs.json +1 -0
  36. package/resource/index/doc-source-urls.json +1 -0
  37. package/resource/index/manifest.json +1 -0
  38. package/resource/{doc → integration}/callkit/preset/android/integration.md +34 -28
  39. package/resource/integration/callkit/preset/flutter/integration.md +346 -0
  40. package/resource/integration/callkit/preset/ios/integration.md +408 -0
  41. package/resource/integration/callkit/preset/react/integration.md +362 -0
  42. package/resource/integration/callkit/preset/vue/integration.md +356 -0
  43. package/resource/integration/chat/preset/android/integration.md +500 -0
  44. package/resource/integration/chat/preset/flutter/integration.md +370 -0
  45. package/resource/integration/chat/preset/ios/integration.md +566 -0
  46. package/resource/integration/chat/preset/react/integration.md +490 -0
  47. package/resource/integration/chat/preset/vue/integration.md +504 -0
  48. package/resource/{doc → integration}/livekit/preset/live/vue/live-list-integration.md +26 -22
  49. package/resource/{doc → integration}/livekit/preset/live/vue/live-player-desk-integration.md +22 -18
  50. package/resource/integration/livekit/preset/live/vue/live-player-h5-integration.md +309 -0
  51. package/resource/{doc → integration}/livekit/preset/live/vue/live-pusher-integration.md +47 -39
  52. package/resource/integration/roomkit/preset/vue/integration.md +562 -0
  53. package/resource/knowledge/callkit/core-sdk/android/answer-call.md +828 -0
  54. package/resource/knowledge/callkit/core-sdk/android/make-call.md +897 -0
  55. package/resource/knowledge/callkit/core-sdk/android/offline-push.md +363 -0
  56. package/resource/knowledge/callkit/core-sdk/flutter/answer-call.md +1111 -0
  57. package/resource/knowledge/callkit/core-sdk/flutter/make-call.md +1132 -0
  58. package/resource/{doc → knowledge}/callkit/core-sdk/flutter/offline-push.md +174 -151
  59. package/resource/knowledge/callkit/core-sdk/ios/answer-call.md +1084 -0
  60. package/resource/knowledge/callkit/core-sdk/ios/make-call.md +1252 -0
  61. package/resource/knowledge/callkit/core-sdk/ios/offline-push.md +534 -0
  62. package/resource/knowledge/callkit/core-sdk/uni-app/answer-call.md +953 -0
  63. package/resource/knowledge/callkit/core-sdk/uni-app/make-call.md +1061 -0
  64. package/resource/knowledge/callkit/faq/android.md +92 -0
  65. package/resource/{doc/callkit/faq/android-faq.md → knowledge/callkit/faq/common.md} +11 -12
  66. package/resource/knowledge/callkit/faq/error-code.md +67 -0
  67. package/resource/knowledge/callkit/faq/flutter.md +52 -0
  68. package/resource/knowledge/callkit/faq/ios.md +104 -0
  69. package/resource/knowledge/callkit/faq/web.md +74 -0
  70. package/resource/knowledge/callkit/preset/android/api.md +412 -0
  71. package/resource/knowledge/callkit/preset/flutter/api.md +22 -0
  72. package/resource/knowledge/callkit/preset/ios/api.md +234 -0
  73. package/resource/knowledge/callkit/preset/web/api.md +83 -0
  74. package/resource/knowledge/chat/preset/android/features/chat-setting.md +74 -0
  75. package/resource/knowledge/chat/preset/android/features/contact-list.md +43 -0
  76. package/resource/knowledge/chat/preset/android/features/conversation-list.md +117 -0
  77. package/resource/knowledge/chat/preset/android/features/language.md +136 -0
  78. package/resource/knowledge/chat/preset/android/features/message-input.md +57 -0
  79. package/resource/knowledge/chat/preset/android/features/message-list.md +142 -0
  80. package/resource/knowledge/chat/preset/android/features/search.md +64 -0
  81. package/resource/knowledge/chat/preset/android/features/theme.md +222 -0
  82. package/resource/knowledge/chat/preset/android-view/integration.md +300 -0
  83. package/resource/knowledge/chat/preset/flutter/features/chat-setting.md +64 -0
  84. package/resource/knowledge/chat/preset/flutter/features/contact-list.md +40 -0
  85. package/resource/knowledge/chat/preset/flutter/features/conversation-list.md +129 -0
  86. package/resource/knowledge/chat/preset/flutter/features/language.md +104 -0
  87. package/resource/knowledge/chat/preset/flutter/features/message-input.md +54 -0
  88. package/resource/knowledge/chat/preset/flutter/features/message-list.md +158 -0
  89. package/resource/knowledge/chat/preset/flutter/features/search.md +59 -0
  90. package/resource/knowledge/chat/preset/flutter/features/theme.md +261 -0
  91. package/resource/knowledge/chat/preset/ios/features/chat-setting.md +94 -0
  92. package/resource/knowledge/chat/preset/ios/features/contact-list.md +119 -0
  93. package/resource/knowledge/chat/preset/ios/features/conversation-list.md +134 -0
  94. package/resource/knowledge/chat/preset/ios/features/language.md +125 -0
  95. package/resource/knowledge/chat/preset/ios/features/message-input.md +69 -0
  96. package/resource/knowledge/chat/preset/ios/features/message-list.md +162 -0
  97. package/resource/knowledge/chat/preset/ios/features/search.md +93 -0
  98. package/resource/knowledge/chat/preset/ios/features/theme.md +270 -0
  99. package/resource/{doc/chatkit/ios → knowledge/chat/preset/ios-uikit}/integration.md +160 -158
  100. package/resource/knowledge/chat/preset/react/features/chat-setting.md +101 -0
  101. package/resource/{doc/chatkit/react/components → knowledge/chat/preset/react/features}/contact-list.md +43 -41
  102. package/resource/knowledge/chat/preset/react/features/conversation-actions.md +215 -0
  103. package/resource/knowledge/chat/preset/react/features/conversation-list.md +339 -0
  104. package/resource/knowledge/chat/preset/react/features/conversation-preview.md +101 -0
  105. package/resource/knowledge/chat/preset/react/features/conversation-search.md +61 -0
  106. package/resource/{doc/chatkit/react/components → knowledge/chat/preset/react/features}/message-input.md +117 -156
  107. package/resource/knowledge/chat/preset/react/features/message-list.md +297 -0
  108. package/resource/{doc/chatkit/react/components → knowledge/chat/preset/react/features}/search.md +65 -59
  109. package/resource/knowledge/chat/preset/react/features/theme.md +93 -0
  110. package/resource/knowledge/chat/preset/vue/features/chat-header.md +331 -0
  111. package/resource/knowledge/chat/preset/vue/features/chat-setting.md +79 -0
  112. package/resource/knowledge/chat/preset/vue/features/contact-list.md +277 -0
  113. package/resource/knowledge/chat/preset/vue/features/conversation-actions.md +234 -0
  114. package/resource/knowledge/chat/preset/vue/features/conversation-list.md +331 -0
  115. package/resource/knowledge/chat/preset/vue/features/conversation-preview.md +216 -0
  116. package/resource/{doc/chatkit/vue/components → knowledge/chat/preset/vue/features}/conversation-search.md +13 -13
  117. package/resource/knowledge/chat/preset/vue/features/message-input.md +551 -0
  118. package/resource/knowledge/chat/preset/vue/features/message-list.md +350 -0
  119. package/resource/{doc/chatkit/vue/components → knowledge/chat/preset/vue/features}/search.md +79 -73
  120. package/resource/knowledge/chat/preset/vue/features/theme.md +136 -0
  121. package/resource/knowledge/chat/urls/error-code.md +17 -0
  122. package/resource/knowledge/chat/urls/product.md +43 -0
  123. package/resource/knowledge/chat/urls/restapi.md +204 -0
  124. package/resource/knowledge/chat/urls/sdk/android.md +80 -0
  125. package/resource/knowledge/chat/urls/sdk/flutter.md +71 -0
  126. package/resource/knowledge/chat/urls/sdk/ios.md +80 -0
  127. package/resource/knowledge/chat/urls/sdk/web.md +80 -0
  128. package/resource/knowledge/chat/urls/webhook.md +68 -0
  129. package/resource/knowledge/livekit/core-sdk/api-reference/android/AudioEffectStore.md +286 -0
  130. package/resource/knowledge/livekit/core-sdk/api-reference/android/BarrageStore.md +174 -0
  131. package/resource/knowledge/livekit/core-sdk/api-reference/android/BattleStore.md +329 -0
  132. package/resource/knowledge/livekit/core-sdk/api-reference/android/CameraView.md +55 -0
  133. package/resource/knowledge/livekit/core-sdk/api-reference/android/CoGuestStore.md +434 -0
  134. package/resource/knowledge/livekit/core-sdk/api-reference/android/CoHostStore.md +362 -0
  135. package/resource/knowledge/livekit/core-sdk/api-reference/android/DeviceStore.md +466 -0
  136. package/resource/knowledge/livekit/core-sdk/api-reference/android/GiftStore.md +173 -0
  137. package/resource/knowledge/livekit/core-sdk/api-reference/android/LikeStore.md +51 -0
  138. package/resource/knowledge/livekit/core-sdk/api-reference/android/LiveAudienceStore.md +291 -0
  139. package/resource/knowledge/livekit/core-sdk/api-reference/android/LiveCoreView.md +78 -0
  140. package/resource/knowledge/livekit/core-sdk/api-reference/android/LiveSeatStore.md +488 -0
  141. package/resource/knowledge/livekit/core-sdk/api-reference/android/LoginStore.md +219 -0
  142. package/resource/knowledge/livekit/core-sdk/api-reference/flutter/AudioEffectStore.md +282 -0
  143. package/resource/knowledge/livekit/core-sdk/api-reference/flutter/BarrageStore.md +212 -0
  144. package/resource/knowledge/livekit/core-sdk/api-reference/flutter/BaseBeautyStore.md +153 -0
  145. package/resource/knowledge/livekit/core-sdk/api-reference/flutter/BattleStore.md +312 -0
  146. package/resource/knowledge/livekit/core-sdk/api-reference/flutter/CoGuestStore.md +404 -0
  147. package/resource/knowledge/livekit/core-sdk/api-reference/flutter/CoHostStore.md +334 -0
  148. package/resource/knowledge/livekit/core-sdk/api-reference/flutter/DeviceStore.md +426 -0
  149. package/resource/knowledge/livekit/core-sdk/api-reference/flutter/GiftStore.md +166 -0
  150. package/resource/knowledge/livekit/core-sdk/api-reference/flutter/LikeStore.md +52 -0
  151. package/resource/knowledge/livekit/core-sdk/api-reference/flutter/LiveAudienceStore.md +281 -0
  152. package/resource/knowledge/livekit/core-sdk/api-reference/flutter/LiveCoreView.md +150 -0
  153. package/resource/knowledge/livekit/core-sdk/api-reference/flutter/LiveSeatStore.md +438 -0
  154. package/resource/knowledge/livekit/core-sdk/api-reference/flutter/LoginStore.md +190 -0
  155. package/resource/knowledge/livekit/core-sdk/api-reference/ios/AudioEffectStore.md +291 -0
  156. package/resource/knowledge/livekit/core-sdk/api-reference/ios/BarrageStore.md +192 -0
  157. package/resource/knowledge/livekit/core-sdk/api-reference/ios/BaseBeautyStore.md +146 -0
  158. package/resource/knowledge/livekit/core-sdk/api-reference/ios/BattleStore.md +309 -0
  159. package/resource/knowledge/livekit/core-sdk/api-reference/ios/CoGuestStore.md +370 -0
  160. package/resource/knowledge/livekit/core-sdk/api-reference/ios/CoHostStore.md +339 -0
  161. package/resource/knowledge/livekit/core-sdk/api-reference/ios/DeviceStore.md +503 -0
  162. package/resource/knowledge/livekit/core-sdk/api-reference/ios/GiftStore.md +188 -0
  163. package/resource/knowledge/livekit/core-sdk/api-reference/ios/LikeStore.md +51 -0
  164. package/resource/knowledge/livekit/core-sdk/api-reference/ios/LiveAudienceStore.md +289 -0
  165. package/resource/knowledge/livekit/core-sdk/api-reference/ios/LiveCoreView.md +78 -0
  166. package/resource/knowledge/livekit/core-sdk/api-reference/ios/LiveSeatStore.md +487 -0
  167. package/resource/knowledge/livekit/core-sdk/api-reference/ios/LoginStore.md +183 -0
  168. package/resource/knowledge/livekit/core-sdk/api-reference/web/index.md +736 -0
  169. package/resource/{doc → knowledge}/livekit/core-sdk/live/android/live-audience-list.md +53 -47
  170. package/resource/{doc → knowledge}/livekit/core-sdk/live/android/live-audio-effect.md +28 -24
  171. package/resource/{doc → knowledge}/livekit/core-sdk/live/android/live-barrage.md +22 -18
  172. package/resource/{doc → knowledge}/livekit/core-sdk/live/android/live-base-beauty.md +17 -15
  173. package/resource/{doc → knowledge}/livekit/core-sdk/live/android/live-co-guest-interaction.md +19 -18
  174. package/resource/{doc → knowledge}/livekit/core-sdk/live/android/live-gift.md +102 -89
  175. package/resource/{doc → knowledge}/livekit/core-sdk/live/android/live-host-interaction.md +41 -37
  176. package/resource/{doc → knowledge}/livekit/core-sdk/live/android/live-integration.md +45 -43
  177. package/resource/{doc → knowledge}/livekit/core-sdk/live/android/live-live-list.md +23 -20
  178. package/resource/{doc → knowledge}/livekit/core-sdk/live/flutter/live-audience-list.md +41 -41
  179. package/resource/{doc → knowledge}/livekit/core-sdk/live/flutter/live-audio-effect.md +70 -69
  180. package/resource/{doc → knowledge}/livekit/core-sdk/live/flutter/live-barrage.md +68 -71
  181. package/resource/{doc → knowledge}/livekit/core-sdk/live/flutter/live-base-beauty.md +43 -47
  182. package/resource/{doc → knowledge}/livekit/core-sdk/live/flutter/live-co-guest-interaction.md +59 -56
  183. package/resource/{doc → knowledge}/livekit/core-sdk/live/flutter/live-gift.md +103 -105
  184. package/resource/knowledge/livekit/core-sdk/live/flutter/live-host-interaction.md +869 -0
  185. package/resource/{doc → knowledge}/livekit/core-sdk/live/flutter/live-integration.md +84 -87
  186. package/resource/{doc → knowledge}/livekit/core-sdk/live/flutter/live-live-list.md +43 -40
  187. package/resource/{doc → knowledge}/livekit/core-sdk/live/ios/live-audience-list.md +11 -10
  188. package/resource/{doc → knowledge}/livekit/core-sdk/live/ios/live-audio-effect.md +28 -24
  189. package/resource/{doc → knowledge}/livekit/core-sdk/live/ios/live-barrage.md +22 -18
  190. package/resource/{doc → knowledge}/livekit/core-sdk/live/ios/live-base-beauty.md +15 -14
  191. package/resource/{doc → knowledge}/livekit/core-sdk/live/ios/live-co-guest-interaction.md +19 -18
  192. package/resource/{doc → knowledge}/livekit/core-sdk/live/ios/live-gift.md +54 -50
  193. package/resource/{doc → knowledge}/livekit/core-sdk/live/ios/live-host-interaction.md +41 -37
  194. package/resource/{doc → knowledge}/livekit/core-sdk/live/ios/live-integration.md +40 -40
  195. package/resource/{doc → knowledge}/livekit/core-sdk/live/ios/live-live-list.md +19 -18
  196. package/resource/{doc → knowledge}/livekit/core-sdk/voice/android/voice-audience-list.md +53 -47
  197. package/resource/{doc → knowledge}/livekit/core-sdk/voice/android/voice-audio-effect.md +28 -24
  198. package/resource/{doc → knowledge}/livekit/core-sdk/voice/android/voice-barrage.md +22 -18
  199. package/resource/{doc → knowledge}/livekit/core-sdk/voice/android/voice-co-guest-interaction.md +41 -33
  200. package/resource/{doc → knowledge}/livekit/core-sdk/voice/android/voice-gift.md +94 -81
  201. package/resource/{doc → knowledge}/livekit/core-sdk/voice/android/voice-host-interaction.md +35 -30
  202. package/resource/{doc → knowledge}/livekit/core-sdk/voice/android/voice-integration.md +45 -42
  203. package/resource/{doc → knowledge}/livekit/core-sdk/voice/android/voice-room-list.md +23 -20
  204. package/resource/knowledge/livekit/core-sdk/voice/flutter/voice-audience-list.md +260 -0
  205. package/resource/knowledge/livekit/core-sdk/voice/flutter/voice-audio-effect.md +598 -0
  206. package/resource/knowledge/livekit/core-sdk/voice/flutter/voice-barrage.md +490 -0
  207. package/resource/{doc → knowledge}/livekit/core-sdk/voice/flutter/voice-co-guest-interaction.md +65 -59
  208. package/resource/knowledge/livekit/core-sdk/voice/flutter/voice-gift.md +424 -0
  209. package/resource/{doc → knowledge}/livekit/core-sdk/voice/flutter/voice-integration.md +69 -76
  210. package/resource/knowledge/livekit/core-sdk/voice/flutter/voice-room-list.md +726 -0
  211. package/resource/{doc → knowledge}/livekit/core-sdk/voice/ios/voice-audience-list.md +11 -10
  212. package/resource/{doc → knowledge}/livekit/core-sdk/voice/ios/voice-audio-effect.md +28 -24
  213. package/resource/{doc → knowledge}/livekit/core-sdk/voice/ios/voice-barrage.md +22 -18
  214. package/resource/{doc → knowledge}/livekit/core-sdk/voice/ios/voice-co-guest-interaction.md +41 -33
  215. package/resource/{doc → knowledge}/livekit/core-sdk/voice/ios/voice-gift.md +54 -50
  216. package/resource/{doc → knowledge}/livekit/core-sdk/voice/ios/voice-host-interaction.md +35 -30
  217. package/resource/{doc → knowledge}/livekit/core-sdk/voice/ios/voice-integration.md +49 -46
  218. package/resource/{doc → knowledge}/livekit/core-sdk/voice/ios/voice-room-list.md +19 -18
  219. package/resource/knowledge/livekit/faq/error-code.md +193 -0
  220. package/resource/{doc/livekit/preset/live/vue/components → knowledge/livekit/preset/live/vue/features}/barrage.md +56 -53
  221. package/resource/{doc/livekit/preset/live/vue/components → knowledge/livekit/preset/live/vue/features}/live-audience-list.md +22 -21
  222. package/resource/{doc/livekit/preset/live/vue/components → knowledge/livekit/preset/live/vue/features}/live-view.md +34 -32
  223. package/resource/knowledge/push/config/android.md +92 -0
  224. package/resource/knowledge/push/config/harmonyos.md +83 -0
  225. package/resource/knowledge/push/config/ios.md +254 -0
  226. package/resource/knowledge/push/config/react-native.md +254 -0
  227. package/resource/knowledge/push/config/unity.md +209 -0
  228. package/resource/knowledge/push/config/unreal-engine.md +194 -0
  229. package/resource/knowledge/push/integration/android.md +404 -0
  230. package/resource/knowledge/push/integration/flutter.md +465 -0
  231. package/resource/knowledge/push/integration/harmonyos.md +63 -0
  232. package/resource/knowledge/push/integration/ios.md +246 -0
  233. package/resource/knowledge/push/integration/react-native.md +366 -0
  234. package/resource/knowledge/push/integration/uni-app.md +208 -0
  235. package/resource/knowledge/push/integration/unity.md +389 -0
  236. package/resource/knowledge/push/integration/unreal-engine.md +390 -0
  237. package/resource/knowledge/push/overview/prepare.md +60 -0
  238. package/resource/knowledge/roomkit/core-sdk/android/call-user-to-room.md +241 -0
  239. package/resource/knowledge/roomkit/core-sdk/android/room-participant-state.md +588 -0
  240. package/resource/knowledge/roomkit/core-sdk/android/room-state.md +364 -0
  241. package/resource/knowledge/roomkit/core-sdk/android/schedule-room.md +340 -0
  242. package/resource/knowledge/roomkit/core-sdk/flutter/call-user-to-room.md +230 -0
  243. package/resource/knowledge/roomkit/core-sdk/flutter/room-participant-state.md +797 -0
  244. package/resource/knowledge/roomkit/core-sdk/flutter/room-state.md +325 -0
  245. package/resource/knowledge/roomkit/core-sdk/flutter/schedule-room.md +325 -0
  246. package/resource/knowledge/roomkit/core-sdk/ios/call-user-to-room.md +233 -0
  247. package/resource/knowledge/roomkit/core-sdk/ios/room-participant-state.md +569 -0
  248. package/resource/knowledge/roomkit/core-sdk/ios/room-state.md +325 -0
  249. package/resource/knowledge/roomkit/core-sdk/ios/schedule-room.md +322 -0
  250. package/resource/knowledge/roomkit/core-sdk/vue/call-user-to-room.md +221 -0
  251. package/resource/{doc/roomkit/vue/features → knowledge/roomkit/core-sdk/vue}/device-detection.md +49 -48
  252. package/resource/knowledge/roomkit/core-sdk/vue/device-state.md +461 -0
  253. package/resource/knowledge/roomkit/core-sdk/vue/free-beauty-panel.md +216 -0
  254. package/resource/knowledge/roomkit/core-sdk/vue/room-chat.md +370 -0
  255. package/resource/{doc/roomkit/vue/features → knowledge/roomkit/core-sdk/vue}/room-participant-state.md +61 -60
  256. package/resource/knowledge/roomkit/core-sdk/vue/room-state.md +280 -0
  257. package/resource/{doc/roomkit/vue/features → knowledge/roomkit/core-sdk/vue}/room-view.md +57 -56
  258. package/resource/knowledge/roomkit/core-sdk/vue/schedule-room.md +319 -0
  259. package/resource/knowledge/roomkit/core-sdk/vue/screen-share.md +267 -0
  260. package/resource/knowledge/roomkit/core-sdk/vue/virtual-background.md +261 -0
  261. package/resource/knowledge/roomkit/preset/android/integration.md +396 -0
  262. package/resource/knowledge/roomkit/preset/flutter/integration.md +404 -0
  263. package/resource/knowledge/roomkit/preset/ios/integration.md +369 -0
  264. package/resource/knowledge/roomkit/preset/react/integration.md +576 -0
  265. package/resource/knowledge/rtcengine/web/how_to_run_web_sdk_demo.md +44 -0
  266. package/resource/{doc → knowledge}/rtcengine/web/plugin/21-advanced-auto-play-policy.md +8 -2
  267. package/resource/{doc → knowledge}/rtcengine/web/plugin/22-advanced-audio-mixer.md +19 -1
  268. package/resource/{doc → knowledge}/rtcengine/web/plugin/23-advanced-support-detection.md +1 -1
  269. package/resource/{doc → knowledge}/rtcengine/web/plugin/24-advanced-network-quality.md +8 -8
  270. package/resource/{doc → knowledge}/rtcengine/web/plugin/25-advanced-device-change.md +1 -1
  271. package/resource/{doc → knowledge}/rtcengine/web/plugin/26-advanced-publish-cdn-stream.md +6 -6
  272. package/resource/{doc → knowledge}/rtcengine/web/plugin/27-advanced-small-stream.md +3 -3
  273. package/resource/{doc → knowledge}/rtcengine/web/plugin/29-advanced-water-mark.md +18 -0
  274. package/resource/{doc → knowledge}/rtcengine/web/plugin/31-advanced-plugins-overview.md +1 -1
  275. package/resource/{doc → knowledge}/rtcengine/web/plugin/34-advanced-proxy.md +2 -2
  276. package/resource/{doc → knowledge}/rtcengine/web/plugin/35-advanced-ai-denoiser.md +1 -1
  277. package/resource/knowledge/trtc/android/TRTCCloud.md +1915 -0
  278. package/resource/knowledge/trtc/android/TRTCCloudDef.md +1029 -0
  279. package/resource/knowledge/trtc/android/TRTCCloudListener.md +1095 -0
  280. package/resource/knowledge/trtc/android/TRTCStatistics.md +68 -0
  281. package/resource/knowledge/trtc/android/TXAudioEffectManager.md +502 -0
  282. package/resource/knowledge/trtc/android/TXBeautyManager.md +415 -0
  283. package/resource/knowledge/trtc/android/TXDeviceManager.md +169 -0
  284. package/resource/knowledge/trtc/android/TXLiteAVCode.md +125 -0
  285. package/resource/knowledge/trtc/c++/ITRTCCloud.md +2069 -0
  286. package/resource/knowledge/trtc/c++/ITRTCStatistics.md +73 -0
  287. package/resource/knowledge/trtc/c++/ITXAudioEffectManager.md +502 -0
  288. package/resource/knowledge/trtc/c++/ITXDeviceManager.md +391 -0
  289. package/resource/knowledge/trtc/c++/TRTCCloudCallback.md +1191 -0
  290. package/resource/knowledge/trtc/c++/TRTCTypeDef.md +931 -0
  291. package/resource/knowledge/trtc/c++/TXLiteAVCode.md +127 -0
  292. package/resource/knowledge/trtc/ios/TRTCCloud.md +2118 -0
  293. package/resource/knowledge/trtc/ios/TRTCCloudDef.md +975 -0
  294. package/resource/knowledge/trtc/ios/TRTCCloudDelegate.md +1131 -0
  295. package/resource/knowledge/trtc/ios/TRTCStatistics.md +68 -0
  296. package/resource/knowledge/trtc/ios/TXAudioEffectManager.md +423 -0
  297. package/resource/knowledge/trtc/ios/TXBeautyManager.md +416 -0
  298. package/resource/knowledge/trtc/ios/TXDeviceManager.md +387 -0
  299. package/resource/knowledge/trtc/ios/TXLiteAVCode.md +127 -0
  300. package/server.js +35 -10
  301. package/server.js.map +1 -1
  302. package/tools/call/get_native_call_uikit_integration.js +2 -3
  303. package/tools/call/get_native_call_uikit_integration.js.map +1 -1
  304. package/tools/call/get_native_callkit_core_integration.js +2 -5
  305. package/tools/call/get_native_callkit_core_integration.js.map +1 -1
  306. package/tools/call/get_web_call_uikit_integration.js +2 -3
  307. package/tools/call/get_web_call_uikit_integration.js.map +1 -1
  308. package/tools/chat/get_native_chat_uikit_integration.js +2 -3
  309. package/tools/chat/get_native_chat_uikit_integration.js.map +1 -1
  310. package/tools/chat/get_web_chat_uikit_integration.js +2 -3
  311. package/tools/chat/get_web_chat_uikit_integration.js.map +1 -1
  312. package/tools/common/present_framework_choice.js +19 -13
  313. package/tools/common/present_framework_choice.js.map +1 -1
  314. package/tools/common/record_answer.js +19 -25
  315. package/tools/common/record_answer.js.map +1 -1
  316. package/tools/common/record_feedback.js +17 -30
  317. package/tools/common/record_feedback.js.map +1 -1
  318. package/tools/common/search_trtc_knowledge.js +45 -0
  319. package/tools/common/search_trtc_knowledge.js.map +1 -0
  320. package/tools/definitions/get_native_call_uikit_integration_def.js +3 -1
  321. package/tools/definitions/get_native_call_uikit_integration_def.js.map +1 -1
  322. package/tools/definitions/get_native_callkit_core_integration_def.js +5 -3
  323. package/tools/definitions/get_native_callkit_core_integration_def.js.map +1 -1
  324. package/tools/definitions/get_native_chat_uikit_integration_def.js +5 -2
  325. package/tools/definitions/get_native_chat_uikit_integration_def.js.map +1 -1
  326. package/tools/definitions/get_native_livekit_core_integration_def.js +6 -5
  327. package/tools/definitions/get_native_livekit_core_integration_def.js.map +1 -1
  328. package/tools/definitions/get_web_call_uikit_integration_def.js +4 -2
  329. package/tools/definitions/get_web_call_uikit_integration_def.js.map +1 -1
  330. package/tools/definitions/get_web_chat_uikit_integration_def.js +2 -0
  331. package/tools/definitions/get_web_chat_uikit_integration_def.js.map +1 -1
  332. package/tools/definitions/get_web_live_uikit_integration_def.js +5 -5
  333. package/tools/definitions/get_web_live_uikit_integration_def.js.map +1 -1
  334. package/tools/definitions/get_web_room_core_integration_def.js +50 -0
  335. package/tools/definitions/get_web_room_core_integration_def.js.map +1 -0
  336. package/tools/definitions/get_web_room_uikit_integration_def.js +5 -4
  337. package/tools/definitions/get_web_room_uikit_integration_def.js.map +1 -1
  338. package/tools/definitions/integration-boundary.js +6 -0
  339. package/tools/definitions/integration-boundary.js.map +1 -0
  340. package/tools/definitions/present_framework_choice_def.js +12 -10
  341. package/tools/definitions/present_framework_choice_def.js.map +1 -1
  342. package/tools/definitions/record_answer_def.js +19 -17
  343. package/tools/definitions/record_answer_def.js.map +1 -1
  344. package/tools/definitions/record_feedback_def.js +14 -13
  345. package/tools/definitions/record_feedback_def.js.map +1 -1
  346. package/tools/definitions/search_trtc_knowledge_def.js +40 -0
  347. package/tools/definitions/search_trtc_knowledge_def.js.map +1 -0
  348. package/tools/index.js +5 -36
  349. package/tools/index.js.map +1 -1
  350. package/tools/live/get_native_livekit_core_integration.js +1 -3
  351. package/tools/live/get_native_livekit_core_integration.js.map +1 -1
  352. package/tools/live/get_web_live_uikit_integration.js +2 -4
  353. package/tools/live/get_web_live_uikit_integration.js.map +1 -1
  354. package/tools/room/get_web_room_core_integration.js +48 -0
  355. package/tools/room/get_web_room_core_integration.js.map +1 -0
  356. package/tools/room/get_web_room_uikit_integration.js +2 -3
  357. package/tools/room/get_web_room_uikit_integration.js.map +1 -1
  358. package/utils/generate-structured-result.js +24 -30
  359. package/utils/generate-structured-result.js.map +1 -1
  360. package/utils/get-doc-content.js +14 -8
  361. package/utils/get-doc-content.js.map +1 -1
  362. package/utils/report-cls-client.js +18 -20
  363. package/utils/report-cls-client.js.map +1 -1
  364. package/utils/report-es-client.js +1 -1
  365. package/resource/doc/callkit/core-sdk/.gitkeep +0 -0
  366. package/resource/doc/callkit/core-sdk/android/answer-call.md +0 -852
  367. package/resource/doc/callkit/core-sdk/android/make-call.md +0 -954
  368. package/resource/doc/callkit/core-sdk/android/offline-push.md +0 -361
  369. package/resource/doc/callkit/core-sdk/flutter/answer-call.md +0 -1160
  370. package/resource/doc/callkit/core-sdk/flutter/make-call.md +0 -1205
  371. package/resource/doc/callkit/core-sdk/ios/answer-call.md +0 -1090
  372. package/resource/doc/callkit/core-sdk/ios/make-call.md +0 -1248
  373. package/resource/doc/callkit/core-sdk/ios/offline-push.md +0 -485
  374. package/resource/doc/callkit/core-sdk/uni-app/answer-call.md +0 -950
  375. package/resource/doc/callkit/core-sdk/uni-app/make-call.md +0 -1052
  376. package/resource/doc/callkit/faq/common/error-code.md +0 -47
  377. package/resource/doc/callkit/faq/flutter-faq.md +0 -115
  378. package/resource/doc/callkit/faq/ios-faq.md +0 -115
  379. package/resource/doc/callkit/faq/web-faq.md +0 -36
  380. package/resource/doc/callkit/preset/android/api.md +0 -296
  381. package/resource/doc/callkit/preset/flutter/api.md +0 -410
  382. package/resource/doc/callkit/preset/flutter/integration.md +0 -164
  383. package/resource/doc/callkit/preset/ios/api.md +0 -80
  384. package/resource/doc/callkit/preset/ios/integration.md +0 -187
  385. package/resource/doc/callkit/preset/react/api.md +0 -501
  386. package/resource/doc/callkit/preset/react/integration.md +0 -86
  387. package/resource/doc/callkit/preset/vue/api.md +0 -501
  388. package/resource/doc/callkit/preset/vue/integration.md +0 -83
  389. package/resource/doc/chatkit/android/faq.md +0 -111
  390. package/resource/doc/chatkit/android/features/theme.md +0 -219
  391. package/resource/doc/chatkit/android/integration.md +0 -490
  392. package/resource/doc/chatkit/faq/android_sdk/client-api.md +0 -281
  393. package/resource/doc/chatkit/faq/common/product.md +0 -7
  394. package/resource/doc/chatkit/faq/common/server.md +0 -44
  395. package/resource/doc/chatkit/faq/common/server_error_code.md +0 -74
  396. package/resource/doc/chatkit/faq/flutter_sdk/client-api.md +0 -199
  397. package/resource/doc/chatkit/faq/flutter_sdk/faq.md +0 -53
  398. package/resource/doc/chatkit/faq/ios_sdk/client-api.md +0 -235
  399. package/resource/doc/chatkit/faq/web_sdk/error_code.md +0 -47
  400. package/resource/doc/chatkit/faq/web_sdk/faq.md +0 -287
  401. package/resource/doc/chatkit/flutter/faq.md +0 -23
  402. package/resource/doc/chatkit/flutter/features/theme.md +0 -235
  403. package/resource/doc/chatkit/flutter/integration.md +0 -344
  404. package/resource/doc/chatkit/ios/faq.md +0 -111
  405. package/resource/doc/chatkit/ios/features/theme.md +0 -267
  406. package/resource/doc/chatkit/react/components/avatar.md +0 -104
  407. package/resource/doc/chatkit/react/components/chat-header.md +0 -148
  408. package/resource/doc/chatkit/react/components/chat-setting.md +0 -57
  409. package/resource/doc/chatkit/react/components/chat.md +0 -38
  410. package/resource/doc/chatkit/react/components/component-list.md +0 -37
  411. package/resource/doc/chatkit/react/components/conversation-actions.md +0 -174
  412. package/resource/doc/chatkit/react/components/conversation-list.md +0 -333
  413. package/resource/doc/chatkit/react/components/conversation-preview.md +0 -118
  414. package/resource/doc/chatkit/react/components/conversation-search.md +0 -60
  415. package/resource/doc/chatkit/react/components/message-list.md +0 -293
  416. package/resource/doc/chatkit/react/components/tuikit.md +0 -34
  417. package/resource/doc/chatkit/react/faq.md +0 -26
  418. package/resource/doc/chatkit/react/integration.md +0 -416
  419. package/resource/doc/chatkit/vue/components/avatar.md +0 -104
  420. package/resource/doc/chatkit/vue/components/chat-header.md +0 -148
  421. package/resource/doc/chatkit/vue/components/chat-setting.md +0 -62
  422. package/resource/doc/chatkit/vue/components/chat.md +0 -45
  423. package/resource/doc/chatkit/vue/components/component-list.md +0 -87
  424. package/resource/doc/chatkit/vue/components/contact-list.md +0 -271
  425. package/resource/doc/chatkit/vue/components/conversation-actions.md +0 -228
  426. package/resource/doc/chatkit/vue/components/conversation-list.md +0 -320
  427. package/resource/doc/chatkit/vue/components/conversation-preview.md +0 -213
  428. package/resource/doc/chatkit/vue/components/message-input.md +0 -1054
  429. package/resource/doc/chatkit/vue/components/message-list.md +0 -433
  430. package/resource/doc/chatkit/vue/components/tuikit.md +0 -31
  431. package/resource/doc/chatkit/vue/components/userpicker.md +0 -256
  432. package/resource/doc/chatkit/vue/faq.md +0 -36
  433. package/resource/doc/chatkit/vue/integration.md +0 -428
  434. package/resource/doc/livekit/core-sdk/live/flutter/live-host-interaction.md +0 -866
  435. package/resource/doc/livekit/faq/common/error-code.md +0 -88
  436. package/resource/doc/livekit/preset/live/vue/api-reference/index.md +0 -780
  437. package/resource/doc/livekit/preset/live/vue/components/co-guest-panel.md +0 -91
  438. package/resource/doc/livekit/preset/live/vue/components/live-scene-panel.md +0 -112
  439. package/resource/doc/livekit/preset/live/vue/components/stream-mixer.md +0 -215
  440. package/resource/doc/livekit/preset/live/vue/live-player-h5-integration.md +0 -300
  441. package/resource/doc/roomkit/faq/common/error-code.md +0 -67
  442. package/resource/doc/roomkit/vue/features/call-user-to-room.md +0 -220
  443. package/resource/doc/roomkit/vue/features/device-state.md +0 -460
  444. package/resource/doc/roomkit/vue/features/free-beauty-panel.md +0 -215
  445. package/resource/doc/roomkit/vue/features/room-chat.md +0 -369
  446. package/resource/doc/roomkit/vue/features/room-state.md +0 -282
  447. package/resource/doc/roomkit/vue/features/schedule-room.md +0 -318
  448. package/resource/doc/roomkit/vue/features/screen-share.md +0 -265
  449. package/resource/doc/roomkit/vue/features/virtual-background.md +0 -271
  450. package/resource/doc/roomkit/vue/integration.md +0 -315
  451. package/resource/doc/rtcengine/faq/common/error_code.md +0 -1
  452. package/resource/doc/rtcengine/faq/web_sdk/.gitkeep +0 -0
  453. package/resource/doc/rtcengine/web/.gitkeep +0 -0
  454. package/resource/doc/rtcengine/web/how_to_run_web_sdk_demo.md +0 -59
  455. package/resource/doc/trtc/C++/ITRTCCloud.md +0 -1970
  456. package/resource/doc/trtc/C++/ITRTCStatistics.md +0 -70
  457. package/resource/doc/trtc/C++/ITXAudioEffectManager.md +0 -469
  458. package/resource/doc/trtc/C++/ITXDeviceManager.md +0 -387
  459. package/resource/doc/trtc/C++/TRTCCloudCallback.md +0 -1082
  460. package/resource/doc/trtc/C++/TRTCTypeDef.md +0 -925
  461. package/resource/doc/trtc/C++/TXLiteAVCode.md +0 -129
  462. package/resource/doc/trtc/android/TRTCCloud.md +0 -1815
  463. package/resource/doc/trtc/android/TRTCCloudDef.md +0 -992
  464. package/resource/doc/trtc/android/TRTCCloudListener.md +0 -1004
  465. package/resource/doc/trtc/android/TRTCStatistics.md +0 -65
  466. package/resource/doc/trtc/android/TXAudioEffectManager.md +0 -469
  467. package/resource/doc/trtc/android/TXBeautyManager.md +0 -402
  468. package/resource/doc/trtc/android/TXDeviceManager.md +0 -173
  469. package/resource/doc/trtc/android/TXLiteAVCode.md +0 -127
  470. package/resource/doc/trtc/iOS/TRTCCloud.md +0 -2028
  471. package/resource/doc/trtc/iOS/TRTCCloudDef.md +0 -958
  472. package/resource/doc/trtc/iOS/TRTCCloudDelegate.md +0 -1046
  473. package/resource/doc/trtc/iOS/TRTCStatistics.md +0 -65
  474. package/resource/doc/trtc/iOS/TXAudioEffectManager.md +0 -397
  475. package/resource/doc/trtc/iOS/TXBeautyManager.md +0 -403
  476. package/resource/doc/trtc/iOS/TXDeviceManager.md +0 -381
  477. package/resource/doc/trtc/iOS/TXLiteAVCode.md +0 -130
  478. package/tools/call/get_callkit_api.js +0 -33
  479. package/tools/call/get_callkit_api.js.map +0 -1
  480. package/tools/chat/get_native_chat_uikit_feature_detail.js +0 -35
  481. package/tools/chat/get_native_chat_uikit_feature_detail.js.map +0 -1
  482. package/tools/chat/get_web_chat_uikit_component_detail.js +0 -35
  483. package/tools/chat/get_web_chat_uikit_component_detail.js.map +0 -1
  484. package/tools/common/get_faq.js +0 -266
  485. package/tools/common/get_faq.js.map +0 -1
  486. package/tools/common/record_skill_session.js +0 -69
  487. package/tools/common/record_skill_session.js.map +0 -1
  488. package/tools/definitions/get_callkit_api_def.js +0 -29
  489. package/tools/definitions/get_callkit_api_def.js.map +0 -1
  490. package/tools/definitions/get_faq_def.js +0 -49
  491. package/tools/definitions/get_faq_def.js.map +0 -1
  492. package/tools/definitions/get_native_chat_uikit_feature_detail_def.js +0 -31
  493. package/tools/definitions/get_native_chat_uikit_feature_detail_def.js.map +0 -1
  494. package/tools/definitions/get_native_livekit_core_features_def.js +0 -34
  495. package/tools/definitions/get_native_livekit_core_features_def.js.map +0 -1
  496. package/tools/definitions/get_native_trtc_sdk_docs_def.js +0 -32
  497. package/tools/definitions/get_native_trtc_sdk_docs_def.js.map +0 -1
  498. package/tools/definitions/get_web_chat_uikit_component_detail_def.js +0 -31
  499. package/tools/definitions/get_web_chat_uikit_component_detail_def.js.map +0 -1
  500. package/tools/definitions/get_web_livekit_api_def.js +0 -30
  501. package/tools/definitions/get_web_livekit_api_def.js.map +0 -1
  502. package/tools/definitions/get_web_livekit_component_detail_def.js +0 -32
  503. package/tools/definitions/get_web_livekit_component_detail_def.js.map +0 -1
  504. package/tools/definitions/get_web_roomkit_feature_detail_def.js +0 -31
  505. package/tools/definitions/get_web_roomkit_feature_detail_def.js.map +0 -1
  506. package/tools/definitions/get_web_trtc_sdk_api_def.js +0 -27
  507. package/tools/definitions/get_web_trtc_sdk_api_def.js.map +0 -1
  508. package/tools/definitions/get_web_trtc_sdk_integration_def.js +0 -27
  509. package/tools/definitions/get_web_trtc_sdk_integration_def.js.map +0 -1
  510. package/tools/definitions/get_web_trtc_sdk_plugin_def.js +0 -27
  511. package/tools/definitions/get_web_trtc_sdk_plugin_def.js.map +0 -1
  512. package/tools/definitions/record_skill_session_def.js +0 -31
  513. package/tools/definitions/record_skill_session_def.js.map +0 -1
  514. package/tools/live/get_native_livekit_core_features.js +0 -68
  515. package/tools/live/get_native_livekit_core_features.js.map +0 -1
  516. package/tools/live/get_web_livekit_api.js +0 -33
  517. package/tools/live/get_web_livekit_api.js.map +0 -1
  518. package/tools/live/get_web_livekit_component_detail.js +0 -35
  519. package/tools/live/get_web_livekit_component_detail.js.map +0 -1
  520. package/tools/room/get_web_roomkit_feature_detail.js +0 -69
  521. package/tools/room/get_web_roomkit_feature_detail.js.map +0 -1
  522. package/tools/rtcengine/get_web_trtc_sdk_api.js +0 -32
  523. package/tools/rtcengine/get_web_trtc_sdk_api.js.map +0 -1
  524. package/tools/rtcengine/get_web_trtc_sdk_integration.js +0 -32
  525. package/tools/rtcengine/get_web_trtc_sdk_integration.js.map +0 -1
  526. package/tools/rtcengine/get_web_trtc_sdk_plugin.js +0 -32
  527. package/tools/rtcengine/get_web_trtc_sdk_plugin.js.map +0 -1
  528. package/tools/trtc/get_native_trtc_sdk_docs.js +0 -74
  529. package/tools/trtc/get_native_trtc_sdk_docs.js.map +0 -1
  530. package/utils/build-session-directives.js +0 -120
  531. package/utils/build-session-directives.js.map +0 -1
  532. package/utils/handle-framework.js +0 -9
  533. package/utils/handle-framework.js.map +0 -1
  534. package/utils/handle-state-name.js +0 -29
  535. package/utils/handle-state-name.js.map +0 -1
  536. package/utils/report-runtime-error-cls-client.js +0 -91
  537. package/utils/report-runtime-error-cls-client.js.map +0 -1
  538. /package/resource/{doc/livekit/preset/live/vue/faq.md → knowledge/push/config/donut.md} +0 -0
  539. /package/resource/{doc/roomkit/vue/faq.md → knowledge/push/integration/donut.md} +0 -0
  540. /package/resource/{doc → knowledge}/rtcengine/web/api.md +0 -0
  541. /package/resource/{doc/rtcengine/faq/web/web.md → knowledge/rtcengine/web/faq.md} +0 -0
  542. /package/resource/{doc → knowledge}/rtcengine/web/how_to_integrated_web_sdk.md +0 -0
  543. /package/resource/{doc → knowledge}/rtcengine/web/plugin/20-advanced-customized-capture-rendering.md +0 -0
  544. /package/resource/{doc → knowledge}/rtcengine/web/plugin/28-advanced-beauty.md +0 -0
  545. /package/resource/{doc → knowledge}/rtcengine/web/plugin/30-advanced-cross-room-link.md +0 -0
  546. /package/resource/{doc → knowledge}/rtcengine/web/plugin/36-advanced-virtual-background.md +0 -0
  547. /package/resource/{doc → knowledge}/rtcengine/web/plugin/37-advanced-voice-changer.md +0 -0
  548. /package/resource/{doc → knowledge}/rtcengine/web/plugin/39-advanced-video-decoder.md +0 -0
  549. /package/resource/{doc → knowledge}/rtcengine/web/plugin/40-advanced-video-mixer.md +0 -0
  550. /package/resource/{doc → knowledge}/rtcengine/web/plugin/41-advanced-small-stream-auto-switcher.md +0 -0
  551. /package/resource/{doc → knowledge}/rtcengine/web/plugin/42-advanced-realtime-transcriber.md +0 -0
  552. /package/resource/{doc → knowledge}/rtcengine/web/plugin/43-advanced-face-detection.md +0 -0
@@ -0,0 +1,1084 @@
1
+ This guide walks you through implementing the "answer call" feature using the **AtomicXCore SDK**, leveraging its **DeviceStore**, **CallStore**, and the core UI component **CallCoreView**.
2
+
3
+ ## Core Features
4
+
5
+ To build multi-party Audio/Video Call scenarios with **AtomicXCore**, you’ll use the following core modules:
6
+
7
+ |**Module**|**Description**|
8
+ |---------|---------|
9
+ |[CallCoreView](https://tencent-rtc.github.io/TUIKit_iOS/documentation/atomicxcore/callcoreview)|The main call UI component. It automatically observes CallStore data, renders video streams, and supports UI customization such as layout switching, avatar, and icon configuration.|
10
+ |[CallStore](https://tencent-rtc.github.io/TUIKit_iOS/documentation/atomicxcore/callstore)|Manages the call lifecycle: make call, answer call, reject call, hang up. Provides real-time access to participant audio/video status, call timer, call records, and related data.|
11
+ |[DeviceStore](https://tencent-rtc.github.io/TUIKit_iOS/documentation/atomicxcore/devicestore)|Controls audio/video devices: microphone (toggle/volume), camera (toggle/switch/quality), screen sharing, and real-time device status monitoring.|
12
+
13
+ ## Getting Started
14
+
15
+ ### Step 1: Activate the Service
16
+
17
+ Visit [Activate the Service](https://trtc.io/document/59832) to obtain either a trial or paid version of the SDK.
18
+
19
+ ### Step 2: Integrate the SDK
20
+ 1. **Add Pod Dependency:** Add `pod 'AtomicXCore'` to your project's `Podfile`.
21
+
22
+ ``` ruby
23
+ target 'YourProjectTarget' do
24
+ pod 'AtomicXCore'
25
+ end
26
+ ```
27
+
28
+ > **Tips:**
29
+ >
30
+
31
+ > **If your project does not have a Podfile:** In your terminal, navigate to your `.xcodeproj` directory and run `pod init` to generate a Podfile.
32
+ >
33
+
34
+ 2. **Install Components:** In the terminal, navigate to the directory containing your Podfile and run:
35
+
36
+ ``` bash
37
+ pod install --repo-update
38
+ ```
39
+
40
+ > **Tips:**
41
+ >
42
+
43
+ > After installation, open your project using the `YourProjectName.xcworkspace` file.
44
+ >
45
+
46
+ ### Step 3: Initialize and Log In
47
+
48
+ To start the call service, initialize CallStore and log in the user. CallStore will automatically sync user info after a successful login and enter the ready state. See the flowchart and sample code below:
49
+
50
+ ``` swift
51
+ import UIKit
52
+ import AtomicXCore
53
+ import Combine
54
+
55
+ class ViewController: UIViewController {
56
+ var cancellables = Set<AnyCancellable>()
57
+
58
+ override func viewDidLoad() {
59
+ super.viewDidLoad()
60
+ // Initialize CallStore
61
+ let _ = CallStore.shared
62
+
63
+ // Set up user information
64
+ let userID = "test_001" // Replace with your UserID
65
+ let sdkAppID: Int = 1400000001 // Replace with your SDKAppID from the console
66
+ let secretKey = "**************" // Replace with your SecretKey from the console
67
+
68
+ // Generate UserSig (for local testing only; always generate UserSig on your server in production)
69
+ let userSig = GenerateTestUserSig.genTestUserSig(
70
+ userID: userID,
71
+ sdkAppID: sdkAppID,
72
+ secretKey: secretKey
73
+ )
74
+
75
+ // Log in
76
+ LoginStore.shared.login(
77
+ sdkAppID: sdkAppID,
78
+ userID: userID,
79
+ userSig: userSig
80
+ ) { result in
81
+ switch result {
82
+ case .success:
83
+ Log.info("login success")
84
+ // Initialize TUICallEngine
85
+ TUICallEngine.createInstance().`init`(Int32(sdkAppID), userId: userID, userSig: userSig) {
86
+ Log.info("TUICallEngine init success")
87
+ } fail: { code, message in
88
+ Log.error("TUICallEngine init failed, code: \(code), message: \(message ?? "")")
89
+ }
90
+
91
+ case .failure(let error):
92
+ Log.error("login failed, code: \(error.code), error: \(error.message)")
93
+ }
94
+ }
95
+ }
96
+ }
97
+ ```
98
+ | <strong>Parameter</strong> | <strong>Type</strong> | <strong>Description</strong> |
99
+ | --- | --- | --- |
100
+ | userID | String | Unique identifier for the current user. Only letters, numbers, hyphens, and underscores are allowed. Avoid simple IDs like 1 or 123 to prevent multi-device login conflicts. |
101
+ | sdkAppID | int | Get this from the <a href="https://trtc.io/login?fro=gt&s_url=https%3A%2F%2Fconsole.trtc.io%2F">console</a>. |
102
+ | secretKey | String | SDKSecretKey for your audio/video application, available in the <a href="https://trtc.io/login?fro=gt&s_url=https%3A%2F%2Fconsole.trtc.io%2F">console</a>. |
103
+ | userSig | String | Authentication token for TRTC.<br>- <strong>Development:</strong> Use <a href="https://github.com/Tencent-RTC/TUIKit_iOS/blob/main/application/Debug/GenerateTestUserSig.swift">GenerateTestUserSig.genTestUserSig</a> or <a href="https://trtc.io/login?s_url=https://console.trtc.io/usersig">UserSig Tool</a> to generate a temporary UserSig.<br>- <strong>Production:</strong> Always generate UserSig server-side to prevent secret key leakage. See <a href="https://trtc.io/document/39074?product=call&menulabel=uikit&platform=ios">Server-side UserSig Generation</a> for details. For more info, see <a href="https://trtc.io/document/39074?product=call&menulabel=uikit&platform=ios">How to Calculate and Use UserSig</a>. |
104
+
105
+ ## Implement Answer Call
106
+
107
+ **Important:** Make sure the user is logged in before answering a call. This is required for the service to work. Follow these 6 steps to implement the answer call feature.
108
+
109
+ ### Step 1: Create Call Screen
110
+
111
+ You need a call screen that appears when a call is received.
112
+ 1. **Create the call screen:** Implement a new UIViewController to serve as the call screen. This screen will be presented when an incoming call arrives.
113
+
114
+ 2. **Attach **[CallCoreView](https://tencent-rtc.github.io/TUIKit_iOS/documentation/atomicxcore/callcoreview/)** to the call screen:** This core component observes **CallStore** data, renders video, and supports UI customization for layout, avatars, and icons.
115
+
116
+ ``` swift
117
+ import UIKit
118
+ import AtomicXCore
119
+
120
+ class CallViewController: UIViewController {
121
+ // 1. Create the call screen
122
+ override func viewDidLoad() {
123
+ super.viewDidLoad()
124
+ view.backgroundColor = .black
125
+ // 2. Attach CallCoreView to the call screen
126
+ callCoreView = CallCoreView(frame: view.bounds)
127
+ callCoreView?.autoresizingMask = [.flexibleWidth, .flexibleHeight]
128
+ if let callCoreView = callCoreView {
129
+ view.addSubview(callCoreView)
130
+ }
131
+ }
132
+ }
133
+ ```
134
+
135
+ **CallCoreView Feature Overview:**
136
+
137
+ |**Feature**|**Description**|**Reference**|
138
+ |---------|---------|---------|
139
+ |Set layout mode|Switch between different layout modes. If not set, layout adapts automatically based on participant count.|Switch layout mode|
140
+ |Set avatar|Set custom avatars for specific users by providing avatar resource paths.|Customize default avatar|
141
+ |Set volume indicator icon|Display custom volume indicator icons for different volume levels.|Customize volume indicator icon|
142
+ |Set network status icon|Show network status icons based on real-time network quality.|Customize network status icon|
143
+ |Set waiting animation for users|In multi-party calls, display a GIF animation for users in the waiting state.|Customize loading animation|
144
+
145
+ ### Step 2: Add Answer and Reject Controls
146
+
147
+ Use the APIs from [DeviceStore](https://tencent-rtc.github.io/TUIKit_iOS/documentation/atomicxcore/devicestore) and [CallStore](https://tencent-rtc.github.io/TUIKit_iOS/documentation/atomicxcore/callstore) to implement your call controls.
148
+ - **DeviceStore:** Controls microphone (toggle/volume), camera (toggle/switch/quality), screen sharing, and monitors real-time device status. Bind these methods to button actions and update the UI in real time by listening for device status changes.
149
+
150
+ - **CallStore:** Provides core call controls such as answer, hang up, and reject. Bind these methods to button actions and listen for call status changes to keep the UI in sync with the call state.
151
+
152
+ - **Icon resources:** Download button icons from [GitHub](http://github.com/Tencent-RTC/TUIKit_iOS/tree/main/call/TUICallKit_Swift/Resources/Assets.xcassets). These icons are designed for TUICallKit, copyright-free, and safe to use.
153
+
154
+ |**Icons**|||||||||
155
+ |---------|---------|---------|---------|---------|---------|---------|---------|---------|
156
+
157
+ - **Sample implementation for adding Answer and Reject buttons:**
158
+
159
+ 1. **Add Answer and Reject Buttons:** Add "Answer" and "Reject" buttons, and bind their actions to the [accept](https://tencent-rtc.github.io/TUIKit_iOS/documentation/atomicxcore/callstore/accept(completion:)) and [reject](https://tencent-rtc.github.io/TUIKit_iOS/documentation/atomicxcore/callstore/reject(completion:)) methods.
160
+
161
+ ``` swift
162
+ import UIKit
163
+ import AtomicXCore
164
+
165
+ class CallViewController: UIViewController {
166
+ private var buttonReject: UIButton?
167
+ private var buttonAccept: UIButton?
168
+
169
+ override func viewDidLoad() {
170
+ super.viewDidLoad()
171
+ view.backgroundColor = .black
172
+ addControlButtons()
173
+ }
174
+
175
+ private func addControlButtons() {
176
+ let buttonWidth: CGFloat = 80
177
+ let buttonHeight: CGFloat = 80
178
+ let spacing: CGFloat = 60
179
+ let bottomMargin: CGFloat = 100
180
+ let totalWidth = buttonWidth * 2 + spacing
181
+ let startX = (view.bounds.width - totalWidth) / 2
182
+ let buttonY = view.bounds.height - bottomMargin - buttonHeight
183
+
184
+ // Answer button
185
+ buttonAccept = createButton(
186
+ frame: CGRect(x: startX, y: buttonY, width: buttonWidth, height: buttonHeight),
187
+ title: "Answer",
188
+ backgroundColor: .systemGreen
189
+ )
190
+ buttonAccept?.addTarget(self, action: #selector(touchAcceptButton), for: .touchUpInside)
191
+ view.addSubview(buttonAccept!)
192
+
193
+ // Reject button
194
+ buttonReject = createButton(
195
+ frame: CGRect(x: startX + buttonWidth + spacing, y: buttonY, width: buttonWidth, height: buttonHeight),
196
+ title: "Reject",
197
+ backgroundColor: .systemRed
198
+ )
199
+ buttonReject?.addTarget(self, action: #selector(touchRejectButton), for: .touchUpInside)
200
+ view.addSubview(buttonReject!)
201
+ }
202
+
203
+ @objc private func touchAcceptButton() {
204
+ CallStore.shared.accept(completion: nil)
205
+ }
206
+
207
+ @objc private func touchRejectButton() {
208
+ CallStore.shared.reject(completion: nil)
209
+ }
210
+
211
+ private func createButton(frame: CGRect, title: String, backgroundColor: UIColor) -> UIButton {
212
+ let button = UIButton(type: .system)
213
+ button.frame = frame
214
+ button.setTitle(title, for: .normal)
215
+ button.setTitleColor(.white, for: .normal)
216
+ button.backgroundColor = backgroundColor
217
+ button.layer.cornerRadius = frame.width / 2
218
+ button.titleLabel?.font = UIFont.systemFont(ofSize: 16)
219
+ return button
220
+ }
221
+ }
222
+ ```
223
+ 2. **Close the call screen when the call ends:** Whether the caller cancels or the callee rejects, the `onCallEnded` event is triggered. Listen for this event and close (dismiss) the call screen when the call ends.
224
+
225
+ ``` swift
226
+ import UIKit
227
+ import AtomicXCore
228
+ import Combine
229
+
230
+ class CallViewController: UIViewController {
231
+ private var cancellables = Set<AnyCancellable>()
232
+
233
+ override func viewDidLoad() {
234
+ super.viewDidLoad()
235
+ addListener()
236
+ }
237
+
238
+ private func addListener() {
239
+ CallStore.shared.callEventPublisher
240
+ .receive(on: DispatchQueue.main)
241
+ .sink { [weak self] event in
242
+ if case .onCallEnded = event {
243
+ self?.dismiss(animated: true)
244
+ }
245
+ }
246
+ .store(in: &cancellables)
247
+ }
248
+ }
249
+ ```
250
+
251
+ ### Step 3: Request Audio/Video Permissions
252
+
253
+ Check audio and video permissions before connecting the call. If permissions are missing, prompt the user to grant them.
254
+ 1. **Declare permissions:** Add the following entries to your `Info.plist` file with appropriate usage descriptions. These will be displayed when the system requests permissions.
255
+
256
+ ``` xml
257
+ <key>NSCameraUsageDescription</key>
258
+ <string>Camera access is required for video calls and group video calls.</string>
259
+ <key>NSMicrophoneUsageDescription</key>
260
+ <string>Microphone access is required for audio calls, group audio calls, video calls, and group video calls.</string>
261
+ ```
262
+ 2. **Request permissions dynamically:** Request audio/video permissions when an incoming call is received, or as needed by your business logic.
263
+
264
+ ``` swift
265
+ import AVFoundation
266
+ import UIKit
267
+
268
+ extension UIViewController {
269
+ // Check microphone permission
270
+ func checkMicrophonePermission(completion: @escaping (Bool) -> Void) {
271
+ let status = AVCaptureDevice.authorizationStatus(for: .audio)
272
+ switch status {
273
+ case .authorized:
274
+ completion(true)
275
+ case .notDetermined:
276
+ AVCaptureDevice.requestAccess(for: .audio) { granted in
277
+ DispatchQueue.main.async {
278
+ completion(granted)
279
+ }
280
+ }
281
+ case .denied, .restricted:
282
+ completion(false)
283
+ @unknown default:
284
+ completion(false)
285
+ }
286
+ }
287
+
288
+ // Check camera permission
289
+ func checkCameraPermission(completion: @escaping (Bool) -> Void) {
290
+ let status = AVCaptureDevice.authorizationStatus(for: .video)
291
+ switch status {
292
+ case .authorized:
293
+ completion(true)
294
+ case .notDetermined:
295
+ AVCaptureDevice.requestAccess(for: .video) { granted in
296
+ DispatchQueue.main.async {
297
+ completion(granted)
298
+ }
299
+ }
300
+ case .denied, .restricted:
301
+ completion(false)
302
+ @unknown default:
303
+ completion(false)
304
+ }
305
+ }
306
+
307
+ // Show permission alert
308
+ func showPermissionAlert(message: String) {
309
+ let alert = UIAlertController(
310
+ title: "Permission Request",
311
+ message: message,
312
+ preferredStyle: .alert
313
+ )
314
+ alert.addAction(UIAlertAction(title: "Go to Settings", style: .default) { _ in
315
+ if let url = URL(string: UIApplication.openSettingsURLString) {
316
+ UIApplication.shared.open(url)
317
+ }
318
+ })
319
+ alert.addAction(UIAlertAction(title: "Cancel", style: .cancel))
320
+ present(alert, animated: true)
321
+ }
322
+ }
323
+ ```
324
+
325
+ ### Step 4: Handle Incoming Call Notifications
326
+
327
+ Listen for the current user's call status and play a ringtone or vibration when a call is incoming. Stop the notification when the call is answered or ends.
328
+ 1. **Subscribe to user status:** Subscribe to `CallStore.shared.state.value.selfInfo` to reactively monitor the current user's status.
329
+
330
+ 2. **Play/stop ringtone or vibration:** If `selfInfo.status` is `.waiting`, play a ringtone or vibration. If the status changes to `.accept`, stop the notification.
331
+
332
+ ``` swift
333
+ import UIKit
334
+ import AtomicXCore
335
+ import Combine
336
+ import AVFoundation
337
+
338
+ class MainViewController: UIViewController {
339
+ private var audioPlayer: AVAudioPlayer?
340
+ private var cancellables = Set<AnyCancellable>()
341
+
342
+ override func viewDidLoad() {
343
+ super.viewDidLoad()
344
+ observeSelfStatus()
345
+ }
346
+
347
+ private func observeSelfStatus() {
348
+ CallStore.shared.state
349
+ .subscribe(StatePublisherSelector<CallState, CallParticipantStatus>(keyPath: \.selfInfo.status))
350
+ .removeDuplicates()
351
+ .receive(on: DispatchQueue.main)
352
+ .sink { [weak self] status in
353
+ self?.handleRingtoneByStatus(status)
354
+ }
355
+ .store(in: &cancellables)
356
+ }
357
+
358
+ private func handleRingtoneByStatus(_ status: CallParticipantStatus) {
359
+ switch status {
360
+ case .waiting:
361
+ // Start ringtone while waiting to answer
362
+ // playRingtone()
363
+ case .accept:
364
+ // Stop ringtone after answering
365
+ // stopRingtone()
366
+ default:
367
+ // Stop ringtone for other statuses
368
+ // stopRingtone()
369
+ }
370
+ }
371
+ }
372
+ ```
373
+
374
+ ### Step 5: Enable Media Devices on Incoming Call
375
+
376
+ When an incoming call arrives, determine the media type via the [onCallReceived](https://tencent-rtc.github.io/TUIKit_iOS/documentation/atomicxcore/callevent/oncallreceived(callid:mediatype:userdata:)) event. Enable the appropriate media devices when the call UI is displayed.
377
+ 1. **Listen for incoming call event:** Subscribe to the `onCallReceived` event.
378
+
379
+ 2. **Enable devices based on media type:** For audio calls, enable the microphone only. For video calls, enable both the microphone and camera.
380
+
381
+ ``` swift
382
+ import UIKit
383
+ import AtomicXCore
384
+ import Combine
385
+
386
+ class MainViewController: UIViewController {
387
+ private var cancellables = Set<AnyCancellable>()
388
+
389
+ override func viewDidLoad() {
390
+ super.viewDidLoad()
391
+ addListener()
392
+ }
393
+
394
+ private func addListener() {
395
+ CallStore.shared.callEventPublisher
396
+ .receive(on: DispatchQueue.main)
397
+ .sink { [weak self] event in
398
+ if case .onCallReceived(_, let mediaType, _) = event {
399
+ self?.openDeviceForMediaType(mediaType)
400
+ }
401
+ }
402
+ .store(in: &cancellables)
403
+ }
404
+
405
+ private func openDeviceForMediaType(_ mediaType: CallMediaType) {
406
+ DeviceStore.shared.openLocalMicrophone(completion: nil)
407
+ if mediaType == .video {
408
+ let isFront = true
409
+ DeviceStore.shared.openLocalCamera(isFront: isFront, completion: nil)
410
+ }
411
+ }
412
+ }
413
+ ```
414
+
415
+ **openLocalCamera API Parameters:**
416
+
417
+ |**Parameter**|**Type**|**Required**|**Description**|
418
+ |---------|---------|---------|---------|
419
+ |isFront|Bool|Yes|Whether to use the front camera. - `true`: Front camera - `false`: Rear camera|
420
+ |completion|CompletionHandler|No|Completion callback, returns the result of enabling the camera. If it fails, returns error code and message.|
421
+
422
+ **openLocalMicrophone API Parameters:**
423
+
424
+ |**Parameter**|**Type**|**Required**|**Description**|
425
+ |---------|---------|---------|---------|
426
+ |completion|CompletionHandler|No|Completion callback, returns the result of enabling the microphone. If it fails, returns error code and message.|
427
+
428
+ ### Step 6: Present Call UI on Incoming Call
429
+
430
+ Listen for the [onCallReceived](https://tencent-rtc.github.io/TUIKit_iOS/documentation/atomicxcore/callevent/oncallreceived(callid:mediatype:userdata:)) event. When an incoming call is received, present the call screen.
431
+ 1. **Subscribe to the incoming call event:** Listen for `onCallReceived`.
432
+
433
+ 2. **Present the call screen:** Show the call UI when an incoming call is detected.
434
+
435
+ ``` swift
436
+ import UIKit
437
+ import AtomicXCore
438
+ import Combine
439
+
440
+ class MainViewController: UIViewController {
441
+ private var cancellables = Set<AnyCancellable>()
442
+
443
+ override func viewDidLoad() {
444
+ super.viewDidLoad()
445
+ addListener()
446
+ }
447
+
448
+ private func addListener() {
449
+ CallStore.shared.callEventPublisher
450
+ .receive(on: DispatchQueue.main)
451
+ .sink { [weak self] event in
452
+ if case .onCallReceived(_, _, _) = event {
453
+ let callVC = CallViewController()
454
+ callVC.modalPresentationStyle = .fullScreen
455
+ self?.present(callVC, animated: true)
456
+ }
457
+ }
458
+ .store(in: &cancellables)
459
+ }
460
+ }
461
+ ```
462
+
463
+ **onCallReceived Event Parameters:**
464
+
465
+ | <strong>Parameter</strong> | <strong>Type</strong> | <strong>Description</strong> |
466
+ | --- | --- | --- |
467
+ | callId | String | Unique identifier for the call. |
468
+ | mediaType | <a href="https://tencent-rtc.github.io/TUIKit_iOS/documentation/atomicxcore/callmediatype">CallMediaType</a> | Specifies whether the call is audio or video.<br>- <code>CallMediaType.video</code>: Video call<br>- <code>CallMediaType.audio</code>: Audio call |
469
+
470
+ ### Demo Effect
471
+
472
+ After completing the above 6 steps, your answer call feature will look like this:
473
+
474
+ ## Customize the Call UI
475
+
476
+ **CallCoreView** offers extensive UI customization, including support for custom avatars and volume indicator icons. To speed up your integration, you can download ready-to-use resources from [GitHub](http://github.com/Tencent-RTC/TUIKit_iOS/tree/main/call/TUICallKit_Swift/Resources/Assets.xcassets). All resources are copyright-free.
477
+
478
+ ### Custom Volume Indicator Icons
479
+
480
+ Use [setVolumeLevelIcons](https://tencent-rtc.github.io/TUIKit_iOS/documentation/atomicxcore/callcoreview/setvolumelevelicons(icons:)) to assign different icons for each volume level.
481
+
482
+ ``` swift
483
+ // Set volume indicator icons
484
+ let volumeLevelIcons: [VolumeLevel: String] = [
485
+ .mute: "path to the corresponding icon resource"
486
+ ]
487
+ callCoreView.setVolumeLevelIcons(icons: volumeLevelIcons)
488
+ ```
489
+
490
+ **setVolumeLevelIcons API Parameters:**
491
+ | <strong>Parameter</strong> | <strong>Type</strong> | <strong>Required</strong> | <strong>Description</strong> |
492
+ | --- | --- | --- | --- |
493
+ | icons | [VolumeLevel: String] | Yes | A dictionary mapping volume levels to icon resources.<br>Key (VolumeLevel):<br>- <code>VolumeLevel.mute</code>: Microphone muted<br>- <code>VolumeLevel.low</code>: Volume (0 ~ 25]<br>- <code>VolumeLevel.medium</code>: Volume (25 ~ 50]<br>- <code>VolumeLevel.high</code>: Volume (50 ~ 75]<br>- <code>VolumeLevel.peak</code>: Volume (75 ~ 100]<br>Value (String): Path to the icon resource for each level. |
494
+
495
+ **Volume Indicator Icons:**
496
+
497
+ |**Icon**|**Description**|
498
+ |---------|---------|
499
+ ||Volume indicator icon. Recommended for `VolumeLevel.low` or `VolumeLevel.medium`.|
500
+ ||Mute icon. Recommended for `VolumeLevel.mute`.|
501
+
502
+ ### Custom Network Status Icons
503
+
504
+ Use [setNetworkQualityIcons](https://tencent-rtc.github.io/TUIKit_iOS/documentation/atomicxcore/callcoreview/setnetworkqualityicons(icons:)) to set custom icons for different network states.
505
+
506
+ ``` swift
507
+ // Set network quality icons
508
+ let networkQualityIcons: [NetworkQuality: String] = [
509
+ .bad: "path to the corresponding icon"
510
+ ]
511
+ callCoreView.setNetworkQualityIcons(icons: networkQualityIcons)
512
+ ```
513
+
514
+ **setNetworkQualityIcons API Parameters:**
515
+ | <strong>Parameter</strong> | <strong>Type</strong> | <strong>Required</strong> | <strong>Description</strong> |
516
+ | --- | --- | --- | --- |
517
+ | icons | [NetworkQuality: String] | Yes | Network Quality Icon Mapping Table. The dictionary structure is defined as follows:<br>Key ( NetworkQuality ) : NetworkQuality<br>- <code>NetworkQuality.unknown</code> :Network status is undetermined.<br>- <code>NetworkQuality.excellent</code>:Outstanding network connection.<br>- <code>NetworkQuality.good</code> : Stable and good network connection.<br>- <code>NetworkQuality.poor</code> : Weak network signal.<br>- <code>NetworkQuality.bad</code> : Very weak or unstable network.<br>- <code>NetworkQuality.veryBad</code> :Extremely poor network, near disconnection.<br>- <code>NetworkQuality.down</code> :Network is disconnected.<br>Value ( String ) : The absolute path or resource name of the icon corresponding to each network status level. |
518
+
519
+ **Poor Network Indicator Icon:**
520
+
521
+ |**Icon**|**Description**|
522
+ |---------|---------|
523
+ ||Poor network indicator icon. Recommended for `NetworkQuality.bad`, `NetworkQuality.veryBad`, or `NetworkQuality.down`.|
524
+
525
+ ### Custom Default Avatar
526
+
527
+ Use [setParticipantAvatars](https://tencent-rtc.github.io/TUIKit_iOS/documentation/atomicxcore/callcoreview/setparticipantavatars(avatars:)) to set user avatars. Listen to the [allParticipants](https://tencent-rtc.github.io/TUIKit_iOS/documentation/atomicxcore/callstate/allparticipants) data to update avatars as needed. If an avatar is not set or fails to load, the default avatar is displayed.
528
+ ``` swift
529
+ // Set user avatars
530
+ var avatars: [String: String] = [:]
531
+ let userId = "" // User ID
532
+ let avatarPath = "" // Path to user's default avatar resource
533
+ avatars[userId] = avatarPath
534
+
535
+ callCoreView.setParticipantAvatars(avatars: avatars)
536
+ ```
537
+
538
+ **setParticipantAvatars API Parameters:**
539
+
540
+ |**Parameter**|**Type**|Required|**Description**|
541
+ |---------|---------|---------|---------|
542
+ |avatars|[String: String]|Yes|A dictionary mapping userID to the absolute path of the user's avatar resource.|
543
+
544
+ **Default Avatar Resource:**
545
+
546
+ |**Icon**|**Description**|
547
+ |---------|---------|
548
+ ||Default avatar. Use as the fallback when a user's avatar fails to load or is not set.|
549
+
550
+ ### Custom Waiting Animation
551
+
552
+ Use [setWaitingAnimation](https://tencent-rtc.github.io/TUIKit_iOS/documentation/atomicxcore/callcoreview/setwaitinganimation(path:)) to display a waiting animation for users in the waiting state.
553
+
554
+ ``` swift
555
+ // Set waiting animation
556
+ let waitingAnimationPath = "" // Path to the waiting animation GIF resource
557
+ callCoreView.setWaitingAnimation(path: waitingAnimationPath)
558
+ ```
559
+
560
+ **setWaitingAnimation API Parameters:**
561
+
562
+ |**Parameter**|**Type**|**Required**|**Description**|
563
+ |---------|---------|---------|---------|
564
+ |path|String|Yes|Absolute path to the GIF animation resource.|
565
+
566
+ **Waiting Animation:**
567
+
568
+ |**Icon**|**Description**|
569
+ |---------|---------|
570
+ ||User waiting animation. Recommended for group calls; display when a user's status is waiting.|
571
+
572
+ ### Add Call Timer
573
+
574
+ You can display the call duration in real time by subscribing to the [activeCall](https://tencent-rtc.github.io/TUIKit_iOS/documentation/atomicxcore/callstate/activecall) field `duration`.
575
+ 1. **Subscribe to the active call:** Listen to `CallStore.observerState.activeCall` for updates.
576
+
577
+ 2. **Bind duration to your UI:** Bind `activeCall.duration` to your timer UI. This field is reactive and updates automatically; you do not need to manage a timer manually.
578
+
579
+ ``` swift
580
+ import UIKit
581
+ import AtomicXCore
582
+ import Combine
583
+
584
+ class TimerView: UILabel {
585
+ private var cancellables = Set<AnyCancellable>()
586
+
587
+ override init(frame: CGRect) {
588
+ super.init(frame: frame)
589
+ setupView()
590
+ }
591
+
592
+ required init?(coder: NSCoder) {
593
+ super.init(coder: coder)
594
+ setupView()
595
+ }
596
+
597
+ private func setupView() {
598
+ textColor = .white
599
+ textAlignment = .center
600
+ font = .systemFont(ofSize: 16)
601
+ }
602
+
603
+ override func didMoveToWindow() {
604
+ super.didMoveToWindow()
605
+ if window != nil {
606
+ registerActiveCallObserver()
607
+ } else {
608
+ cancellables.removeAll()
609
+ }
610
+ }
611
+
612
+ private func registerActiveCallObserver() {
613
+ CallStore.shared.state.subscribe()
614
+ .map { $0.activeCall }
615
+ .removeDuplicates { $0.duration == $1.duration }
616
+ .receive(on: DispatchQueue.main)
617
+ .sink { [weak self] activeCall in
618
+ self?.updateDurationView(activeCall: activeCall)
619
+ }
620
+ .store(in: &cancellables)
621
+ }
622
+
623
+ private func updateDurationView(activeCall: CallInfo) {
624
+ let currentDuration = activeCall.duration
625
+ let minutes = currentDuration / 60
626
+ let seconds = currentDuration % 60
627
+ text = String(format: "%02d:%02d", minutes, seconds)
628
+ }
629
+ }
630
+ ```
631
+
632
+ > **Note:**
633
+ >
634
+
635
+ > For more reactive call status data, see [CallState](https://tencent-rtc.github.io/TUIKit_iOS/documentation/atomicxcore/callstate).
636
+ >
637
+
638
+ ## More Features
639
+
640
+ ### Set User Avatar and Nickname
641
+
642
+ Before a call starts, set your own nickname and avatar using [setSelfInfo](https://tencent-rtc.github.io/TUIKit_iOS/documentation/atomicxcore/loginstore/setselfinfo(userprofile:completion:)).
643
+ ``` swift
644
+ import AtomicXCore
645
+
646
+ var userProfile = UserProfile()
647
+ userProfile.userID = "" // Your userId
648
+ userProfile.avatarURL = "" // Avatar URL
649
+ userProfile.nickname = "" // Nickname
650
+
651
+ LoginStore.shared.setSelfInfo(userProfile: userProfile) { result in
652
+ switch result {
653
+ case .success:
654
+ // Successfully set
655
+ case .failure(let error):
656
+ // Failed to set
657
+ }
658
+ }
659
+ ```
660
+
661
+ **setSelfInfo API Parameters:**
662
+ | <strong>Parameter</strong> | <strong>Type</strong> | <strong>Required</strong> | <strong>Description</strong> |
663
+ | --- | --- | --- | --- |
664
+ | userProfile | <a href="https://tencent-rtc.github.io/TUIKit_iOS/documentation/atomicxcore/userprofile">UserProfile</a> | Yes | User info struct:<br>- <code>userID</code>: User ID<br>- <code>avatarURL</code>: User avatar URL<br>- <code>nickname</code>: User nickname<br>For more field details, please refer to the <a href="https://tencent-rtc.github.io/TUIKit_iOS/documentation/atomicxcore/userprofile">UserProfile</a> class. |
665
+ | completion | CompletionHandler | No | Completion callback, returns the result of the operation. |
666
+
667
+ ### Switch Layout Modes
668
+
669
+ **CallCoreView** supports three built-in layout modes. Use [setLayoutTemplate](https://tencent-rtc.github.io/TUIKit_iOS/documentation/atomicxcore/callcoreview/setlayouttemplate(_:)) to set the layout. If not set, **CallCoreView** will automatically use `Float` mode for 1v1 calls and `Grid` mode for multi-party calls.
670
+ | <strong>Float Mode</strong> | <strong>Grid Mode</strong> | <strong>PIP Mode</strong> |
671
+ | --- | --- | --- |
672
+ | | | |
673
+ | - <strong>Layout:</strong> While waiting, display your own video full screen. After answering, show the remote video full screen and your own video as a floating window.<br>- <strong>Interaction:</strong> Drag the small window or tap to swap big/small video. | - <strong>Layout:</strong> All participant videos are tiled in a grid. Best for 2+ participants. Tap to enlarge a video.<br>- <strong>Interaction:</strong> Tap a participant to enlarge their video. | - <strong>Layout:</strong> In 1v1, remote video is fixed; in multi-party, the active speaker is shown full screen.<br>- <strong>Interaction:</strong> Shows your own video while waiting, displays call timer after answering. |
674
+
675
+ ``` swift
676
+ // Create CallCoreView
677
+ let callCoreView = CallCoreView(frame: view.bounds)
678
+ callCoreView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
679
+
680
+ // Set layout mode
681
+ let template = CallLayoutTemplate.grid
682
+ callCoreView.setLayoutTemplate(template)
683
+ ```
684
+
685
+ **setLayoutTemplate API Parameters:**
686
+ | <strong>Parameter</strong> | <strong>Type</strong> | <strong>Required</strong> | <strong>Description</strong> |
687
+ | --- | --- | --- | --- |
688
+ | template | <a href="https://tencent-rtc.github.io/TUIKit_iOS/documentation/atomicxcore/calllayouttemplate">CallLayoutTemplate</a> | Yes | CallCoreView's layout mode<br>- <code>CallLayoutTemplate.float</code> :<br>- <strong>Layout:</strong> While waiting, display your own video full screen. After answering, show the remote video full screen and your own video as a floating window.<br>- <strong>Interaction:</strong> Drag the small window or tap to swap big/small video.<br>- <code>CallLayoutTemplate.grid</code> :<br>- <strong>Layout:</strong> All participant videos are tiled in a grid. Best for 2+ participants. Tap to enlarge a video.<br>- <strong>Interaction:</strong> Tap a participant to enlarge their video.<br>- <code>CallLayoutTemplate.pip</code> :<br>- <strong>Layout:</strong> In 1v1, remote video is fixed; in multi-party, the active speaker is shown full screen.<br>- <strong>Interaction:</strong> Shows your own video while waiting, displays call timer after answering. |
689
+
690
+ ### Implement In-App Floating Window
691
+
692
+ The AtomicXCore SDK provides a `CallPipView` component for in-app floating windows. If your call UI is covered by other pages (e.g., user presses back while a call is ongoing), a floating window can be shown so users can always see call status and quickly return to the call UI.
693
+
694
+ **Step 1:** Create the floating window controller.
695
+ ``` swift
696
+ import UIKit
697
+ import AtomicXCore
698
+ import Combine
699
+
700
+ /**
701
+ * Floating Window Controller
702
+ * * Used to display the call floating window, containing a CallCoreView internally.
703
+ */
704
+ class FloatWindowViewController: UIViewController {
705
+
706
+ var tapGestureAction: (() -> Void)?
707
+ private var cancellables = Set<AnyCancellable>()
708
+
709
+ private lazy var callCoreView: CallCoreView = {
710
+ let view = CallCoreView(frame: self.view.bounds)
711
+ view.autoresizingMask = [.flexibleWidth, .flexibleHeight]
712
+ view.setLayoutTemplate(.pip) // Set to Picture-in-Picture (PiP) layout mode
713
+ view.isUserInteractionEnabled = false // Disable interaction to allow touch events to pass through to the parent view
714
+ return view
715
+ }()
716
+
717
+ override func viewDidLoad() {
718
+ super.viewDidLoad()
719
+ view.backgroundColor = UIColor(white: 0.1, alpha: 1.0)
720
+ view.layer.cornerRadius = 10
721
+ view.layer.masksToBounds = true
722
+
723
+ view.addSubview(callCoreView)
724
+
725
+ // Add tap gesture recognizer
726
+ let tapGesture = UITapGestureRecognizer(target: self, action: #selector(handleTap))
727
+ view.addGestureRecognizer(tapGesture)
728
+
729
+ // Delay observing state changes to prevent the window from closing immediately upon creation
730
+ DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) { [weak self] in
731
+ self?.observeCallStatus()
732
+ }
733
+ }
734
+
735
+ @objc private func handleTap() {
736
+ tapGestureAction?()
737
+ }
738
+
739
+ /**
740
+ * Observe call status changes
741
+ * Automatically closes the floating window when the call ends.
742
+ */
743
+ private func observeCallStatus() {
744
+ CallStore.shared.state
745
+ .subscribe(StatePublisherSelector<CallState, CallParticipantStatus>(keyPath: \.selfInfo.status))
746
+ .removeDuplicates()
747
+ .receive(on: DispatchQueue.main)
748
+ .sink { [weak self] status in
749
+ if status == .none {
750
+ // Call ended, post a notification to hide the floating window
751
+ NotificationCenter.default.post(name: NSNotification.Name("HideFloatingWindow"), object: nil)
752
+ }
753
+ }
754
+ .store(in: &cancellables)
755
+ }
756
+
757
+ deinit {
758
+ cancellables.removeAll()
759
+ }
760
+ }
761
+ ```
762
+
763
+ **Step 2:** Add floating window management logic to your main UI.
764
+ ``` swift
765
+ import UIKit
766
+ import AtomicXCore
767
+
768
+ class MainViewController: UIViewController {
769
+
770
+ private var floatWindow: UIWindow?
771
+
772
+ override func viewDidLoad() {
773
+ super.viewDidLoad()
774
+
775
+ // Observe notification to display the floating window
776
+ NotificationCenter.default.addObserver(
777
+ self,
778
+ selector: #selector(showFloatingWindow),
779
+ name: NSNotification.Name("ShowFloatingWindow"),
780
+ object: nil
781
+ )
782
+
783
+ // Observe notification to hide the floating window
784
+ NotificationCenter.default.addObserver(
785
+ self,
786
+ selector: #selector(hideFloatingWindow),
787
+ name: NSNotification.Name("HideFloatingWindow"),
788
+ object: nil
789
+ )
790
+ }
791
+
792
+ /**
793
+ * Displays the in-app floating window
794
+ */
795
+ @objc private func showFloatingWindow() {
796
+ // Check if a call is currently active/accepted
797
+ let selfStatus = CallStore.shared.state.value.selfInfo.status
798
+ guard selfStatus == .accept else {
799
+ return
800
+ }
801
+
802
+ // Prevent duplicate creation if the floating window already exists
803
+ guard floatWindow == nil else { return }
804
+
805
+ // ⚠️ CRITICAL: The window must be created using the current windowScene
806
+ guard let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene else {
807
+ return
808
+ }
809
+
810
+ // Define floating window dimensions (9:16 aspect ratio)
811
+ let pipWidth: CGFloat = 100
812
+ let pipHeight: CGFloat = pipWidth * 16 / 9
813
+ let pipX = UIScreen.main.bounds.width - pipWidth - 20
814
+ let pipY: CGFloat = 100
815
+
816
+ // Initialize the floating UIWindow and associate it with the windowScene
817
+ let window = UIWindow(windowScene: windowScene)
818
+ window.windowLevel = .alert + 1 // Ensure it stays on top of the main UI
819
+ window.backgroundColor = .clear
820
+ window.frame = CGRect(x: pipX, y: pipY, width: pipWidth, height: pipHeight)
821
+
822
+ // Initialize the floating window controller
823
+ let floatVC = FloatWindowViewController()
824
+ floatVC.tapGestureAction = { [weak self] in
825
+ self?.openCallViewController()
826
+ }
827
+
828
+ window.rootViewController = floatVC
829
+
830
+ self.floatWindow = window
831
+
832
+ // Make the window visible
833
+ window.isHidden = false
834
+ window.makeKeyAndVisible()
835
+
836
+ // Immediately restore the main window as the key window to maintain proper focus
837
+ if let mainWindow = windowScene.windows.first(where: { $0 != window }) {
838
+ mainWindow.makeKey()
839
+ }
840
+ }
841
+
842
+ /**
843
+ * Hides the in-app floating window
844
+ */
845
+ @objc private func hideFloatingWindow() {
846
+ floatWindow?.isHidden = true
847
+ floatWindow = nil
848
+ }
849
+
850
+ /**
851
+ * Opens the call interface (triggered by tapping the floating window)
852
+ */
853
+ private func openCallViewController() {
854
+ // Dismiss the floating window first
855
+ hideFloatingWindow()
856
+
857
+ // Retrieve the current top-most ViewController
858
+ guard let topVC = getTopViewController() else {
859
+ return
860
+ }
861
+
862
+ let callVC = CallViewController()
863
+ callVC.modalPresentationStyle = .fullScreen
864
+ topVC.present(callVC, animated: true)
865
+ }
866
+
867
+ /**
868
+ * Helper method to find the top-most ViewController in the current view hierarchy
869
+ */
870
+ private func getTopViewController() -> UIViewController? {
871
+ guard let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene,
872
+ let keyWindow = windowScene.windows.first(where: { $0.isKeyWindow }),
873
+ let rootVC = keyWindow.rootViewController else {
874
+ return nil
875
+ }
876
+
877
+ var topVC = rootVC
878
+ while let presentedVC = topVC.presentedViewController {
879
+ topVC = presentedVC
880
+ }
881
+
882
+ return topVC
883
+ }
884
+
885
+ deinit {
886
+ NotificationCenter.default.removeObserver(self)
887
+ }
888
+ }
889
+ ```
890
+
891
+ **Step 3:** Add floating window trigger logic in the call UI.
892
+ ``` swift
893
+ import UIKit
894
+ import AtomicXCore
895
+
896
+ class CallViewController: UIViewController {
897
+
898
+ override func viewWillAppear(_ animated: Bool) {
899
+ super.viewWillAppear(animated)
900
+
901
+ // Post a notification to hide the floating window when entering the call interface.
902
+ NotificationCenter.default.post(name: NSNotification.Name("HideFloatingWindow"), object: nil)
903
+ }
904
+
905
+ override func viewWillDisappear(_ animated: Bool) {
906
+ super.viewWillDisappear(animated)
907
+
908
+ // When leaving the call interface, check if the call is still active.
909
+ let selfStatus = CallStore.shared.state.value.selfInfo.status
910
+ if selfStatus == .accept {
911
+ // If the call is still ongoing, post a notification to display the floating window.
912
+ NotificationCenter.default.post(name: NSNotification.Name("ShowFloatingWindow"), object: nil)
913
+ }
914
+ }
915
+ }
916
+ ```
917
+
918
+ ### Implement System Picture-in-Picture (PiP)
919
+
920
+ AtomicXCore SDK supports system PiP via the underlying TRTC engine. When the app goes to the background, the call video can float as a system PiP window above other apps, allowing users to continue video calls while multitasking.
921
+
922
+ > **Note:**
923
+ >
924
+ > 1. Add the `Background Modes` capability in Xcode's `Signing & Capabilities` and enable `Audio, AirPlay, and Picture in Picture`.
925
+ > 2. Requires iOS 15.0 or later.
926
+
927
+ 1. **Configure PiP parameters:** Set fill mode, user video regions, canvas parameters, etc.
928
+
929
+ ``` swift
930
+ import AtomicXCore
931
+
932
+ // Fill Mode Enumeration
933
+ enum PictureInPictureFillMode: Int, Codable {
934
+ case fill = 0 // Aspect Fill: Scales the content to fill the view (may crop)
935
+ case fit = 1 // Aspect Fit: Scales the content to fit the view (no cropping)
936
+ }
937
+
938
+ // User Video Region
939
+ struct PictureInPictureRegion: Codable {
940
+ let userId: String // Unique User ID
941
+ let width: Double // Width (0.0 - 1.0, relative to the canvas)
942
+ let height: Double // Height (0.0 - 1.0, relative to the canvas)
943
+ let x: Double // X-coordinate (0.0 - 1.0, relative to the top-left of the canvas)
944
+ let y: Double // Y-coordinate (0.0 - 1.0, relative to the top-left of the canvas)
945
+ let fillMode: PictureInPictureFillMode // Content fill mode
946
+ let streamType: String // Stream type ("high" for HD or "low" for SD)
947
+ let backgroundColor: String // Background color (e.g., Hex string)
948
+ }
949
+
950
+ // Canvas Configuration
951
+ struct PictureInPictureCanvas: Codable {
952
+ let width: Int // Canvas width in pixels
953
+ let height: Int // Canvas height in pixels
954
+ let backgroundColor: String // Background color
955
+ }
956
+
957
+ // Picture-in-Picture Parameters
958
+ struct PictureInPictureParams: Codable {
959
+ let enable: Bool // Toggle PiP functionality
960
+ let cameraBackgroundCapture: Bool? // Whether to continue camera capture in the background
961
+ let canvas: PictureInPictureCanvas? // Canvas configuration (Optional)
962
+ let regions: [PictureInPictureRegion]? // List of user video regions (Optional)
963
+ }
964
+
965
+ // Picture-in-Picture Request
966
+ struct PictureInPictureRequest: Codable {
967
+ let api: String // API name/identifier
968
+ let params: PictureInPictureParams // Parameter payload
969
+ }
970
+ ```
971
+ 2. **Enable PiP:** Use `configPictureInPicture` to enable or disable PiP.
972
+
973
+ ``` swift
974
+ let params = PictureInPictureParams(
975
+ enable: true,
976
+ cameraBackgroundCapture: true,
977
+ canvas: nil,
978
+ regions: nil
979
+ )
980
+
981
+ let request = PictureInPictureRequest(
982
+ api: "configPictureInPicture",
983
+ params: params
984
+ )
985
+
986
+ // Encode the request into a JSON string
987
+ let encoder = JSONEncoder()
988
+ if let data = try? encoder.encode(request),
989
+ let jsonString = String(data: data, encoding: .utf8) {
990
+ // Invoke the experimental API via the TUICallEngine instance
991
+ TUICallEngine.createInstance().callExperimentalAPI(jsonObject: jsonString)
992
+ }
993
+ ```
994
+
995
+ ### Keep Screen Awake During Calls
996
+
997
+ To prevent the screen from sleeping during a call, set `UIApplication.shared.isIdleTimerDisabled = true` when the call UI appears, and restore it when the UI disappears.
998
+ ``` swift
999
+ class CallViewController: UIViewController {
1000
+ override func viewDidLoad() {
1001
+ super.viewDidLoad()
1002
+ UIApplication.shared.isIdleTimerDisabled = true
1003
+ }
1004
+ override func viewWillDisappear(_ animated: Bool) {
1005
+ super.viewWillDisappear(animated)
1006
+ UIApplication.shared.isIdleTimerDisabled = false
1007
+ }
1008
+ }
1009
+ ```
1010
+
1011
+ ### Background Audio/Video Capture Issues
1012
+
1013
+ To allow your app to capture audio and video in the background (e.g., when locked or switched to another app), you must:
1014
+ 1. **Configure iOS background modes:** In Xcode, open your project, select your target, go to `Signing & Capabilities`, add `Background Modes`, and enable:
1015
+
1016
+ - `Audio, AirPlay, and Picture in Picture`
1017
+
1018
+ - `Voice over IP`
1019
+
1020
+ - `Remote notifications` (optional, for offline push)
1021
+
1022
+ Your Info.plist will include:
1023
+
1024
+ ``` xml
1025
+ <key>UIBackgroundModes</key>
1026
+ <array>
1027
+ <string>audio</string>
1028
+ <string>voip</string>
1029
+ <string>remote-notification</string>
1030
+ </array>
1031
+ ```
1032
+ 2. **Configure AVAudioSession:** Set up the audio session before the call starts (e.g., in the call UI's `viewDidLoad` or before making/answering a call).
1033
+
1034
+ ``` swift
1035
+ import AVFoundation
1036
+
1037
+ private func setupAudioSession() {
1038
+ let audioSession = AVAudioSession.sharedInstance()
1039
+ do {
1040
+ try audioSession.setCategory(.playAndRecord, options: [.allowBluetooth, .allowBluetoothA2DP])
1041
+ try audioSession.setActive(true)
1042
+ } catch {
1043
+ // Handle audio session configuration failure
1044
+ }
1045
+ }
1046
+ ```
1047
+ 3. **Special handling for ringtone playback (optional):** To play the ringtone through the speaker, temporarily switch the audio session to `.playback` mode.
1048
+
1049
+ ``` swift
1050
+ private func setAudioSessionForRingtone() {
1051
+ let audioSession = AVAudioSession.sharedInstance()
1052
+ do {
1053
+ try audioSession.setCategory(.playback, options: [.allowBluetooth, .allowBluetoothA2DP])
1054
+ try audioSession.overrideOutputAudioPort(.speaker)
1055
+ try audioSession.setActive(true)
1056
+ } catch {
1057
+ // Handle configuration failure
1058
+ }
1059
+ }
1060
+
1061
+ private func restoreAudioSessionForCall() {
1062
+ let audioSession = AVAudioSession.sharedInstance()
1063
+ do {
1064
+ try audioSession.setCategory(.playAndRecord, options: [.allowBluetooth, .allowBluetoothA2DP])
1065
+ try audioSession.setActive(true)
1066
+ } catch {
1067
+ // Handle restore failure
1068
+ }
1069
+ }
1070
+ ```
1071
+
1072
+ ## Next Steps
1073
+
1074
+ Congratulations! You have implemented the answer call feature. Next, see Making Your First Call to add call initiation to your app.
1075
+
1076
+ ## FAQs
1077
+
1078
+ ### If the callee is offline and comes online within the call invitation timeout, will they receive the incoming call event?
1079
+
1080
+ For one-on-one calls, if the callee comes online within the timeout, they will receive the incoming call invitation. For group calls, if the callee comes online within the timeout, up to 20 unprocessed group messages will be retrieved, and if there is a call invitation, the incoming call event will be triggered.
1081
+
1082
+ ## Contact Us
1083
+
1084
+ If you have any questions or suggestions during the integration or usage process, feel free to join our [Telegram technical group](https://t.me/+Lmw2MSqW6ethMGM1) or [contact us](https://trtc.io/contact) for support.