@tencentcloud/sdk-mcp 1.6.8 → 1.7.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 (158) hide show
  1. package/CHANGELOG.md +36 -0
  2. package/README.md +59 -35
  3. package/knowledge/build-index.js +28 -4
  4. package/knowledge/chunker.js +82 -14
  5. package/knowledge/chunking-policy.js +100 -0
  6. package/knowledge/doc-url-resolver.js +70 -19
  7. package/knowledge/frontmatter-meta.js +167 -0
  8. package/knowledge/path-meta.js +28 -6
  9. package/knowledge/search/exact-lookup.js +126 -125
  10. package/knowledge/search/filter-pool.js +12 -29
  11. package/knowledge/search/framework-fallback.js +22 -0
  12. package/knowledge/search/intent-router.js +29 -0
  13. package/knowledge/search/l1-enrich.js +159 -0
  14. package/knowledge/search/query-normalizer.js +63 -3
  15. package/knowledge/search/search-core.js +410 -0
  16. package/knowledge/search/search-knowledge.js +419 -377
  17. package/knowledge/search/search-message.js +88 -0
  18. package/knowledge/search/search-pass.js +428 -0
  19. package/knowledge/search/search-types.js +1 -0
  20. package/knowledge/search/url-row-idf.js +120 -0
  21. package/knowledge/search/url-row-scorer.js +337 -0
  22. package/package.json +3 -1
  23. package/resource/index/manifest.json +1 -1
  24. package/resource/integration/callkit/preset/flutter/integration.md +7 -3
  25. package/resource/integration/callkit/preset/ios/integration.md +1 -0
  26. package/resource/integration/chat/preset/android/integration.md +1 -0
  27. package/resource/integration/chat/preset/flutter/integration.md +111 -10
  28. package/resource/integration/chat/preset/ios/integration.md +1 -0
  29. package/resource/integration/chat/preset/react/integration.md +1 -0
  30. package/resource/integration/chat/preset/uni-app/integration.md +1 -0
  31. package/resource/integration/chat/preset/vue/integration.md +1 -0
  32. package/resource/integration/livekit/preset/live/android/prepare-integration.md +1 -0
  33. package/resource/integration/livekit/preset/live/vue/live-player-desk-integration.md +12 -10
  34. package/resource/integration/livekit/preset/live/vue/live-pusher-integration.md +14 -14
  35. package/resource/integration/roomkit/preset/vue/integration.md +1 -0
  36. package/resource/knowledge/callkit/best-practice/callkit-miniprogram/uniapp-shrink.md +64 -0
  37. package/resource/knowledge/callkit/best-practice/common/call-autoplay-blocked.md +81 -0
  38. package/resource/knowledge/callkit/best-practice/common/call-message-in-chat.md +84 -0
  39. package/resource/knowledge/callkit/best-practice/common/call-vs-calls.md +114 -0
  40. package/resource/knowledge/callkit/best-practice/common/callengine-call-flow.md +128 -0
  41. package/resource/knowledge/callkit/best-practice/common/callengine-log-level.md +72 -0
  42. package/resource/knowledge/callkit/best-practice/common/callkit-get-engine-instance.md +87 -0
  43. package/resource/knowledge/callkit/best-practice/common/callkit-get-roomid.md +83 -0
  44. package/resource/knowledge/callkit/best-practice/common/callkit-limitations.md +37 -0
  45. package/resource/knowledge/callkit/best-practice/common/callkit-user-register-and-kicked.md +103 -0
  46. package/resource/knowledge/callkit/core-sdk/android/answer-call.md +1 -0
  47. package/resource/knowledge/callkit/core-sdk/android/make-call.md +1 -0
  48. package/resource/knowledge/callkit/core-sdk/flutter/answer-call.md +1 -0
  49. package/resource/knowledge/callkit/core-sdk/flutter/make-call.md +1 -0
  50. package/resource/knowledge/callkit/core-sdk/ios/answer-call.md +1 -0
  51. package/resource/knowledge/callkit/core-sdk/ios/make-call.md +1 -0
  52. package/resource/knowledge/callkit/core-sdk/ios/offline-push.md +1 -1
  53. package/resource/knowledge/callkit/core-sdk/uni-app/answer-call.md +1 -0
  54. package/resource/knowledge/callkit/core-sdk/uni-app/make-call.md +1 -0
  55. package/resource/knowledge/callkit/faq/flutter.md +1 -0
  56. package/resource/knowledge/callkit/faq/uniapp-app.md +1 -0
  57. package/resource/knowledge/callkit/preset/react/api.md +1 -150
  58. package/resource/knowledge/callkit/preset/vue/api.md +1 -38
  59. package/resource/knowledge/chat/best-practice/common/avchatroom-message-loss-diagnosis.md +71 -0
  60. package/resource/knowledge/chat/best-practice/common/group-conversation-cleanup-on-system-notice.md +67 -0
  61. package/resource/knowledge/chat/best-practice/common/image-message-url-lifecycle.md +63 -0
  62. package/resource/knowledge/chat/best-practice/common/login-repeat-2025-diagnosis.md +65 -0
  63. package/resource/knowledge/chat/best-practice/common/message-read-report-and-receipt.md +72 -0
  64. package/resource/knowledge/chat/best-practice/common/message-receive-event.md +70 -0
  65. package/resource/knowledge/chat/best-practice/common/message-risk-error-and-render.md +69 -0
  66. package/resource/knowledge/chat/best-practice/common/message-unread-count.md +71 -0
  67. package/resource/knowledge/chat/best-practice/miniprogram/audio-message-send.md +118 -0
  68. package/resource/knowledge/chat/best-practice/miniprogram/login-timeout-2801-diagnosis.md +67 -0
  69. package/resource/knowledge/chat/best-practice/miniprogram/media-upload-fail-diagnosis.md +68 -0
  70. package/resource/knowledge/chat/best-practice/web/audio-message-send.md +123 -0
  71. package/resource/knowledge/chat/preset/android/features/conversation-list.md +1 -0
  72. package/resource/knowledge/chat/preset/android/features/language.md +1 -0
  73. package/resource/knowledge/chat/preset/android/features/message-input.md +1 -0
  74. package/resource/knowledge/chat/preset/android/features/message-list.md +1 -0
  75. package/resource/knowledge/chat/preset/android-view/integration.md +1 -0
  76. package/resource/knowledge/chat/preset/flutter/features/conversation-list.md +1 -0
  77. package/resource/knowledge/chat/preset/flutter/features/message-input.md +1 -0
  78. package/resource/knowledge/chat/preset/flutter/features/message-list.md +1 -0
  79. package/resource/knowledge/chat/preset/ios/features/conversation-list.md +1 -0
  80. package/resource/knowledge/chat/preset/ios/features/message-input.md +1 -0
  81. package/resource/knowledge/chat/preset/ios/features/message-list.md +1 -0
  82. package/resource/knowledge/chat/preset/ios-uikit/integration.md +1 -0
  83. package/resource/knowledge/chat/preset/react/features/conversation-preview.md +1 -0
  84. package/resource/knowledge/chat/preset/react/features/message-input.md +61 -3
  85. package/resource/knowledge/chat/preset/react/features/message-list.md +7 -0
  86. package/resource/knowledge/chat/preset/vue/features/message-input.md +58 -5
  87. package/resource/knowledge/chat/preset/vue/features/message-list.md +7 -0
  88. package/resource/knowledge/chat/urls/product.md +8 -8
  89. package/resource/knowledge/chat/urls/restapi.md +3 -3
  90. package/resource/knowledge/chat/urls/sdk/android.md +5 -5
  91. package/resource/knowledge/chat/urls/sdk/flutter.md +5 -5
  92. package/resource/knowledge/chat/urls/sdk/ios.md +5 -5
  93. package/resource/knowledge/chat/urls/sdk/web.md +8 -8
  94. package/resource/knowledge/chat/urls/webhook.md +11 -17
  95. package/resource/knowledge/livekit/best-practice/android/voice-room-anchor-start.md +124 -0
  96. package/resource/knowledge/livekit/best-practice/common/admin-take-seat.md +73 -0
  97. package/resource/knowledge/livekit/best-practice/common/audience-leave-live.md +81 -0
  98. package/resource/knowledge/livekit/best-practice/common/voice-room-no-audio-troubleshoot.md +100 -0
  99. package/resource/knowledge/livekit/best-practice/common/voice-room-seat-list-change.md +65 -0
  100. package/resource/knowledge/livekit/best-practice/flutter/voice-room-anchor-start.md +126 -0
  101. package/resource/knowledge/livekit/best-practice/ios/voice-room-anchor-start.md +130 -0
  102. package/resource/knowledge/push/config/harmonyos.md +1 -1
  103. package/resource/knowledge/push/config/ios.md +2 -2
  104. package/resource/knowledge/push/config/react-native.md +1 -0
  105. package/resource/knowledge/push/config/unity.md +1 -0
  106. package/resource/knowledge/push/config/unreal-engine.md +1 -0
  107. package/resource/knowledge/push/integration/android.md +17 -16
  108. package/resource/knowledge/push/integration/donut.md +2 -2
  109. package/resource/knowledge/push/integration/flutter.md +4 -3
  110. package/resource/knowledge/push/integration/harmonyos.md +1 -1
  111. package/resource/knowledge/push/integration/ios.md +4 -3
  112. package/resource/knowledge/push/integration/react-native.md +1 -1
  113. package/resource/knowledge/push/integration/uni-app.md +1 -0
  114. package/resource/knowledge/push/integration/unity.md +4 -4
  115. package/resource/knowledge/push/integration/unreal-engine.md +37 -35
  116. package/resource/knowledge/roomkit/best-practice/common/room-ghost-member.md +75 -0
  117. package/resource/knowledge/roomkit/best-practice/common/room-limit-and-multi.md +88 -0
  118. package/resource/knowledge/roomkit/best-practice/common/room-screen-share-preview.md +87 -0
  119. package/resource/knowledge/roomkit/best-practice/common/room-status-after-all-leave.md +73 -0
  120. package/resource/knowledge/roomkit/best-practice/vue/room-uikit-vs-atomicx.md +115 -0
  121. package/resource/knowledge/roomkit/core-sdk/android/call-user-to-room.md +1 -0
  122. package/resource/knowledge/roomkit/core-sdk/android/room-participant-state.md +1 -0
  123. package/resource/knowledge/roomkit/core-sdk/android/room-state.md +1 -0
  124. package/resource/knowledge/roomkit/core-sdk/android/schedule-room.md +1 -0
  125. package/resource/knowledge/roomkit/core-sdk/flutter/call-user-to-room.md +1 -0
  126. package/resource/knowledge/roomkit/core-sdk/flutter/room-participant-state.md +1 -0
  127. package/resource/knowledge/roomkit/core-sdk/flutter/room-state.md +1 -0
  128. package/resource/knowledge/roomkit/core-sdk/flutter/schedule-room.md +1 -0
  129. package/resource/knowledge/roomkit/core-sdk/ios/call-user-to-room.md +1 -0
  130. package/resource/knowledge/roomkit/core-sdk/ios/room-participant-state.md +1 -0
  131. package/resource/knowledge/roomkit/core-sdk/ios/room-state.md +1 -0
  132. package/resource/knowledge/roomkit/core-sdk/ios/schedule-room.md +1 -0
  133. package/resource/knowledge/roomkit/core-sdk/vue/room-view.md +1 -0
  134. package/resource/knowledge/roomkit/preset/react/integration.md +1 -0
  135. package/resource/knowledge/rtcengine/web/plugin/30-advanced-cross-room-link.md +2 -0
  136. package/resource/knowledge/rtcengine/web/plugin/39-advanced-video-decoder.md +2 -0
  137. package/resource/knowledge/trtc/android/TRTCCloud.md +1 -0
  138. package/resource/knowledge/trtc/c++/ITRTCCloud.md +1 -0
  139. package/resource/knowledge/trtc/ios/TRTCCloud.md +1 -0
  140. package/server.js +9 -4
  141. package/streamable-http.js +19 -54
  142. package/tools/common/search_trtc_knowledge.js +24 -12
  143. package/tools/definitions/finalize_answer_def.js +2 -2
  144. package/tools/definitions/integration-boundary.js +2 -1
  145. package/tools/definitions/search_trtc_knowledge_def.js +5 -3
  146. package/utils/fetch-doc-content.js +198 -0
  147. package/utils/preflight-route.js +197 -0
  148. package/utils/report-cls-client.js +1 -1
  149. package/utils/report-es-client.js +1 -1
  150. package/cursor-setting.png +0 -0
  151. package/mcp-server-prompt.png +0 -0
  152. package/resource/knowledge/callkit/best-practice/web/callengine-invitation.md +0 -80
  153. package/resource/knowledge/callkit/best-practice/web/callengine-log-control.md +0 -20
  154. package/resource/knowledge/callkit/best-practice/web/callkit-call-vs-calls.md +0 -116
  155. package/resource/knowledge/callkit/preset/react/uikit-api-reference.md +0 -469
  156. package/resource/knowledge/callkit/preset/vue/uikit-api-reference.md +0 -581
  157. package/resource/knowledge/callkit/preset/web/api.md +0 -79
  158. package/resource/knowledge/chat/best-practice/web/image-message-url-handling.md +0 -16
@@ -0,0 +1,73 @@
1
+ ---
2
+ title: 语聊房管理员上麦与麦位锁定操作
3
+ product: live
4
+ frameworks: [android, ios, flutter]
5
+ scope: platform_common
6
+ tags: [语聊房, 管理员, 上麦, takeSeat, lockSeat, unlockSeat, seatMode, FREE, 麦位, 主持麦位, 房主同意, VoiceRoom]
7
+ version_range: ">=2.0.0"
8
+ ---
9
+
10
+ # 语聊房管理员上麦与麦位锁定操作
11
+
12
+ ## 1. 核心结论
13
+
14
+ - 管理员上麦调用 `takeSeat` 并传入麦位序号,不需要调用 `applyForSeat`,**不受 `seatMode=APPLY` 限制**,也**不需要**房主同意。
15
+ - 管理员上麦**不受 `lockSeat` 锁定限制**,可直接 `takeSeat` 到任意麦位(含 0 号主持麦位)。
16
+ - 普通用户仅在 `seatMode` 为 `FREE` 时才能调用 `takeSeat` 上麦,且**受 `lockSeat` 锁定限制**。
17
+ - 三端(Android/iOS/Flutter)`LiveSeatStore` 的麦位操作 API 一致。
18
+
19
+ ## 2. 字段语义对照
20
+
21
+ | 字段/能力 | 作用 | 说明 |
22
+ |---|---|---|
23
+ | `takeSeat` | 上麦 | 传入麦位序号上麦;管理员不受 `seatMode`/`lockSeat` 限制;普通用户需 `seatMode=FREE` 且麦位未锁定 |
24
+ | `lockSeat` | 锁定麦位 | 锁定后普通用户无法 `takeSeat`,管理员不受影响 |
25
+ | `unlockSeat` | 解锁麦位 | 解锁后普通用户才能 `takeSeat` |
26
+ | `seatMode` | 上麦模式 | 普通用户仅在 `FREE` 模式下可 `takeSeat` |
27
+ | `LiveSeatStore` | 麦位管理 | 提供 `takeSeat`/`leaveSeat`/`lockSeat`/`unlockSeat` 等操作 |
28
+ | 房主 | 房间所有者 | 可锁定/解锁麦位 |
29
+
30
+ ## 3. 机制/时序
31
+
32
+ ### 管理员上麦
33
+
34
+ 管理员调用 `takeSeat(index)` 直接上麦(传入目标麦位序号)-> 不受 `seatMode` 限制 -> 无需房主同意 -> 不受 `lockSeat` 锁定限制,直接上麦成功。
35
+
36
+ ## 4. 标准用法
37
+
38
+ 1. **管理员上麦**:调用 `takeSeat(index)`,`index` 为目标麦位序号(如 0 号主持麦位),不受 `seatMode`/`lockSeat` 限制。
39
+ 2. **普通用户上麦**:确认 `seatMode=FREE`,且目标麦位未锁定,调用 `takeSeat(index)`。
40
+ 3. **锁麦位**:管理员/房主调用 `lockSeat(index)` 锁定,锁定后普通用户不可 `takeSeat`,管理员不受影响。
41
+ 4. **解锁后上麦**:先 `unlockSeat(index)` 解锁,普通用户再 `takeSeat(index)` 上麦。
42
+
43
+ ```javascript
44
+ // 三端 API 一致,仅语言风格略有差异(Android Kotlin / iOS Swift / Flutter Dart)
45
+ // 1. 管理员直接上麦(不受 seatMode / lockSeat 限制,无需房主同意)
46
+ liveSeatStore.takeSeat(0); // 上麦到 0 号主持麦位
47
+ ```
48
+
49
+ ## 5. 结果判定
50
+
51
+ - 管理员 `takeSeat(index)` 直接成功,不受 `seatMode` 限制,无房主同意。
52
+ - `lockSeat` 后管理员 `takeSeat` 同一麦位仍成功(管理员不受锁麦限制)。
53
+ - 普通用户仅 `seatMode=FREE` 时 `takeSeat` 成功;麦位被锁定则失败,需先 `unlockSeat`。
54
+
55
+ ## 6. 常见误区
56
+
57
+ - 误区 1:管理员上麦时调用 `applyForSeat` 申请(管理员直接 `takeSeat`,无需申请)。
58
+ - 误区 2:认为管理员 `takeSeat` 需要房主同意(管理员不受此限制)。
59
+ - 误区 3:认为 `lockSeat` 后管理员也不能 `takeSeat` 同一麦位(管理员不受锁麦限制,仅普通用户受限)。
60
+
61
+ ## 7. 问题定义(检索辅助,极简)
62
+
63
+ 语聊房管理员如何直接上麦到指定麦位(含 0 号主持麦位)、管理员是否受 `seatMode`/`lockSeat` 限制,以及普通用户上麦的 `seatMode` 与锁定条件。
64
+
65
+ ## 8. 同义问法覆盖(检索召回,极简)
66
+
67
+ - 语聊房管理员怎么上麦到 0 号麦位?
68
+ - 管理员 `takeSeat` 需要房主同意吗?
69
+ - 管理员上麦受 `seatMode` 限制吗?
70
+ - 锁麦后管理员能 `takeSeat` 吗?
71
+ - 普通用户什么时候能 `takeSeat`?
72
+ - `seatMode=FREE` 时普通用户能上麦吗?
73
+ - 锁定的麦位怎么解锁再上麦?
@@ -0,0 +1,81 @@
1
+ ---
2
+ title: 语聊房观众离房与麦位状态说明
3
+ product: live
4
+ frameworks: [android, ios, flutter]
5
+ scope: platform_common
6
+ tags: [语聊房, 观众, 上麦, 下麦, leaveLive, leaveSeat, 退出, 麦位, 重新上麦, VoiceRoom]
7
+ version_range: ">=2.0.0"
8
+ ---
9
+
10
+ # 语聊房观众离房与麦位状态说明
11
+
12
+ ## 1. 核心结论
13
+
14
+ - 语聊房观众在麦上调用 `leaveLive` 退出后,会自动下麦。
15
+ - 退出后再进房,**不在麦上**,需要重新上麦。
16
+ - 上麦方式取决于 `seatMode`:
17
+ - `seatMode = FREE`:直接调用 `takeSeat` 即可上麦。
18
+ - `seatMode = APPLY`:需调用 `applyForSeat` 发起上麦申请,房主/管理员同意后才上麦。
19
+ - `leaveLive` **不需要**先调用 `leaveSeat`,退出会自动下麦。
20
+ - 三端(Android/iOS/Flutter)行为一致。
21
+
22
+ ## 2. 字段语义对照
23
+
24
+ | 字段/能力 | 作用 | 说明 |
25
+ |---|---|---|
26
+ | `leaveLive` | 退出语聊房 | 退出房间,自动下麦 |
27
+ | `leaveSeat` | 主动下麦 | 主动下麦时使用;`leaveLive` 退出时会自动下麦,无需先调用 |
28
+ | `takeSeat` | 自由上麦(`seatMode = FREE`) | 自由模式下重新进房后直接调用上麦 |
29
+ | `applyForSeat` | 申请上麦(`seatMode = APPLY`) | 申请模式下需发起申请,房主/管理员审批通过后上麦 |
30
+ | `seatMode` | 麦位模式 | `FREE`:自由上麦;`APPLY`:需申请审批 |
31
+ | 麦位状态 | 是否在麦上 | `leaveLive` 后清空,重新进房需重新上麦 |
32
+
33
+ ## 3. 机制/时序
34
+
35
+ 观众在麦上调用 `leaveLive` -> 自动下麦(无需先 `leaveSeat`)-> 退出房间 -> 重新进房 -> 麦位状态为空,不在麦上 -> 根据 `seatMode` 选择上麦方式:
36
+
37
+ - `seatMode = FREE`:调用 `takeSeat(seatIndex)` 直接上麦。
38
+ - `seatMode = APPLY`:调用 `applyForSeat(seatIndex)` 发起申请,等待房主/管理员审批。
39
+
40
+ ## 4. 标准用法
41
+
42
+ ```javascript
43
+ // 三端 API 一致,仅语言风格略有差异(Android Kotlin / iOS Swift / Flutter Dart)
44
+ // 1. 直接退出语聊房(会自动下麦,无需先 leaveSeat)
45
+ liveListStore.leaveLive();
46
+
47
+ // 2. 重新进房后,根据 seatMode 选择上麦方式
48
+ // seatMode = FREE 时:直接上麦
49
+ liveSeatStore.takeSeat(seatIndex);
50
+
51
+ // seatMode = APPLY 时:申请上麦(需房主/管理员同意)
52
+ liveSeatStore.applyForSeat(seatIndex);
53
+ ```
54
+
55
+ ## 5. 结果判定
56
+
57
+ - `leaveLive` 后,当前用户自动下麦。
58
+ - 重新进房后,`LiveSeatStore.seatList` 中不含该用户。
59
+ - `seatMode = FREE`:调用 `takeSeat` 成功后回到麦上。
60
+ - `seatMode = APPLY`:调用 `applyForSeat` 后等待审批,审批通过后回到麦上。
61
+
62
+ ## 6. 常见误区
63
+
64
+ - 误区 1:退出前先调用 `leaveSeat`(不需要,`leaveLive` 会自动下麦)。
65
+ - 误区 2:认为重新进房后还在麦上(需要重新上麦)。
66
+ - 误区 3:担心 `leaveLive` 未下麦导致麦位残留(自动下麦,无残留)。
67
+ - 误区 4:`seatMode = APPLY` 时直接调用 `takeSeat`(应使用 `applyForSeat`,否则会报错或无效)。
68
+
69
+ ## 7. 问题定义(检索辅助,极简)
70
+
71
+ 语聊房观众在麦上退出房间后是否自动下麦、重新进房是否还在麦上、`leaveLive` 是否需要先 `leaveSeat`、不同 `seatMode`(FREE/APPLY)下如何重新上麦(`takeSeat` vs `applyForSeat`)。
72
+
73
+ ## 8. 同义问法覆盖(检索召回,极简)
74
+
75
+ - 语聊房退出后会下麦吗?
76
+ - 重新进房还要上麦吗?
77
+ - `leaveLive` 之前要调用 `leaveSeat` 吗?
78
+ - 语聊房观众退出房间麦位会清空吗?
79
+ - 进房后怎么重新上麦?
80
+ - `seatMode = APPLY` 时怎么上麦?
81
+ - `takeSeat` 和 `applyForSeat` 什么时候用?
@@ -0,0 +1,100 @@
1
+ ---
2
+ title: 语聊房观众听不到主播说话排查指南
3
+ product: live
4
+ frameworks: [android, ios, flutter]
5
+ scope: platform_common
6
+ tags: [语聊房, 听不到声音, 没声音, 排查, LiveSeatStore, DeviceStore, takeSeat, openLocalMicrophone, unmuteMicrophone, LoginStore, joinLive, seatList, microphoneStatus, LiveSeatState, DeviceState]
7
+ version_range: ">=2.0.0"
8
+ ---
9
+
10
+ # 语聊房观众听不到主播说话排查指南
11
+
12
+ ## 1. 核心结论
13
+
14
+ - 观众听不到主播说话时,按「主播侧 → 观众侧」顺序排查,从房间/上麦/麦克风/静音/登录/进房逐层检查状态。
15
+ - 主播侧:确认主播在麦上(`seatList`)、麦克风已打开(`DeviceStore.microphoneStatus`)、未静音(`userInfo.microphoneStatus`)。
16
+ - 观众侧:确认已登录(`loginStatus == LOGIN`)、已进房(`currentLive`)、手机音量正常、主播 `microphoneStatus` 正常。
17
+ - 三端(Android/iOS/Flutter)API 与状态结构一致,排查流程通用。
18
+
19
+ ## 2. 字段语义对照
20
+
21
+ | 字段/能力 | 作用 | 说明 |
22
+ |---|---|---|
23
+ | `LiveSeatStore` | 麦位管理 | 提供 `seatList`,查看其中是否有主播信息判断主播是否在麦上 |
24
+ | `LiveSeatStore.seatList` | 麦位列表 | 查看其中是否有主播信息;主播 item 的 `userInfo.microphoneStatus` 判断是否静音 |
25
+ | `takeSeat` | 上麦 | 主播不在麦上时调用 |
26
+ | `DeviceStore` | 设备管理 | 提供 `DeviceState`,查看 `microphoneStatus` 判断麦克风是否打开 |
27
+ | `DeviceState.microphoneStatus` | 麦克风开关状态 | 判断主播是否打开麦克风 |
28
+ | `openLocalMicrophone` | 打开麦克风 | 麦克风关闭时调用 |
29
+ | `unmuteMicrophone` | 恢复发布音频 | 主播静音时调用 |
30
+ | `LoginStore` | 登录管理 | 提供 `loginState.loginStatus`,`LOGIN` 表示已登录 |
31
+ | `LiveListStore` | 直播间管理 | 提供 `LiveListState.currentLive`,判断是否进房成功 |
32
+ | `joinLive` | 进入房间 | 观众未进房时调用 |
33
+
34
+ ## 3. 机制/时序
35
+
36
+ ### 主播侧排查(按序)
37
+
38
+ 1. 是否在麦上:查看 `LiveSeatStore.seatList` 是否含主播信息,否则调用 `takeSeat` 上麦。
39
+ 2. 麦克风是否打开:查看 `DeviceState.microphoneStatus`,关闭则调用 `openLocalMicrophone`。
40
+ 3. 是否静音:查看 `seatList` 主播 item 的 `userInfo.microphoneStatus`,关闭则调用 `unmuteMicrophone`。
41
+
42
+ ### 观众侧排查(按序)
43
+
44
+ 1. 是否已登录:查看 `loginState.loginStatus` 是否为 `LOGIN`。
45
+ 2. 是否进房成功:查看 `LiveListState.currentLive` 是否为当前直播间,否则调用 `joinLive` 进房。
46
+ 3. 手机音量是否正常:确认系统音量可听到声音。
47
+
48
+ ## 4. 标准用法
49
+
50
+ 按以下流程逐项排查,确认状态后对应处理:
51
+
52
+ ```text
53
+ 观众听不到主播说话
54
+ │
55
+ ├── 主播侧排查
56
+ │ ├── 1. 是否在麦上? → 否 → takeSeat 上麦
57
+ │ │ 查看 LiveSeatStore.seatList
58
+ │ ├── 2. 麦克风是否打开? → 否 → openLocalMicrophone
59
+ │ │ 查看 DeviceState.microphoneStatus
60
+ │ └── 3. 是否静音? → 是 → unmuteMicrophone
61
+ │ 查看 seatList 主播 userInfo.microphoneStatus
62
+ │
63
+ └── 观众侧排查
64
+ ├── 1. 是否已登录? → 否 → 登录
65
+ │ 查看 loginState.loginStatus == LOGIN
66
+ ├── 2. 是否进房? → 否 → joinLive 进房
67
+ │ 查看 LiveListState.currentLive
68
+ └── 3. 手机音量正常? → 否 → 调整音量
69
+ ```
70
+
71
+ ## 5. 结果判定
72
+
73
+ - 主播 `LiveSeatStore.seatList` 含主播信息:在麦上,可推流。
74
+ - `DeviceState.microphoneStatus` 打开:麦克风已采集。
75
+ - `userInfo.microphoneStatus` 打开:未静音,音频正常发布。
76
+ - 观众 `loginStatus == LOGIN`:已登录。
77
+ - `LiveListState.currentLive` 为当前直播间:已进房。
78
+ - 以上全部满足后观众仍听不到声音:检查手机音量或联系开发人员。
79
+
80
+ ## 6. 常见误区
81
+
82
+ - 误区 1:只排查观众侧,忽略主播侧的上麦/麦克风/静音状态。
83
+ - 误区 2:混淆 `DeviceState.microphoneStatus`(设备开关)与 `userInfo.microphoneStatus`(是否静音)——前者是本地设备采集,后者是远端状态。
84
+ - 误区 3:主播未上麦就推流(上麦是推流前提)。
85
+ - 误区 4:观众未进房(`currentLive` 不对)就认为主播无声。
86
+ - 误区 5:跳过登录状态检查,直接排查音频链路。
87
+
88
+ ## 7. 问题定义(检索辅助,极简)
89
+
90
+ 语聊房观众听不到主播说话时,如何按主播侧(上麦/麦克风/静音)和观众侧(登录/进房/音量)逐层排查并定位问题。
91
+
92
+ ## 8. 同义问法覆盖(检索召回,极简)
93
+
94
+ - 语聊房观众听不到主播声音怎么办?
95
+ - 语聊房麦克风没声音怎么排查?
96
+ - 主播在麦上但观众听不到声音?
97
+ - `microphoneStatus` 怎么看主播是否静音?
98
+ - 语聊房进房后没声音?
99
+ - 语聊房如何判断主播是否上麦?
100
+ - 观众听不到声音先排查什么?
@@ -0,0 +1,65 @@
1
+ ---
2
+ title: 语聊房麦位麦克风状态同步说明
3
+ product: live
4
+ frameworks: [android, ios, flutter]
5
+ scope: platform_common
6
+ tags: [语聊房, 麦位, 麦克风状态, 开麦, 关麦, userMicrophoneStatus, SeatListChanged, muteMicrophone, unmuteMicrophone, closeMicrophone, openMicrophone, 同步]
7
+ version_range: ">=2.0.0"
8
+ ---
9
+
10
+ # 语聊房麦位麦克风状态同步说明
11
+
12
+ ## 1. 核心结论
13
+
14
+ - 主播侧和观众侧通过 **`SeatListChanged`** 监听麦位上麦克风状态(`userMicrophoneStatus`)变化。
15
+ - `userMicrophoneStatus` 取值:`0` 开麦,`1` 关麦(自己关麦,自己可打开),`2` 关麦(管理员操作关麦,自己打不开)。
16
+ - `userMicrophoneStatus` 状态只能由**主播或上麦后的观众**通过 `mute/unmute` 或 `close/open` 相关 API 触发改变。
17
+ - 观众侧仅监听状态,**不需要**主动调用 `mute/unmute` 或 `close/open` 去修改 `userMicrophoneStatus`。
18
+
19
+ ## 2. 字段语义对照
20
+
21
+ | 字段/能力 | 作用 | 说明 |
22
+ |---|---|---|
23
+ | `userMicrophoneStatus` | 麦位麦克风开关状态 | `0` 开麦;`1` 关麦(自己关麦,自己可打开);`2` 关麦(管理员操作关麦,自己打不开) |
24
+ | `SeatListChanged` | 麦位列表变更 | 主播侧和观众侧通过它监听 `userMicrophoneStatus` 变化,SDK 自动同步 |
25
+ | `muteMicrophone` / `unmuteMicrophone` | 静音 / 取消静音 | 主播或上麦观众调用,触发 `userMicrophoneStatus` 变化 |
26
+ | `closeMicrophone` / `openMicrophone` | 关闭 / 打开麦克风 | 主播或上麦观众调用,触发 `userMicrophoneStatus` 变化 |
27
+ | 观众侧 | 只读状态 | 仅监听状态,不主动调用 `mute/unmute` 或 `close/open` |
28
+
29
+ ## 3. 机制/时序
30
+
31
+ 主播或上麦观众调用 `mute/unmute` 或 `close/open` 相关 API -> 触发 `userMicrophoneStatus` 变化 -> SDK 触发 `SeatListChanged`,自动同步到各端 -> 主播侧和观众侧都通过 `SeatListChanged` 收到更新后的麦位状态。
32
+
33
+ `userMicrophoneStatus` 的改变只能由主播或上麦观众通过 `mute/unmute` 或 `close/open` API 触发;观众侧仅监听状态,不主动修改。
34
+
35
+ ## 4. 标准用法
36
+
37
+ 主播侧和观众侧监听 `SeatListChanged`,根据 `userMicrophoneStatus` 更新 UI 即可。
38
+ 主播或上麦后的观众通过 `mute/unmute` 或 `close/open` API 改变麦克风状态,SDK 自动同步到各端。
39
+
40
+ ## 5. 结果判定
41
+
42
+ - 主播或上麦后的观众调用 `mute/unmute` 或 `close/open` 后,各端 `SeatListChanged` 中 `userMicrophoneStatus` 同步更新。
43
+ - `userMicrophoneStatus = 0`:开麦。
44
+ - `userMicrophoneStatus = 1`:关麦(自己关麦,自己可重新打开)。
45
+ - `userMicrophoneStatus = 2`:关麦(管理员操作关麦,自己打不开)。
46
+ - 观众侧无需主动调用 `mute/unmute` 或 `close/open`,状态由 SDK 自动同步。
47
+
48
+ ## 6. 常见误区
49
+
50
+ - 误区 1:观众调用 `mute/unmute` 或 `close/open` 去操作 `userMicrophoneStatus`(不需要,状态由 SDK 自动同步,观众侧只读)。
51
+ - 误区 2:认为 `userMicrophoneStatus = 1` 和 `2` 含义相同(`1` 是自己关麦可自行打开,`2` 是管理员关麦自己打不开)。
52
+ - 误区 3:认为 `userMicrophoneStatus` 可以由观众端主动改变(只能由主播或上麦观众通过 `mute/unmute` 或 `close/open` 触发)。
53
+
54
+ ## 7. 问题定义(检索辅助,极简)
55
+
56
+ 语聊房麦位麦克风状态(`userMicrophoneStatus`)各取值含义、如何通过 `SeatListChanged` 同步到主播侧和观众侧,以及哪些角色通过哪些 API 能改变该状态。
57
+
58
+ ## 8. 同义问法覆盖(检索召回,极简)
59
+
60
+ - 语聊房观众看不到主播开麦状态怎么办?
61
+ - `userMicrophoneStatus` 0/1/2 分别代表什么?
62
+ - `SeatListChanged` 麦位麦克风状态怎么同步?
63
+ - 谁可以改变 `userMicrophoneStatus`?
64
+ - 观众要调用 `muteMicrophone` 更新开麦状态吗?
65
+ - 管理员关麦后用户能自己打开吗?
@@ -0,0 +1,126 @@
1
+ ---
2
+ title: 语聊房房主创建房间并开播推流(Flutter)
3
+ product: live
4
+ frameworks: [flutter]
5
+ scope: platform_specific
6
+ tags: [语聊房, 房主, 开播, 推流, createLive, openLocalMicrophone, muteMicrophone, unmuteMicrophone, LiveListStore, AudioSalon, keepOwnerOnSeat, seatMode, TakeSeatMode, Flutter, AtomicXCore]
7
+ version_range: ">=2.0.0"
8
+ ---
9
+
10
+ # 语聊房房主创建房间并开播推流(Flutter)
11
+
12
+ ## 1. 核心结论
13
+
14
+ - 语聊房开播流程:构造 `LiveInfo`(含 `liveID`、`seatTemplate`、`seatMode`、`keepOwnerOnSeat`),调用 `createLive` 创建房间;成功后调用 `openLocalMicrophone` 采集音频并发布推流,房间内用户即可听到主播声音。
15
+ - `liveID` 必填;`keepOwnerOnSeat` 设为 `true` 时主播进房后自动上麦(上麦是推流的前提,只有上麦的用户才能在房间内推音频流)。
16
+ - `seatTemplate` 设为语聊房模板 `AudioSalon(n)`,n 为套餐支持的最大麦位数或小于该值的麦位数。
17
+ - `seatMode` 设置上麦模式(如 `TakeSeatMode.apply` 申请上麦)。
18
+ - `muteMicrophone` 暂停发布本机音频流;`unmuteMicrophone` 恢复发布本机音频流。
19
+
20
+ ## 2. 字段语义对照
21
+
22
+ | 字段/能力 | 作用 | 说明 |
23
+ |---|---|---|
24
+ | `LiveInfo` | 房间信息 | Dart 构造器 `LiveInfo({liveID, liveName, seatTemplate, seatMode, keepOwnerOnSeat})` |
25
+ | `liveID` | 房间 ID | `createLive` 必填参数 |
26
+ | `liveName` | 房间名称 | 创建房间的展示名称 |
27
+ | `seatTemplate` | 麦位布局模板 | 语聊房使用 `AudioSalon(n)`,n ≤ 套餐最大麦位数 |
28
+ | `seatMode` | 上麦模式 | 如 `TakeSeatMode.apply` 申请上麦 |
29
+ | `keepOwnerOnSeat` | 房主自动上麦 | 设为 `true`,主播进房后自动上麦 |
30
+ | `createLive(liveInfo)` | 创建房间(开播) | 传入 `LiveInfo`,返回 `Future<result>` 异步处理 |
31
+ | `result.isSuccess` | 是否成功 | `true` 为创建成功 |
32
+ | `result.message` | 错误信息 | 失败时返回错误描述 |
33
+ | `openLocalMicrophone` | 采集音频并发布 | 打开本地麦克风,发布音频流到房间 |
34
+ | `muteMicrophone` | 暂停发布音频 | 已打开麦克风时,暂停发布本地音频流 |
35
+ | `unmuteMicrophone` | 恢复发布音频 | 已打开麦克风时,恢复发布本地音频流 |
36
+
37
+ ## 3. 机制/时序
38
+
39
+ 构造 `LiveInfo`(`liveID` 必填,`seatTemplate=AudioSalon(n)`,`seatMode` 按需设置,`keepOwnerOnSeat=true`) -> `await createLive(liveInfo)` -> `result.isSuccess` 为 `true`,房主默认自动上麦 -> 调用 `openLocalMicrophone` 采集并发布音频 -> 房间内用户听到主播声音。
40
+
41
+ 上麦是推流的前提:`keepOwnerOnSeat=true` 保证房主上麦后才能推音频流。`muteMicrophone` / `unmuteMicrophone` 用于推流过程中的暂停/恢复。
42
+
43
+ ## 4. 标准用法
44
+
45
+ 1. 构造 `LiveInfo`:设置 `liveID`、`seatTemplate`、`seatMode`、`keepOwnerOnSeat`。
46
+ 2. `await _liveListStore.createLive(liveInfo)` 发起开播。
47
+ 3. 判断 `result.isSuccess`,成功后调用 `openLocalMicrophone` 采集并发布推流。
48
+ 4. 需要暂停/恢复推流时调用 `muteMicrophone` / `unmuteMicrophone`。
49
+
50
+ ```dart
51
+ class _YourAnchorPageState extends State<YourAnchorPage> {
52
+ // ... 其他代码 ...
53
+ final String _liveID = "test_voice_room_001";
54
+
55
+ @override
56
+ void initState() {
57
+ super.initState();
58
+ // ... 其他代码 ...
59
+
60
+ // 开始语聊
61
+ _startLive();
62
+ }
63
+
64
+ Future<void> _startLive() async {
65
+ // 1. 准备 LiveInfo 对象
66
+ final liveInfo = LiveInfo(
67
+ // 2. 设置房间 id
68
+ liveID: _liveID,
69
+ // 3. 设置房间名称
70
+ liveName: "test 语聊房",
71
+ // 4. 设置语聊房布局模板(传入 9 即代表有 9 个麦位)
72
+ seatTemplate: AudioSalon(9),
73
+ // 5. 设置上麦模式,例如申请上麦
74
+ seatMode: TakeSeatMode.apply,
75
+ // 6. 设置主播开播后自动上麦
76
+ keepOwnerOnSeat: true,
77
+ );
78
+
79
+ // 7. 调用 createLive 开始直播
80
+ final result = await _liveListStore.createLive(liveInfo);
81
+
82
+ if (result.isSuccess) {
83
+ debugPrint("Response startLive onSuccess");
84
+ // 8. 房主创建成功后默认自动上麦,此时调用 openLocalMicrophone 采集并发布音频
85
+ _liveSeatStore.openLocalMicrophone();
86
+ } else {
87
+ debugPrint("Response startLive onError: ${result.message}");
88
+ }
89
+ }
90
+ }
91
+ ```
92
+
93
+ ## 5. 结果判定
94
+
95
+ - `result.isSuccess == true`:房间创建成功,房主默认自动上麦。
96
+ - `openLocalMicrophone` 后:房间内用户能听到主播声音。
97
+ - `muteMicrophone` 后:本机音频暂停发布;`unmuteMicrophone` 后恢复。
98
+ - `keepOwnerOnSeat` 未设 `true`:主播未自动上麦,无法推流。
99
+ - `result.isSuccess == false`:开播失败,`result.message` 为错误描述。
100
+
101
+ ## 6. 常见误区
102
+
103
+ - 误区 1:跳过 `createLive` 直接调用 `openLocalMicrophone`(未创建房间无法推流)。
104
+ - 误区 2:`keepOwnerOnSeat` 未设 `true`,主播未上麦,推流不生效。
105
+ - 误区 3:`seatTemplate` 未设置或 n 超过套餐最大麦位数。
106
+ - 误区 4:混淆 `muteMicrophone`(暂停发布音频流)与关闭麦克风(停止采集)。
107
+ - 误区 5:`liveID` 重复使用(必须全局唯一,否则创建失败)。
108
+ - 误区 6:`AudioSalon(9)` 是构造器形式(非枚举),`seatMode` 用 `TakeSeatMode.apply`(Dart 枚举小写)。
109
+
110
+ ## 7. 问题定义(检索辅助,极简)
111
+
112
+ Flutter 语聊房房主需要按正确顺序创建房间并开播推流,了解 `createLive`、`openLocalMicrophone`、`muteMicrophone`、`unmuteMicrophone` 的调用时机与参数含义。
113
+
114
+ ## 8. 同义问法覆盖(检索召回,极简)
115
+
116
+ - Flutter 语聊房房主怎么开播?
117
+ - Flutter `createLive` 和 `openLocalMicrophone` 的调用顺序是什么?
118
+ - Flutter 主播怎么上麦推流?
119
+ - `keepOwnerOnSeat` 参数有什么作用?
120
+ - `seatTemplate` 怎么设置语聊房 `AudioSalon` 模板?
121
+ - Flutter `muteMicrophone` 和 `unmuteMicrophone` 区别是什么?
122
+ - 语聊房创建房间后如何推音频流?
123
+
124
+ ## 9. 参考来源(可选)
125
+
126
+ - LiveKit Flutter 文档:`https://cloud.tencent.com/document/product/647/127694`
@@ -0,0 +1,130 @@
1
+ ---
2
+ title: 语聊房房主创建房间并开播推流(iOS)
3
+ product: live
4
+ frameworks: [ios]
5
+ scope: platform_specific
6
+ tags: [语聊房, 房主, 开播, 推流, createLive, openLocalMicrophone, muteMicrophone, unmuteMicrophone, LiveListStore, AudioSalon, keepOwnerOnSeat, seatMode, iOS, Swift, AtomicXCore]
7
+ version_range: ">=2.0.0"
8
+ ---
9
+
10
+ # 语聊房房主创建房间并开播推流(iOS)
11
+
12
+ ## 1. 核心结论
13
+
14
+ - 语聊房开播流程:构造 `LiveInfo`(含 `liveID`、`seatTemplate`、`keepOwnerOnSeat`、`seatMode`),调用 `createLive` 创建房间;成功后调用 `openLocalMicrophone` 采集音频并发布推流,房间内用户即可听到主播声音。
15
+ - `liveID` 必填;`keepOwnerOnSeat` 设为 `true` 时主播进房后自动上麦(上麦是推流的前提,只有上麦的用户才能在房间内推音频流)。
16
+ - `seatTemplate` 设为语聊房模板 `SeatLayoutTemplate.AudioSalon(seatCount: n)`,n 为套餐支持的最大麦位数或小于该值的麦位数。
17
+ - `seatMode` 设置上麦模式(如 `.apply` 申请上麦)。
18
+ - `muteMicrophone` 暂停发布本机音频流;`unmuteMicrophone` 恢复发布本机音频流。
19
+
20
+ ## 2. 字段语义对照
21
+
22
+ | 字段/能力 | 作用 | 说明 |
23
+ |---|---|---|
24
+ | `LiveInfo` | 房间信息 | 包含 `liveID`、`liveName`、`seatTemplate`、`keepOwnerOnSeat`、`seatMode` 等参数 |
25
+ | `liveID` | 房间 ID | `createLive` 必填参数 |
26
+ | `liveName` | 房间名称 | 创建房间的展示名称 |
27
+ | `seatTemplate` | 麦位布局模板 | 语聊房使用 `SeatLayoutTemplate.AudioSalon(seatCount: n)`,n ≤ 套餐最大麦位数 |
28
+ | `keepOwnerOnSeat` | 房主自动上麦 | 设为 `true`,主播进房后自动上麦 |
29
+ | `seatMode` | 上麦模式 | 如 `.apply` 申请上麦 |
30
+ | `createLive(liveInfo)` | 创建房间(开播) | 传入 `LiveInfo`,返回 `Result` 异步处理 |
31
+ | `openLocalMicrophone` | 采集音频并发布 | 打开本地麦克风,发布音频流到房间 |
32
+ | `muteMicrophone` | 暂停发布音频 | 已打开麦克风时,暂停发布本地音频流 |
33
+ | `unmuteMicrophone` | 恢复发布音频 | 已打开麦克风时,恢复发布本地音频流 |
34
+
35
+ ## 3. 机制/时序
36
+
37
+ 构造 `LiveInfo`(`liveID` 必填,`seatTemplate=AudioSalon(n)`,`keepOwnerOnSeat=true`,`seatMode` 按需设置) -> 调用 `createLive` 创建房间 -> `case .success` 回调触发,房主默认自动上麦 -> 调用 `openLocalMicrophone` 采集并发布音频 -> 房间内用户听到主播声音。
38
+
39
+ 上麦是推流的前提:`keepOwnerOnSeat=true` 保证房主上麦后才能推音频流。`muteMicrophone` / `unmuteMicrophone` 用于推流过程中的暂停/恢复。
40
+
41
+ ## 4. 标准用法
42
+
43
+ 1. 构造 `LiveInfo`:设置 `liveID`、`seatTemplate`、`keepOwnerOnSeat`、`seatMode`。
44
+ 2. 调用 `createLive(liveInfo)`,在 `switch result` 中处理成功/失败。
45
+ 3. `case .success` 后调用 `openLocalMicrophone` 采集音频并发布推流。
46
+ 4. 需要暂停/恢复推流时调用 `muteMicrophone` / `unmuteMicrophone`。
47
+
48
+ ```swift
49
+ import UIKit
50
+ import AtomicXCore
51
+
52
+ class YourAnchorViewController: UIViewController {
53
+ // ... 其他代码 ...
54
+ private let liveID = "test_voice_room_001"
55
+
56
+ override func viewDidLoad() {
57
+ super.viewDidLoad()
58
+ // ... 其他代码 ...
59
+
60
+ // 开始语聊
61
+ startLive()
62
+ }
63
+
64
+ private func startLive() {
65
+ // 1. 准备 LiveInfo 对象
66
+ var liveInfo = LiveInfo()
67
+
68
+ // 2. 设置房间 id
69
+ liveInfo.liveID = liveID
70
+ // 3. 设置房间名称
71
+ liveInfo.liveName = "test 语聊房"
72
+ // 4. 设置语聊房布局模板(传入 9 即代表有 9 个麦位)
73
+ liveInfo.seatTemplate = SeatLayoutTemplate.AudioSalon(seatCount: 9)
74
+
75
+ // 5. 设置主播开播后自动上麦
76
+ liveInfo.keepOwnerOnSeat = true
77
+
78
+ // 6. 设置上麦模式,例如申请上麦
79
+ liveInfo.seatMode = .apply
80
+
81
+ // 7. 调用 createLive 开始直播
82
+ liveListStore.createLive(liveInfo) { [weak self] result in
83
+ guard let self = self else { return }
84
+ switch result {
85
+ case .success(let liveInfo):
86
+ print("Response startLive onSuccess")
87
+ // 8. 房主创建成功后默认自动上麦,此时调用 openLocalMicrophone 采集并发布音频
88
+ liveSeatStore.openLocalMicrophone(completion: nil)
89
+ case .failure(let errorInfo):
90
+ print("Response startLive onError: \(errorInfo.message)")
91
+ }
92
+ }
93
+ }
94
+ }
95
+ ```
96
+
97
+ ## 5. 结果判定
98
+
99
+ - `case .success` 回调触发:房间创建成功,房主默认自动上麦。
100
+ - `openLocalMicrophone` 后:房间内用户能听到主播声音。
101
+ - `muteMicrophone` 后:本机音频暂停发布;`unmuteMicrophone` 后恢复。
102
+ - `keepOwnerOnSeat` 未设 `true`:主播未自动上麦,无法推流。
103
+ - `case .failure(let errorInfo)` 回调触发:开播失败,`errorInfo.message` 为错误描述。
104
+
105
+ ## 6. 常见误区
106
+
107
+ - 误区 1:跳过 `createLive` 直接调用 `openLocalMicrophone`(未创建房间无法推流)。
108
+ - 误区 2:`keepOwnerOnSeat` 未设 `true`,主播未上麦,推流不生效。
109
+ - 误区 3:`seatTemplate` 未设置或 `seatCount` 超过套餐最大麦位数。
110
+ - 误区 4:混淆 `muteMicrophone`(暂停发布音频流)与关闭麦克风(停止采集)。
111
+ - 误区 5:`liveID` 重复使用(必须全局唯一,否则创建失败)。
112
+ - 误区 6:忘记 `[weak self]`(避免循环引用导致内存泄漏),且 `switch result` 的 `success`/`failure` 两个分支都需处理。
113
+
114
+ ## 7. 问题定义(检索辅助,极简)
115
+
116
+ iOS 语聊房房主需要按正确顺序创建房间并开播推流,了解 `createLive`、`openLocalMicrophone`、`muteMicrophone`、`unmuteMicrophone` 的调用时机与参数含义。
117
+
118
+ ## 8. 同义问法覆盖(检索召回,极简)
119
+
120
+ - iOS 语聊房房主怎么开播?
121
+ - iOS `createLive` 和 `openLocalMicrophone` 的调用顺序是什么?
122
+ - iOS 主播怎么上麦推流?
123
+ - `keepOwnerOnSeat` 参数有什么作用?
124
+ - `seatTemplate` 怎么设置语聊房 `AudioSalon` 模板?
125
+ - iOS `muteMicrophone` 和 `unmuteMicrophone` 区别是什么?
126
+ - 语聊房创建房间后如何推音频流?
127
+
128
+ ## 9. 参考来源(可选)
129
+
130
+ - LiveKit iOS 文档:`https://cloud.tencent.com/document/product/647/124969`
@@ -77,7 +77,7 @@ Push Kit 支持多种场景化消息类型,其中部分场景化消息类型
77
77
  登录 [AppGallery Connect](https://developer.huawei.com/consumer/cn/service/josp/agc/index.html),选择**开发与服务**,单击**推送服务**,在**配置**页,单击申请自分类权益。按照提示申请并激活。详情介绍请参考 [推送场景化消息权益](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/push-apply-right)。
78
78
 
79
79
  ## 腾讯云 IM 控制台配置
80
- 1. 登录腾讯云 [即时通信 IM 控制台](https://console.qcloud.com/avc) ,在**推送服务 Push > 推送设置 > 厂商配置**单击**添加证书**。
80
+ 1. 登录腾讯云 [即时通信 IM 控制台](https://console.qcloud.com/avc) ,在**推送服务 Push > 推送设置 > 厂商配置** 中添加 HarmonyOS 证书。
81
81
 
82
82
  2. 选择上面步骤3 生成的证书凭证,上传至新添加的鸿蒙证书。
83
83
 
@@ -259,8 +259,8 @@ p8 证书是 APNs Auth Key,用于腾讯云服务端向 APNs 鉴权。创建 p8
259
259
  7. 记录控制台生成的证书 ID。
260
260
 
261
261
  > **注意:**
262
- > 上传证书时,请确认 Bundle ID 与主 App 的 Bundle Identifier 一致。发布到 App Store 的 App 需要使用生产环境证书配置。
263
- >
262
+ > - 上传证书时,请确认 Bundle ID 与主 App 的 Bundle Identifier 一致。发布到 App Store 的 App 需要使用生产环境证书配置。
263
+ > - 若对 IPA 做了重签(尤其企业证书重签),请确认重签用的企业证书 / Provisioning Profile 也在 Apple Developer 上开启了 Push Notifications,并确保重签后 IPA 内仍包含 aps-environment entitlement。
264
264
 
265
265
  ## 触达统计资源配置(可选)
266
266
 
@@ -164,3 +164,4 @@ p8 证书:p8 证书没有到期日期,因此您无需担心证书过期。
164
164
  【荣耀】
165
165
 
166
166
  【Google FCM】
167
+
@@ -158,3 +158,4 @@ p8 证书:p8 证书没有到期日期,因此您无需担心证书过期。
158
158
  【荣耀】
159
159
 
160
160
  【Google FCM】
161
+
@@ -158,3 +158,4 @@ p8 证书:p8 证书没有到期日期,因此您无需担心证书过期。
158
158
  【荣耀】
159
159
 
160
160
  【Google FCM】
161
+