@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
@@ -1,1248 +0,0 @@
1
- This guide walks you through implementing the "Make a Call" feature using the **AtomicXCore SDK**, leveraging the **DeviceStore**, **CallStore**, and the core UI component **CallCoreView**.
2
-
3
- ## Core Features
4
-
5
- To build multi-party audio/video calling scenarios with **AtomicXCore**, you'll use the following three core modules:
6
-
7
- | **Module** | **Description** |
8
- | --- | --- |
9
- | [CallCoreView](https://tencent-rtc.github.io/TUIKit_iOS/documentation/atomicxcore/callcoreview) | Core call UI component. Automatically observes `CallStore` data and renders video streams, with support for 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, answer, reject, and hang up calls. Provides real-time access to participant audio/video status, call duration, call history, and more. |
11
- | [DeviceStore](https://tencent-rtc.github.io/TUIKit_iOS/documentation/atomicxcore/devicestore) | Controls audio/video devices: microphone (toggle/on/off, volume), camera (toggle/on/off, switch, quality), screen sharing, and real-time device status monitoring. |
12
-
13
- ## Getting Started
14
-
15
- ### Step 1: Activate the Service
16
-
17
- Follow the Activate the Service guide to obtain either a trial or paid version of the SDK.
18
-
19
- ### Step 2: Integrate the SDK
20
-
21
- 1. **Add Pod dependency:** Add `pod 'AtomicXCore'` to your project's `Podfile`.
22
-
23
- ```ruby
24
- target 'YourProjectTarget' do
25
- pod 'AtomicXCore'
26
- end
27
- ```
28
-
29
- > **Tips:**
30
- >
31
- > If your project doesn't have a Podfile, navigate to your `.xcodeproj` directory in the terminal and run `pod init` to create one.
32
-
33
- 2. **Install the component:** In the terminal, go to the directory containing your `Podfile` and run:
34
-
35
- ```bash
36
- pod install --repo-update
37
- ```
38
-
39
- > **Tips:**
40
- >
41
- > After installation, open your project using the `YourProjectName.xcworkspace` file.
42
-
43
- ### Step 3: Initialize and Log In
44
-
45
- Complete these steps in order:
46
-
47
- 1. **Create `CallStore`:** `let _ = CallStore.shared` initializes the call data layer.
48
- 2. **Log in the user:** call `LoginStore.shared.login(...)` to complete IM login.
49
- 3. **Initialize the call engine:** after login succeeds, call `TUICallEngine.createInstance().init(...)` to initialize the TRTC call signaling engine (**required**; omitting this may prevent calls from being placed or received correctly).
50
-
51
- Sample:
52
-
53
- ```swift
54
- import UIKit
55
- import AtomicXCore
56
- import RTCRoomEngine
57
- import Combine
58
-
59
- class ViewController: UIViewController {
60
- var cancellables = Set<AnyCancellable>()
61
-
62
- override func viewDidLoad() {
63
- super.viewDidLoad()
64
- // Initialize CallStore
65
- let _ = CallStore.shared
66
-
67
- // Set up user information
68
- let userID = "test_001" // Replace with your UserID
69
- let sdkAppID: Int = 1400000001 // Replace with your SDKAppID from the console
70
- let secretKey = "**************" // Replace with your SecretKey from the console; for development only — never ship the SDKSecretKey
71
-
72
- // Generate UserSig (for local testing only; always generate UserSig on your server in production).
73
- // When Tencent RTC MCP Server is configured with sdkAppID and sdkSecretKey, the tool can issue it for you automatically.
74
- let userSig = GenerateTestUserSig.genTestUserSig(
75
- userID: userID,
76
- sdkAppID: sdkAppID,
77
- secretKey: secretKey
78
- )
79
-
80
- // Log in
81
- LoginStore.shared.login(
82
- sdkAppID: Int32(sdkAppID),
83
- userID: userID,
84
- userSig: userSig
85
- ) { result in
86
- switch result {
87
- case .success:
88
- Log.info("login success")
89
- // Initialize TUICallEngine
90
- TUICallEngine.createInstance().`init`(Int32(sdkAppID), userId: userID, userSig: userSig) {
91
- Log.info("TUICallEngine init success")
92
- } fail: { code, message in
93
- Log.error("TUICallEngine init failed, code: \(code), message: \(message ?? "")")
94
- }
95
- case .failure(let error):
96
- Log.error("login failed, code: \(error.code), error: \(error.message)")
97
- }
98
- }
99
- }
100
- }
101
- ```
102
-
103
- **Login parameters:**
104
-
105
- | **Parameter** | **Type** | **Description** |
106
- | --- | --- | --- |
107
- | `userID` | `String` | Unique user ID, up to **32 bytes**, with **no special characters**; use letters and digits. Avoid simple IDs like `1` or `123` to reduce multi-device conflicts. |
108
- | `sdkAppID` | `int` | Obtain from the Tencent RTC console; typically a 10-digit integer starting with `140` or `160`. |
109
- | `secretKey` | `String` | SDKSecretKey paired with the `sdkAppID`, available in the Tencent RTC console. Used **only** to locally compute `UserSig` during development; never ship the SDKSecretKey with a release build. When **Tencent RTC MCP Server** is configured with both `sdkAppID` and `sdkSecretKey`, the tool can issue `UserSig` for you automatically. |
110
- | `userSig` | `String` | Authentication token for TRTC. **Development**: use [GenerateTestUserSig.genTestUserSig](https://github.com/Tencent-RTC/TUIKit_iOS/blob/main/application/Debug/GenerateTestUserSig.swift) or the UserSig Tool to generate a temporary `UserSig`. When **Tencent RTC MCP Server** is configured with both `sdkAppID` and `sdkSecretKey`, the tool can issue a `UserSig` for you automatically. **Production**: always generate `UserSig` server-side with the SDKSecretKey; never embed or distribute the SDKSecretKey in the client. |
111
-
112
- ## Implementation Steps
113
-
114
- > **Before making a call, ensure the user is logged in** — this is required for the service to function. The following five steps outline how to implement the "Make a Call" feature.
115
-
116
- ### Step 1: Create the Call Interface
117
-
118
- You need to create a call screen that is displayed when a call is initiated.
119
-
120
- 1. **Create the call screen:** Implement a new `UIViewController` to serve as the call interface. This will be used for both outgoing and incoming calls.
121
- 2. **Attach [CallCoreView](https://tencent-rtc.github.io/TUIKit_iOS/documentation/atomicxcore/callcoreview/):** Add the core call view component to your call screen. `CallCoreView` automatically observes `CallStore` data and renders video streams, with options for customizing layout, avatars, and icons.
122
-
123
- ```swift
124
- import UIKit
125
- import AtomicXCore
126
-
127
- class CallViewController: UIViewController {
128
- private var callCoreView: CallCoreView?
129
-
130
- override func viewDidLoad() {
131
- super.viewDidLoad()
132
- view.backgroundColor = .black
133
- // Attach CallCoreView to the call screen
134
- callCoreView = CallCoreView(frame: view.bounds)
135
- callCoreView?.autoresizingMask = [.flexibleWidth, .flexibleHeight]
136
- if let callCoreView = callCoreView {
137
- view.addSubview(callCoreView)
138
- }
139
- }
140
- }
141
- ```
142
-
143
- **CallCoreView Feature Overview:**
144
-
145
- | **Feature** | **Description** | **Reference** |
146
- | --- | --- | --- |
147
- | **Set Layout Mode** | Switch between layout modes. If not set, layout adapts automatically based on participant count. | Switching Layout Modes |
148
- | **Set Avatar** | Customize avatars for specific users by providing avatar resource paths. | Customizing Default Avatars |
149
- | **Set Volume Indicator Icon** | Set custom volume indicator icons for different volume levels. | Customizing Volume Indicator Icons |
150
- | **Set Network Indicator Icon** | Set network status indicator icons based on real-time network quality. | Customizing Network Indicator Icons |
151
- | **Set Waiting Animation for Users** | Support GIF animations for users in the waiting state during multi-party calls. | Customizing Waiting Animations |
152
-
153
- ### Step 2: Add Call Control Buttons
154
-
155
- 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 custom call control buttons.
156
-
157
- - **DeviceStore Controls:** Microphone (toggle/on/off, volume), camera (toggle/on/off, switch, quality), screen sharing, and real-time device status monitoring. Bind button actions to the corresponding methods, and update button UI in real time by observing device status changes.
158
- - **CallStore Controls:** Answer, hang up, reject, and other core call actions. Bind button actions to the appropriate methods and observe call status to keep the UI in sync.
159
-
160
- **Icon Resources:** Download button icons from the [GitHub icon folder](https://github.com/Tencent-RTC/TUIKit_iOS/tree/main/atomic_x/Resources/AtomicX.xcassets/icon/call). These icons are designed for TUICallKit and are free to use.
161
-
162
- | **Resource** | **Description** | **Download** |
163
- | --- | --- | --- |
164
- | `icon_dialing` | Dial / accept call icon. | [GitHub](https://github.com/Tencent-RTC/TUIKit_iOS/tree/main/atomic_x/Resources/AtomicX.xcassets/icon/call/icon_dialing.imageset) |
165
- | `icon_hangup` | Hang up / reject call icon. | [GitHub](https://github.com/Tencent-RTC/TUIKit_iOS/tree/main/atomic_x/Resources/AtomicX.xcassets/icon/call/icon_hangup.imageset) |
166
- | `icon_camera_off` | Camera off icon. | [GitHub](https://github.com/Tencent-RTC/TUIKit_iOS/tree/main/atomic_x/Resources/AtomicX.xcassets/icon/call/icon_camera_off.imageset) |
167
- | `icon_camera_on` | Camera on icon. | [GitHub](https://github.com/Tencent-RTC/TUIKit_iOS/tree/main/atomic_x/Resources/AtomicX.xcassets/icon/call/icon_camera_on.imageset) |
168
- | `icon_mute_on` | Mute toggle (on) icon. | [GitHub](https://github.com/Tencent-RTC/TUIKit_iOS/tree/main/atomic_x/Resources/AtomicX.xcassets/icon/call/icon_mute_on.imageset) |
169
- | `icon_mute` | Mute icon. | [GitHub](https://github.com/Tencent-RTC/TUIKit_iOS/tree/main/atomic_x/Resources/AtomicX.xcassets/icon/call/icon_mute.imageset) |
170
- | `icon_handsfree` | Handsfree off icon. | [GitHub](https://github.com/Tencent-RTC/TUIKit_iOS/tree/main/atomic_x/Resources/AtomicX.xcassets/icon/call/icon_handsfree.imageset) |
171
- | `icon_handsfree_on` | Handsfree on icon. | [GitHub](https://github.com/Tencent-RTC/TUIKit_iOS/tree/main/atomic_x/Resources/AtomicX.xcassets/icon/call/icon_handsfree_on.imageset) |
172
-
173
- **Example: Adding Hang Up, Microphone, and Camera Buttons**
174
-
175
- 1.1 **Add Hang Up Button:** Create and add a hang up button. When tapped, call `hangup` and close the call screen.
176
-
177
- ```swift
178
- import UIKit
179
- import AtomicXCore
180
- import Combine
181
-
182
- class CallViewController: UIViewController {
183
- private lazy var buttonHangup: UIButton = {
184
- let buttonWidth: CGFloat = 80
185
- let buttonHeight: CGFloat = 80
186
- let spacing: CGFloat = 30
187
- let bottomMargin: CGFloat = 80
188
- let totalWidth = buttonWidth * 3 + spacing * 2
189
- let startX = (view.bounds.width - totalWidth) / 2
190
- let buttonY = view.bounds.height - bottomMargin - buttonHeight
191
-
192
- let button = createButton(
193
- frame: CGRect(x: startX + (buttonWidth + spacing) * 2, y: buttonY, width: buttonWidth, height: buttonHeight),
194
- title: "hangup"
195
- )
196
- button.backgroundColor = .systemRed
197
- button.addTarget(self, action: #selector(touchHangupButton), for: .touchUpInside)
198
- return button
199
- }()
200
-
201
- override func viewDidLoad() {
202
- super.viewDidLoad()
203
- // Other initialization code
204
- // 1. Add a hang-up button
205
- view.addSubview(buttonHangup)
206
- }
207
-
208
- @objc private func touchHangupButton() {
209
- // 2. Call the hangup API in the click event and destroy the page
210
- CallStore.shared.hangup(completion: nil)
211
- }
212
-
213
- private func createButton(frame: CGRect, title: String) -> UIButton {
214
- let button = UIButton(type: .system)
215
- button.frame = frame
216
- button.setTitle(title, for: .normal)
217
- button.setTitleColor(.white, for: .normal)
218
- button.backgroundColor = UIColor(white: 0.3, alpha: 0.8)
219
- button.layer.cornerRadius = frame.width / 2
220
- button.titleLabel?.font = UIFont.systemFont(ofSize: 14)
221
- return button
222
- }
223
- }
224
- ```
225
-
226
- 1.2 **Add Microphone Toggle Button:** Create and add a microphone toggle button. When tapped, call [openLocalMicrophone](https://tencent-rtc.github.io/TUIKit_iOS/documentation/atomicxcore/devicestore/openlocalmicrophone(completion:)) or [closeLocalMicrophone](https://tencent-rtc.github.io/TUIKit_iOS/documentation/atomicxcore/devicestore/closelocalmicrophone()).
227
-
228
- ```swift
229
- import UIKit
230
- import AtomicXCore
231
- import Combine
232
-
233
- class CallViewController: UIViewController {
234
- private lazy var buttonMicrophone: UIButton = {
235
- let buttonWidth: CGFloat = 80
236
- let buttonHeight: CGFloat = 80
237
- let spacing: CGFloat = 30
238
- let bottomMargin: CGFloat = 80
239
- let totalWidth = buttonWidth * 3 + spacing * 2
240
- let startX = (view.bounds.width - totalWidth) / 2
241
- let buttonY = view.bounds.height - bottomMargin - buttonHeight
242
-
243
- let button = createButton(
244
- frame: CGRect(x: startX + buttonWidth + spacing, y: buttonY, width: buttonWidth, height: buttonHeight),
245
- title: "Microphone"
246
- )
247
- button.addTarget(self, action: #selector(touchMicrophoneButton), for: .touchUpInside)
248
- return button
249
- }()
250
-
251
- override func viewDidLoad() {
252
- super.viewDidLoad()
253
- // Other initialization code
254
- // 1. Add a microphone toggle button
255
- view.addSubview(buttonMicrophone)
256
- }
257
-
258
- // 2. Toggle the microphone (on/off) in the click event
259
- @objc private func touchMicrophoneButton() {
260
- let microphoneStatus = DeviceStore.shared.state.value.microphoneStatus
261
- if microphoneStatus == .on {
262
- DeviceStore.shared.closeLocalMicrophone()
263
- } else {
264
- DeviceStore.shared.openLocalMicrophone(completion: nil)
265
- }
266
- }
267
-
268
- // Helper method to create circular buttons
269
- private func createButton(frame: CGRect, title: String) -> UIButton {
270
- let button = UIButton(type: .system)
271
- button.frame = frame
272
- button.setTitle(title, for: .normal)
273
- button.setTitleColor(.white, for: .normal)
274
- button.backgroundColor = UIColor(white: 0.3, alpha: 0.8)
275
- button.layer.cornerRadius = frame.width / 2
276
- button.titleLabel?.font = UIFont.systemFont(ofSize: 14)
277
- return button
278
- }
279
- }
280
- ```
281
-
282
- 1.3 **Add Camera Toggle Button:** Add a camera toggle button to the bottom toolbar. When tapped, call [openLocalCamera](https://tencent-rtc.github.io/TUIKit_iOS/documentation/atomicxcore/devicestore/openlocalcamera(isfront:completion:)) or [closeLocalCamera](https://tencent-rtc.github.io/TUIKit_iOS/documentation/atomicxcore/devicestore/closelocalcamera()).
283
-
284
- ```swift
285
- import UIKit
286
- import AtomicXCore
287
- import Combine
288
-
289
- class CallViewController: UIViewController {
290
- private lazy var buttonCamera: UIButton = {
291
- let buttonWidth: CGFloat = 80
292
- let buttonHeight: CGFloat = 80
293
- let spacing: CGFloat = 30
294
- let bottomMargin: CGFloat = 80
295
- let totalWidth = buttonWidth * 3 + spacing * 2
296
- let startX = (view.bounds.width - totalWidth) / 2
297
- let buttonY = view.bounds.height - bottomMargin - buttonHeight
298
-
299
- let button = createButton(
300
- frame: CGRect(x: startX, y: buttonY, width: buttonWidth, height: buttonHeight),
301
- title: "Camera"
302
- )
303
- button.addTarget(self, action: #selector(touchCameraButton), for: .touchUpInside)
304
- return button
305
- }()
306
-
307
- override func viewDidLoad() {
308
- super.viewDidLoad()
309
- // Other initialization code
310
- // 1. Add camera toggle button
311
- view.addSubview(buttonCamera)
312
- }
313
-
314
- // 2. Camera button click event
315
- @objc private func touchCameraButton() {
316
- let cameraStatus = DeviceStore.shared.state.value.cameraStatus
317
- if cameraStatus == .on {
318
- DeviceStore.shared.closeLocalCamera()
319
- } else {
320
- let isFront = DeviceStore.shared.state.value.isFrontCamera
321
- DeviceStore.shared.openLocalCamera(isFront: isFront, completion: nil)
322
- }
323
- }
324
-
325
- // Helper method to create circular buttons
326
- private func createButton(frame: CGRect, title: String) -> UIButton {
327
- let button = UIButton(type: .system)
328
- button.frame = frame
329
- button.setTitle(title, for: .normal)
330
- button.setTitleColor(.white, for: .normal)
331
- button.backgroundColor = UIColor(white: 0.3, alpha: 0.8)
332
- button.layer.cornerRadius = frame.width / 2
333
- button.titleLabel?.font = UIFont.systemFont(ofSize: 14)
334
- return button
335
- }
336
- }
337
- ```
338
-
339
- 1.4 **Update Button Labels in Real Time:** Observe microphone and camera status and update button labels accordingly.
340
-
341
- ```swift
342
- import UIKit
343
- import AtomicXCore
344
- import Combine
345
-
346
- class CallViewController: UIViewController {
347
- private var cancellables = Set<AnyCancellable>()
348
- private var buttonCamera: UIButton?
349
- private var buttonMicrophone: UIButton?
350
-
351
- override func viewDidLoad() {
352
- super.viewDidLoad()
353
- // Other initialization code
354
- // 1. Observe microphone and camera status
355
- observeDeviceState()
356
- }
357
-
358
- private func observeDeviceState() {
359
- DeviceStore.shared.state.subscribe()
360
- .map { $0.cameraStatus }
361
- .removeDuplicates()
362
- .receive(on: DispatchQueue.main)
363
- .sink { [weak self] cameraStatus in
364
- // 2. Update camera button text
365
- let title = cameraStatus == .on ? "Turn Off Camera" : "Turn On Camera"
366
- self?.buttonCamera?.setTitle(title, for: .normal)
367
- }
368
- .store(in: &cancellables)
369
-
370
- DeviceStore.shared.state.subscribe()
371
- .map { $0.microphoneStatus }
372
- .removeDuplicates()
373
- .receive(on: DispatchQueue.main)
374
- .sink { [weak self] microphoneStatus in
375
- // 2. Update microphone button text
376
- let title = microphoneStatus == .on ? "Turn Off Mic" : "Turn On Mic"
377
- self?.buttonMicrophone?.setTitle(title, for: .normal)
378
- }
379
- .store(in: &cancellables)
380
- }
381
- }
382
- ```
383
-
384
- ### Step 3: Request Microphone/Camera Permissions
385
-
386
- Check for audio/video permissions before starting a call. If permissions are missing, prompt the user to grant them.
387
-
388
- 1. **Declare permissions:** Add the following keys to your app's `Info.plist` with appropriate usage descriptions. These will be shown to users when the system requests permissions:
389
-
390
- ```xml
391
- <key>NSCameraUsageDescription</key>
392
- <string>Camera access is required for video calls and group video calls.</string>
393
- <key>NSMicrophoneUsageDescription</key>
394
- <string>Microphone access is required for audio calls, group audio calls, video calls, and group video calls.</string>
395
- ```
396
-
397
- 2. **Request permissions dynamically:** Request audio/video permissions based on the call media type when initiating a call.
398
-
399
- ```swift
400
- import AVFoundation
401
- import UIKit
402
-
403
- extension UIViewController {
404
- // Check microphone permission
405
- func checkMicrophonePermission(completion: @escaping (Bool) -> Void) {
406
- let status = AVCaptureDevice.authorizationStatus(for: .audio)
407
- switch status {
408
- case .authorized:
409
- completion(true)
410
- case .notDetermined:
411
- AVCaptureDevice.requestAccess(for: .audio) { granted in
412
- DispatchQueue.main.async {
413
- completion(granted)
414
- }
415
- }
416
- case .denied, .restricted:
417
- completion(false)
418
- @unknown default:
419
- completion(false)
420
- }
421
- }
422
-
423
- // Check camera permission
424
- func checkCameraPermission(completion: @escaping (Bool) -> Void) {
425
- let status = AVCaptureDevice.authorizationStatus(for: .video)
426
- switch status {
427
- case .authorized:
428
- completion(true)
429
- case .notDetermined:
430
- AVCaptureDevice.requestAccess(for: .video) { granted in
431
- DispatchQueue.main.async {
432
- completion(granted)
433
- }
434
- }
435
- case .denied, .restricted:
436
- completion(false)
437
- @unknown default:
438
- completion(false)
439
- }
440
- }
441
-
442
- // Show permission alert
443
- func showPermissionAlert(message: String) {
444
- let alert = UIAlertController(
445
- title: "Permission Required",
446
- message: message,
447
- preferredStyle: .alert
448
- )
449
- alert.addAction(UIAlertAction(title: "Settings", style: .default) { _ in
450
- if let url = URL(string: UIApplication.openSettingsURLString) {
451
- UIApplication.shared.open(url)
452
- }
453
- })
454
- alert.addAction(UIAlertAction(title: "Cancel", style: .cancel))
455
- present(alert, animated: true)
456
- }
457
- }
458
- ```
459
-
460
- ### Step 4: Make a Call
461
-
462
- After calling [calls](https://tencent-rtc.github.io/TUIKit_iOS/documentation/atomicxcore/callstore/calls(participantids:callmediatype:params:completion:)), navigate to the call screen. For the best user experience, automatically enable the microphone or camera based on the media type.
463
-
464
- 1. **Initiate the call:** Call `calls` to start a call.
465
- 2. **Enable media devices:** After the call is initiated, enable the microphone. If it's a video call, also enable the camera.
466
- 3. **Present the call screen:** On successful call initiation, present the call screen.
467
-
468
- ```swift
469
- import UIKit
470
- import AtomicXCore
471
- import Combine
472
-
473
- class MainViewController: UIViewController {
474
- // 1. Initiate a call
475
- private func startCall(userIdList: [String], mediaType: CallMediaType) {
476
- var params = CallParams()
477
- params.timeout = 30 // Set call timeout to 30 seconds
478
-
479
- CallStore.shared.calls(
480
- participantIds: userIdList,
481
- mediaType: mediaType, // Call type: .audio or .video
482
- params: params
483
- ) { [weak self] result in
484
- switch result {
485
- case .success:
486
- // 2. Enable media devices
487
- self?.openDevices(for: mediaType)
488
- // 3. Launch the call interface
489
- DispatchQueue.main.async {
490
- let callVC = CallViewController()
491
- callVC.modalPresentationStyle = .fullScreen
492
- self?.present(callVC, animated: true)
493
- }
494
- case .failure(let error):
495
- Log.error("Failed to initiate call: \(error)")
496
- }
497
- }
498
- }
499
-
500
- private func openDevices(for mediaType: CallMediaType) {
501
- DeviceStore.shared.openLocalMicrophone(completion: nil)
502
- if mediaType == .video {
503
- let isFront = DeviceStore.shared.state.value.isFrontCamera
504
- DeviceStore.shared.openLocalCamera(isFront: isFront, completion: nil)
505
- }
506
- }
507
- }
508
- ```
509
-
510
- **calls API Parameter Reference:**
511
-
512
- | **Parameter** | **Type** | **Required** | **Description** |
513
- | --- | --- | --- | --- |
514
- | `participantIds` | `[String]` | Yes | A list of target user IDs. |
515
- | `mediaType` | `CallMediaType` | Yes | The media type of the call, used to specify whether to initiate an audio or video call.<br>- `CallMediaType.video`: Video call.<br>- `CallMediaType.audio`: Audio call. |
516
- | `params` | `CallParams` | No | Extended call parameters, such as Room ID, call invitation timeout, etc.<br>- `roomId` (`String`): Room ID. Optional; if not specified, it will be automatically assigned by the server.<br>- `timeout` (`Int`): Call Timeout (in seconds).<br>- `userData` (`String`): Custom user data for application-specific information.<br>- `chatGroupId` (`String`): Chat Group ID, used for group call scenarios.<br>- `isEphemeralCall` (`Bool`): Ephemeral Call. If set to `true`, no call history record will be generated. |
517
-
518
- ### Step 5: End the Call
519
-
520
- When you call [hangup](https://tencent-rtc.github.io/TUIKit_iOS/documentation/atomicxcore/callstore/hangup(completion:)) or the remote party ends the call, the [onCallEnded](https://tencent-rtc.github.io/TUIKit_iOS/documentation/atomicxcore/callevent/oncallended(callid:mediatype:reason:userid:)) event is triggered. Listen for this event and close the call screen when the call ends.
521
-
522
- 1. **Listen for call end event:** Observe the `onCallEnded` event.
523
- 2. **Close the call screen:** When `onCallEnded` is triggered, dismiss the call screen.
524
-
525
- ```swift
526
- import UIKit
527
- import AtomicXCore
528
- import Combine
529
-
530
- class CallViewController: UIViewController {
531
- private var cancellables = Set<AnyCancellable>()
532
-
533
- override func viewDidLoad() {
534
- super.viewDidLoad()
535
- // Other initialization code
536
- // 1. Add call event listener
537
- addListener()
538
- }
539
-
540
- private func addListener() {
541
- CallStore.shared.callEventPublisher
542
- .receive(on: DispatchQueue.main)
543
- .sink { [weak self] event in
544
- if case .onCallEnded = event {
545
- // 2. Dismiss the call interface
546
- self?.dismiss(animated: true)
547
- }
548
- }
549
- .store(in: &cancellables)
550
- }
551
- }
552
- ```
553
-
554
- **onCallEnded Event Parameters:**
555
-
556
- | **Parameter** | **Type** | **Description** |
557
- | --- | --- | --- |
558
- | `callId` | `String` | Unique ID for this call. |
559
- | `mediaType` | `CallMediaType` | The media type of the call.<br>- `CallMediaType.video`: Video call.<br>- `CallMediaType.audio`: Audio call. |
560
- | `reason` | `CallEndReason` | The reason why the call ended.<br>- `unknown`: Unable to determine the reason for termination.<br>- `hangup`: Normal termination; a user actively ended the call.<br>- `reject`: The callee declined the incoming call.<br>- `noResponse`: The callee did not answer within the timeout period.<br>- `offline`: The callee is currently offline.<br>- `lineBusy`: The callee is already in another call.<br>- `canceled`: The caller canceled the call before it was answered.<br>- `otherDeviceAccepted`: The call was answered on another logged-in device.<br>- `otherDeviceReject`: The call was declined on another logged-in device.<br>- `endByServer`: The call was forced to end by the server. |
561
- | `userId` | `String` | The User ID of the person who triggered the call termination. |
562
-
563
- ### Demo
564
-
565
- After completing these five steps, the "Make a Call" feature is wired up end-to-end.
566
-
567
- ## Customization
568
-
569
- `CallCoreView` provides extensive UI customization, including support for custom avatars and volume indicator icons. To speed up your integration, you can download ready-to-use icons from the [GitHub icon folder](https://github.com/Tencent-RTC/TUIKit_iOS/tree/main/atomic_x/Resources/AtomicX.xcassets/icon/call). All icons are designed for TUICallKit and are free to use.
570
-
571
- ### Customizing Volume Indicator Icons
572
-
573
- Use the `CallCoreView` [setVolumeLevelIcons](https://tencent-rtc.github.io/TUIKit_iOS/documentation/atomicxcore/callcoreview/setvolumelevelicons(icons:)) method to assign different icons for each volume level.
574
-
575
- ```swift
576
- // Set volume indicator icons
577
- let volumeLevelIcons: [VolumeLevel: String] = [
578
- .mute: "Path to the corresponding icon resource"
579
- ]
580
- callCoreView.setVolumeLevelIcons(icons: volumeLevelIcons)
581
- ```
582
-
583
- **setVolumeLevelIcons API Parameters:**
584
-
585
- | **Parameter** | **Type** | **Required** | **Description** |
586
- | --- | --- | --- | --- |
587
- | `icons` | `[VolumeLevel: String]` | Yes | Mapping of volume levels to icon resources.<br>**Key (`VolumeLevel`):**<br>- `VolumeLevel.mute`: Microphone is off or muted.<br>- `VolumeLevel.low`: Volume range (0, 25].<br>- `VolumeLevel.medium`: Volume range (25, 50].<br>- `VolumeLevel.high`: Volume range (50, 75].<br>- `VolumeLevel.peak`: Volume range (75, 100].<br>**Value (`String`):** Path or name of the icon resource for each volume level. |
588
-
589
- **Volume Indicator Icons:**
590
-
591
- | **Resource** | **Description** | **Download** |
592
- | --- | --- | --- |
593
- | `icon_volume` | Volume indicator icon. Set this icon for `VolumeLevel.low` or `VolumeLevel.medium`; it is displayed when the user's volume exceeds the specified level. | [GitHub](https://github.com/Tencent-RTC/TUIKit_iOS/tree/main/atomic_x/Resources/AtomicX.xcassets/icon/call/icon_volume.imageset) |
594
- | `icon_mic_off` | Mute icon. Set this icon for `VolumeLevel.mute`; it is displayed when the user is currently muted. | [GitHub](https://github.com/Tencent-RTC/TUIKit_iOS/tree/main/atomic_x/Resources/AtomicX.xcassets/icon/call/icon_mic_off.imageset) |
595
-
596
- ### Customizing Network Indicator Icons
597
-
598
- Use the `CallCoreView` [setNetworkQualityIcons](https://tencent-rtc.github.io/TUIKit_iOS/documentation/atomicxcore/callcoreview/setnetworkqualityicons(icons:)) method to assign icons for different network states.
599
-
600
- ```swift
601
- // Set network quality icons
602
- let networkQualityIcons: [NetworkQuality: String] = [
603
- .bad: "Path to the corresponding icon"
604
- ]
605
- callCoreView.setNetworkQualityIcons(icons: networkQualityIcons)
606
- ```
607
-
608
- **setNetworkQualityIcons API Parameters:**
609
-
610
- | **Parameter** | **Type** | **Required** | **Description** |
611
- | --- | --- | --- | --- |
612
- | `icons` | `[NetworkQuality: String]` | Yes | Network Quality Icon mapping table.<br>**Key (`NetworkQuality`):**<br>- `NetworkQuality.unknown`: Network status is undetermined.<br>- `NetworkQuality.excellent`: Outstanding network connection.<br>- `NetworkQuality.good`: Stable and good network connection.<br>- `NetworkQuality.poor`: Weak network signal.<br>- `NetworkQuality.bad`: Very weak or unstable network.<br>- `NetworkQuality.veryBad`: Extremely poor network, near disconnection.<br>- `NetworkQuality.down`: Network disconnected.<br>**Value (`String`):** Absolute path or resource name of the icon corresponding to the network status. |
613
-
614
- **Network Warning Icon:**
615
-
616
- | **Resource** | **Description** | **Download** |
617
- | --- | --- | --- |
618
- | `group_network_low_quality` | Poor network indicator. Set this icon for `NetworkQuality.bad`, `NetworkQuality.veryBad`, or `NetworkQuality.down`; it is displayed when the network quality is poor. | [GitHub](https://github.com/Tencent-RTC/TUIKit_iOS/tree/main/atomic_x/Resources/AtomicX.xcassets/icon/call/group_network_low_quality.imageset) |
619
-
620
- ### Customizing Default Avatars
621
-
622
- Use the `CallCoreView` [setParticipantAvatars](https://tencent-rtc.github.io/TUIKit_iOS/documentation/atomicxcore/callcoreview/setparticipantavatars(avatars:)) API to set user avatars. Listen to the [allParticipants](https://tencent-rtc.github.io/TUIKit_iOS/documentation/atomicxcore/callstate/allparticipants) reactive data: when you have a user's avatar, set and display it; if not, show the default avatar.
623
-
624
- ```swift
625
- // Set user avatars
626
- var avatars: [String: String] = [:]
627
- let userId = "" // User ID
628
- let avatarPath = "" // Path to user's default avatar resource
629
- avatars[userId] = avatarPath
630
-
631
- callCoreView.setParticipantAvatars(avatars: avatars)
632
- ```
633
-
634
- **setParticipantAvatars API Parameters:**
635
-
636
- | **Parameter** | **Type** | **Required** | **Description** |
637
- | --- | --- | --- | --- |
638
- | `avatars` | `[String: String]` | Yes | User avatar mapping table.<br>- **Key:** The `userID` of the user.<br>- **Value:** The absolute path to the user's avatar resource. |
639
-
640
- **Default Avatar:**
641
-
642
- | **Resource** | **Description** | **Download** |
643
- | --- | --- | --- |
644
- | `default_participant_icon` | Default profile picture. Use as the default avatar when a user's profile image fails to load or no avatar is provided. | [GitHub](https://github.com/Tencent-RTC/TUIKit_iOS/tree/main/atomic_x/Resources/AtomicX.xcassets/icon/call/default_participant_icon.imageset) |
645
-
646
- ### Customizing Waiting Animations
647
-
648
- Use the `CallCoreView` [setWaitingAnimation](https://tencent-rtc.github.io/TUIKit_iOS/documentation/atomicxcore/callcoreview/setwaitinganimation(path:)) API to set a waiting animation for users who are waiting to answer.
649
-
650
- ```swift
651
- // Set waiting animation
652
- let waitingAnimationPath = "" // Path to waiting animation GIF resource
653
- callCoreView.setWaitingAnimation(path: waitingAnimationPath)
654
- ```
655
-
656
- **setWaitingAnimation API Parameters:**
657
-
658
- | **Parameter** | **Type** | **Required** | **Description** |
659
- | --- | --- | --- | --- |
660
- | `path` | `String` | Yes | Absolute path to a GIF format image resource. |
661
-
662
- **User Waiting Animation:**
663
-
664
- | **Resource** | **Description** | **Download** |
665
- | --- | --- | --- |
666
- | `loading.gif` | User waiting animation. Recommended for group calls; displayed when the user's status is "Waiting to Answer" (Pending). | [GitHub](https://github.com/Tencent-RTC/TUIKit_iOS/blob/main/atomic_x/Resources/CallResource/loading.gif) |
667
-
668
- ### Adding a Call Duration Indicator
669
-
670
- To display the call duration in real time, subscribe to the [activeCall](https://tencent-rtc.github.io/TUIKit_iOS/documentation/atomicxcore/callstate/activecall) `duration` field.
671
-
672
- 1. **Subscribe to the data layer:** Subscribe to `CallStore.shared.state` to observe the active call reactively.
673
- 2. **Bind the duration to your UI:** Bind `activeCall.duration` to your UI controls. This field is reactive and drives refreshes automatically so you don't need your own timer.
674
-
675
- ```swift
676
- import UIKit
677
- import AtomicXCore
678
- import Combine
679
-
680
- class TimerView: UILabel {
681
- private var cancellables = Set<AnyCancellable>()
682
-
683
- override init(frame: CGRect) {
684
- super.init(frame: frame)
685
- setupView()
686
- }
687
-
688
- required init?(coder: NSCoder) {
689
- super.init(coder: coder)
690
- setupView()
691
- }
692
-
693
- private func setupView() {
694
- textColor = .white
695
- textAlignment = .center
696
- font = .systemFont(ofSize: 16)
697
- }
698
-
699
- override func didMoveToWindow() {
700
- super.didMoveToWindow()
701
- if window != nil {
702
- registerActiveCallObserver()
703
- } else {
704
- cancellables.removeAll()
705
- }
706
- }
707
-
708
- private func registerActiveCallObserver() {
709
- CallStore.shared.state.subscribe()
710
- .map { $0.activeCall }
711
- .removeDuplicates { $0.duration == $1.duration }
712
- .receive(on: DispatchQueue.main)
713
- .sink { [weak self] activeCall in
714
- // Update call duration
715
- self?.updateDurationView(activeCall: activeCall)
716
- }
717
- .store(in: &cancellables)
718
- }
719
-
720
- private func updateDurationView(activeCall: CallInfo) {
721
- let currentDuration = Int(activeCall.duration)
722
- let minutes = currentDuration / 60
723
- let seconds = currentDuration % 60
724
- text = String(format: "%02d:%02d", minutes, seconds)
725
- }
726
- }
727
- ```
728
-
729
- > **Note:**
730
- >
731
- > For more reactive call status data, see [CallState](https://tencent-rtc.github.io/TUIKit_iOS/documentation/atomicxcore/callstate).
732
-
733
- ## More Features
734
-
735
- ### Customizing User Avatar and Nickname
736
-
737
- 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:)).
738
-
739
- ```swift
740
- var userProfile = UserProfile()
741
- userProfile.userID = "" // Your User ID
742
- userProfile.avatarURL = "" // URL of the avatar image
743
- userProfile.nickname = "" // The nickname to be set
744
-
745
- LoginStore.shared.setSelfInfo(userProfile: userProfile) { result in
746
- switch result {
747
- case .success:
748
- // Success callback: profile updated successfully
749
- break
750
- case .failure(let error):
751
- // Failure callback: handle the error
752
- break
753
- }
754
- }
755
- ```
756
-
757
- **setSelfInfo API Parameters:**
758
-
759
- | **Parameter** | **Type** | **Required** | **Description** |
760
- | --- | --- | --- | --- |
761
- | `userProfile` | `UserProfile` | Yes | User info struct:<br>- `userID`: User ID.<br>- `avatarURL`: User avatar URL.<br>- `nickname`: User nickname.<br>For more field details, see the [UserProfile](https://tencent-rtc.github.io/TUIKit_iOS/documentation/atomicxcore/userprofile) class. |
762
-
763
- ### Switching Layout Modes
764
-
765
- `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 1-on-1 calls and `Grid` mode for multi-party calls.
766
-
767
- | **Mode** | **Layout** | **Interaction** |
768
- | --- | --- | --- |
769
- | **Float Mode** | While waiting, display your own video full screen. After answering, show the remote video full screen and your own video as a floating window. | Drag the small window or tap to swap big/small video. |
770
- | **Grid Mode** | All participant videos are tiled in a grid. Best for 2+ participants. Tap to enlarge a video. | Tap a participant to enlarge their video. |
771
- | **PIP Mode** | In 1v1, remote video is fixed; in multi-party, the active speaker is shown full screen. | Shows your own video while waiting; displays the call timer after answering. |
772
-
773
- **setLayoutTemplate Sample code:**
774
-
775
- ```swift
776
- func setLayoutTemplate(_ template: CallLayoutTemplate)
777
- ```
778
-
779
- **setLayoutTemplate API Parameters:**
780
-
781
- | **Parameter** | **Type** | **Description** |
782
- | --- | --- | --- |
783
- | `template` | `CallLayoutTemplate` | `CallCoreView`'s layout mode.<br>- `CallLayoutTemplate.float`: 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>- `CallLayoutTemplate.grid`: All participant videos are tiled in a grid; best for 2+ participants.<br>- `CallLayoutTemplate.pip`: In 1v1, remote video is fixed; in multi-party, the active speaker is shown full screen. |
784
-
785
- ### Setting Default Call Timeout
786
-
787
- When making a call using [calls](https://tencent-rtc.github.io/TUIKit_iOS/documentation/atomicxcore/callstore/calls(participantids:callmediatype:params:completion:)), set the `timeout` field in [CallParams](https://tencent-rtc.github.io/TUIKit_iOS/documentation/atomicxcore/callparams) to specify the call invitation timeout.
788
-
789
- ```swift
790
- var callParams = CallParams()
791
- callParams.timeout = 30 // Set call timeout to 30 seconds.
792
- CallStore.shared.calls(
793
- participantIds: userIdList,
794
- mediaType: .video,
795
- params: callParams,
796
- completion: nil
797
- )
798
- ```
799
-
800
- **calls API Parameter Reference:**
801
-
802
- | **Parameter** | **Type** | **Required** | **Description** |
803
- | --- | --- | --- | --- |
804
- | `participantIds` | `[String]` | Yes | A list of User IDs for the target participants. |
805
- | `mediaType` | `CallMediaType` | Yes | The media type of the call.<br>- `CallMediaType.video`: Video Call.<br>- `CallMediaType.audio`: Audio Call. |
806
- | `params` | `CallParams` | No | Extended call parameters, such as Room ID, call invitation timeout, etc.<br>- `roomId` (`String`): Room ID. Optional; if not specified, it will be automatically assigned by the server.<br>- `timeout` (`Int`): Call Timeout (in seconds).<br>- `userData` (`String`): User Custom Data for app-specific logic.<br>- `chatGroupId` (`String`): Chat Group ID, used specifically for group call scenarios.<br>- `isEphemeralCall` (`Bool`): Ephemeral Call. Whether the call is encrypted and transient (will not generate a call history record). |
807
-
808
- ### Implementing In-App Floating Window
809
-
810
- The AtomicXCore SDK provides the `CallPipView` component to enable in-app floating windows. When the call interface is covered by another screen (e.g., the user navigates away but the call is ongoing), a floating window displays call status and lets users quickly return to the call.
811
-
812
- **Step 1:** Create the Floating Window Controller.
813
-
814
- ```swift
815
- import UIKit
816
- import AtomicXCore
817
- import Combine
818
-
819
- /**
820
- * Floating Window Controller
821
- *
822
- * Used to display the call in a floating window, containing a CallCoreView internally.
823
- */
824
- class FloatWindowViewController: UIViewController {
825
- var tapGestureAction: (() -> Void)?
826
- private var cancellables = Set<AnyCancellable>()
827
-
828
- private lazy var callCoreView: CallCoreView = {
829
- let view = CallCoreView(frame: self.view.bounds)
830
- view.autoresizingMask = [.flexibleWidth, .flexibleHeight]
831
- view.setLayoutTemplate(.pip) // Set to Picture-in-Picture (PIP) layout mode
832
- view.isUserInteractionEnabled = false // Disable interaction to allow taps to pass through to the parent view
833
- return view
834
- }()
835
-
836
- override func viewDidLoad() {
837
- super.viewDidLoad()
838
- view.backgroundColor = UIColor(white: 0.1, alpha: 1.0)
839
- view.layer.cornerRadius = 10
840
- view.layer.masksToBounds = true
841
- view.addSubview(callCoreView)
842
-
843
- // Add tap gesture recognizer
844
- let tapGesture = UITapGestureRecognizer(target: self, action: #selector(handleTap))
845
- view.addGestureRecognizer(tapGesture)
846
-
847
- // Delay status observation to prevent the window from closing immediately upon creation
848
- DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) { [weak self] in
849
- self?.observeCallStatus()
850
- }
851
- }
852
-
853
- @objc private func handleTap() {
854
- tapGestureAction?()
855
- }
856
-
857
- /**
858
- * Observe call status changes.
859
- * Automatically closes the floating window when the call ends.
860
- */
861
- private func observeCallStatus() {
862
- CallStore.shared.state
863
- .subscribe(StatePublisherSelector<CallState, CallParticipantStatus>(keyPath: \.selfInfo.status))
864
- .removeDuplicates()
865
- .receive(on: DispatchQueue.main)
866
- .sink { [weak self] status in
867
- if status == .none {
868
- // Call ended, post notification to hide the floating window
869
- NotificationCenter.default.post(name: NSNotification.Name("HideFloatingWindow"), object: nil)
870
- }
871
- }
872
- .store(in: &cancellables)
873
- }
874
-
875
- deinit {
876
- cancellables.removeAll()
877
- }
878
- }
879
- ```
880
-
881
- **Step 2:** Implement floating window management logic in the main interface.
882
-
883
- ```swift
884
- import UIKit
885
- import AtomicXCore
886
-
887
- class MainViewController: UIViewController {
888
- private var floatWindow: UIWindow?
889
-
890
- override func viewDidLoad() {
891
- super.viewDidLoad()
892
- // Listen for the notification to show the floating window
893
- NotificationCenter.default.addObserver(
894
- self,
895
- selector: #selector(showFloatingWindow),
896
- name: NSNotification.Name("ShowFloatingWindow"),
897
- object: nil
898
- )
899
- // Listen for the notification to hide the floating window
900
- NotificationCenter.default.addObserver(
901
- self,
902
- selector: #selector(hideFloatingWindow),
903
- name: NSNotification.Name("HideFloatingWindow"),
904
- object: nil
905
- )
906
- }
907
-
908
- /**
909
- * Displays the in-app floating window.
910
- */
911
- @objc private func showFloatingWindow() {
912
- // Check if the call is currently active/accepted
913
- let selfStatus = CallStore.shared.state.value.selfInfo.status
914
- guard selfStatus == .accept else {
915
- return
916
- }
917
- // Prevent duplicate creation if the floating window already exists
918
- guard floatWindow == nil else { return }
919
- // CRITICAL: The current windowScene must be used to create the new window
920
- guard let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene else {
921
- return
922
- }
923
- // Define floating window dimensions (9:16 aspect ratio)
924
- let pipWidth: CGFloat = 100
925
- let pipHeight: CGFloat = pipWidth * 16 / 9
926
- let pipX = UIScreen.main.bounds.width - pipWidth - 20
927
- let pipY: CGFloat = 100
928
-
929
- // Create the floating window (associated with the windowScene)
930
- let window = UIWindow(windowScene: windowScene)
931
- window.windowLevel = .alert + 1 // Ensure it stays above standard UI
932
- window.backgroundColor = .clear
933
- window.frame = CGRect(x: pipX, y: pipY, width: pipWidth, height: pipHeight)
934
-
935
- // Initialize the floating window controller
936
- let floatVC = FloatWindowViewController()
937
- floatVC.tapGestureAction = { [weak self] in
938
- self?.openCallViewController()
939
- }
940
- window.rootViewController = floatVC
941
- self.floatWindow = window
942
-
943
- // Make the window visible
944
- window.isHidden = false
945
- window.makeKeyAndVisible()
946
-
947
- // Immediately restore the main window as the key window to maintain proper app focus
948
- if let mainWindow = windowScene.windows.first(where: { $0 != window }) {
949
- mainWindow.makeKey()
950
- }
951
- }
952
-
953
- /**
954
- * Hides the in-app floating window.
955
- */
956
- @objc private func hideFloatingWindow() {
957
- floatWindow?.isHidden = true
958
- floatWindow = nil
959
- }
960
-
961
- /**
962
- * Opens the call interface (triggered upon tapping the floating window).
963
- */
964
- private func openCallViewController() {
965
- // Dismiss the floating window first
966
- hideFloatingWindow()
967
- // Retrieve the current top-most ViewController
968
- guard let topVC = getTopViewController() else {
969
- return
970
- }
971
- let callVC = CallViewController()
972
- callVC.modalPresentationStyle = .fullScreen
973
- topVC.present(callVC, animated: true)
974
- }
975
-
976
- /**
977
- * Utility to retrieve the current top-most ViewController in the view hierarchy.
978
- */
979
- private func getTopViewController() -> UIViewController? {
980
- guard let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene,
981
- let keyWindow = windowScene.windows.first(where: { $0.isKeyWindow }),
982
- let rootVC = keyWindow.rootViewController else {
983
- return nil
984
- }
985
- var topVC = rootVC
986
- while let presentedVC = topVC.presentedViewController {
987
- topVC = presentedVC
988
- }
989
- return topVC
990
- }
991
-
992
- deinit {
993
- NotificationCenter.default.removeObserver(self)
994
- }
995
- }
996
- ```
997
-
998
- **Step 3:** Add the floating window trigger logic to the Call Interface.
999
-
1000
- ```swift
1001
- import UIKit
1002
- import AtomicXCore
1003
-
1004
- class CallViewController: UIViewController {
1005
- override func viewWillAppear(_ animated: Bool) {
1006
- super.viewWillAppear(animated)
1007
- // When entering the call interface, post a notification to hide the floating window
1008
- NotificationCenter.default.post(name: NSNotification.Name("HideFloatingWindow"), object: nil)
1009
- }
1010
-
1011
- override func viewWillDisappear(_ animated: Bool) {
1012
- super.viewWillDisappear(animated)
1013
- // When leaving the call interface, check if the call is still active
1014
- let selfStatus = CallStore.shared.state.value.selfInfo.status
1015
- if selfStatus == .accept {
1016
- // If the call is still ongoing, post a notification to show the floating window
1017
- NotificationCenter.default.post(name: NSNotification.Name("ShowFloatingWindow"), object: nil)
1018
- }
1019
- }
1020
- }
1021
- ```
1022
-
1023
- ### Enabling System Picture-in-Picture (PiP) Outside the App
1024
-
1025
- AtomicXCore SDK supports system-level PiP via the underlying TRTC engine. When your app goes to the background, the call video can float above other apps as a system PiP window, so users can continue their video call while multitasking.
1026
-
1027
- > **Note:**
1028
- >
1029
- > 1. In Xcode, add `Background Modes` under `Signing & Capabilities` and enable `Audio, AirPlay, and Picture in Picture`.
1030
- > 2. Requires iOS 15.0 or later.
1031
-
1032
- 1. **Configure PiP Parameters:** You need to set parameters such as the fill mode for the PiP window, user video regions, and canvas configurations.
1033
-
1034
- ```swift
1035
- import Foundation
1036
- import AtomicXCore
1037
-
1038
- // Fill Mode Enumeration
1039
- enum PictureInPictureFillMode: Int, Codable {
1040
- case fill = 0 // Aspect Fill (Scale to fill, may crop)
1041
- case fit = 1 // Aspect Fit (Scale to fit, no cropping)
1042
- }
1043
-
1044
- // User Video Region
1045
- struct PictureInPictureRegion: Codable {
1046
- let userId: String // Unique User ID
1047
- let width: Double // Width (0.0 - 1.0, relative to canvas)
1048
- let height: Double // Height (0.0 - 1.0, relative to canvas)
1049
- let x: Double // X coordinate (0.0 - 1.0, relative to top-left of canvas)
1050
- let y: Double // Y coordinate (0.0 - 1.0, relative to top-left of canvas)
1051
- let fillMode: PictureInPictureFillMode // Rendering fill mode
1052
- let streamType: String // Stream type ("high" for HD or "low" for SD)
1053
- let backgroundColor: String // Hex background color (e.g., "#000000")
1054
- }
1055
-
1056
- // Canvas Configuration
1057
- struct PictureInPictureCanvas: Codable {
1058
- let width: Int // Canvas width in pixels
1059
- let height: Int // Canvas height in pixels
1060
- let backgroundColor: String // Hex background color
1061
- }
1062
-
1063
- // Picture-in-Picture Parameters
1064
- struct PictureInPictureParams: Codable {
1065
- let enable: Bool // Toggle PiP functionality
1066
- let cameraBackgroundCapture: Bool? // Whether to continue camera capture in background
1067
- let canvas: PictureInPictureCanvas? // Canvas settings (Optional)
1068
- let regions: [PictureInPictureRegion]? // List of user video regions (Optional)
1069
- }
1070
-
1071
- // PiP API Request Object
1072
- struct PictureInPictureRequest: Codable {
1073
- let api: String // API identifier name
1074
- let params: PictureInPictureParams // Parameter payload
1075
- }
1076
- ```
1077
-
1078
- 2. **Enable Picture-in-Picture:** You can enable or disable the PiP feature using the `configPictureInPicture` method.
1079
-
1080
- ```swift
1081
- let params = PictureInPictureParams(
1082
- enable: true,
1083
- cameraBackgroundCapture: true,
1084
- canvas: nil,
1085
- regions: nil
1086
- )
1087
-
1088
- let request = PictureInPictureRequest(
1089
- api: "configPictureInPicture",
1090
- params: params
1091
- )
1092
-
1093
- // Encode to JSON string and call the Experimental API
1094
- let encoder = JSONEncoder()
1095
- if let data = try? encoder.encode(request),
1096
- let jsonString = String(data: data, encoding: .utf8) {
1097
- TUICallEngine.createInstance().callExperimentalAPI(jsonObject: jsonString)
1098
- }
1099
- ```
1100
-
1101
- ### Keeping the Screen Awake During Calls
1102
-
1103
- To prevent the screen from dimming or locking during a call, set `UIApplication.shared.isIdleTimerDisabled = true` when the call starts, and restore it when the call ends.
1104
-
1105
- ```swift
1106
- class CallViewController: UIViewController {
1107
- override func viewDidLoad() {
1108
- super.viewDidLoad()
1109
- // Disable automatic screen lock to keep the screen on
1110
- UIApplication.shared.isIdleTimerDisabled = true
1111
- }
1112
-
1113
- override func viewWillDisappear(_ animated: Bool) {
1114
- super.viewWillDisappear(animated)
1115
- // Restore the automatic screen lock behavior
1116
- UIApplication.shared.isIdleTimerDisabled = false
1117
- }
1118
- }
1119
- ```
1120
-
1121
- ### Playing a Ringtone While Waiting for Answer
1122
-
1123
- Listen to your own call status to play a ringtone while waiting for an answer, and stop the ringtone when the call is answered or ends.
1124
-
1125
- ```swift
1126
- import Combine
1127
-
1128
- private var cancellables = Set<AnyCancellable>()
1129
-
1130
- private func observeSelfCallStatus() {
1131
- CallStore.shared.state.subscribe()
1132
- .map { $0.selfInfo.status }
1133
- .removeDuplicates()
1134
- .receive(on: DispatchQueue.main)
1135
- .sink { [weak self] status in
1136
- if status == .accept || status == .none {
1137
- // Stop playing ringtone
1138
- return
1139
- }
1140
- if status == .waiting {
1141
- // Start playing ringtone
1142
- }
1143
- }
1144
- .store(in: &cancellables)
1145
- }
1146
- ```
1147
-
1148
- ### Enabling Background Audio/Video Capture
1149
-
1150
- To allow your app to capture audio and video while in the background (e.g., when the user locks the screen or switches apps), configure iOS background mode permissions and set up the audio session.
1151
-
1152
- **Configuration Steps:**
1153
-
1154
- 1. In Xcode, select your project `Target` → `Signing & Capabilities`.
1155
- 2. Click `+ Capability`.
1156
- 3. Add `Background Modes`.
1157
- 4. Enable:
1158
- - `Audio, AirPlay, and Picture in Picture` (for audio capture and PiP).
1159
- - `Voice over IP` (for VoIP calls).
1160
- - `Remote notifications` (optional, for offline push).
1161
-
1162
- Your `Info.plist` will then include:
1163
-
1164
- ```xml
1165
- <key>UIBackgroundModes</key>
1166
- <array>
1167
- <string>audio</string>
1168
- <string>voip</string>
1169
- <string>remote-notification</string>
1170
- </array>
1171
- ```
1172
-
1173
- **Configure Audio Session (`AVAudioSession`):**
1174
-
1175
- Set up the audio session before the call starts, ideally in the call interface's `viewDidLoad` or before making/answering a call.
1176
-
1177
- ```swift
1178
- import AVFoundation
1179
-
1180
- /**
1181
- * Configure the Audio Session to support background audio capture.
1182
- *
1183
- * Recommended to call this method in the following scenarios:
1184
- * 1. Inside viewDidLoad of the call interface.
1185
- * 2. Before initiating a call (calls).
1186
- * 3. Before answering a call (accept).
1187
- */
1188
- private func setupAudioSession() {
1189
- let audioSession = AVAudioSession.sharedInstance()
1190
- do {
1191
- // Set the audio session category to PlayAndRecord.
1192
- // .allowBluetooth: Support for standard Bluetooth headsets.
1193
- // .allowBluetoothA2DP: Support for high-quality Bluetooth audio (A2DP protocol).
1194
- try audioSession.setCategory(.playAndRecord, options: [.allowBluetooth, .allowBluetoothA2DP])
1195
- // Activate the audio session.
1196
- try audioSession.setActive(true)
1197
- } catch {
1198
- // Audio session configuration failed.
1199
- print("Failed to configure Audio Session: \(error)")
1200
- }
1201
- }
1202
- ```
1203
-
1204
- **Special Handling for Ringtone Playback (Optional):**
1205
-
1206
- To play a ringtone through the speaker while waiting for an answer, temporarily switch the audio session to `.playback` mode.
1207
-
1208
- ```swift
1209
- /**
1210
- * Switch the Audio Session for ringtone playback.
1211
- *
1212
- * Use Case: When using AVAudioPlayer to play the ringtone.
1213
- */
1214
- private func setAudioSessionForRingtone() {
1215
- let audioSession = AVAudioSession.sharedInstance()
1216
- do {
1217
- // Switch to playback mode (optimizes for output only)
1218
- try audioSession.setCategory(.playback, options: [.allowBluetooth, .allowBluetoothA2DP])
1219
- // Force the ringtone to play through the built-in speaker
1220
- try audioSession.overrideOutputAudioPort(.speaker)
1221
- try audioSession.setActive(true)
1222
- } catch {
1223
- // Failed to configure Audio Session for ringtone
1224
- print("Ringtone audio session error: \(error)")
1225
- }
1226
- }
1227
-
1228
- /**
1229
- * Restore to Call Mode after the ringtone stops playing.
1230
- */
1231
- private func restoreAudioSessionForCall() {
1232
- let audioSession = AVAudioSession.sharedInstance()
1233
- do {
1234
- // Restore to PlayAndRecord mode (required for two-way VoIP communication)
1235
- try audioSession.setCategory(.playAndRecord, options: [.allowBluetooth, .allowBluetoothA2DP])
1236
- try audioSession.setActive(true)
1237
- } catch {
1238
- // Failed to restore Audio Session
1239
- print("Failed to restore call audio session: \(error)")
1240
- }
1241
- }
1242
- ```
1243
-
1244
- ## FAQs
1245
-
1246
- ### If the callee is offline and comes online within the call invitation timeout, will they receive the incoming call event?
1247
-
1248
- For one-on-one calls, if the callee comes online within the timeout, they will receive an incoming call invitation. For group calls, if the callee comes online within the timeout, up to 20 pending group messages will be retrieved. If there is a call invitation, the incoming call event will be triggered.