@tencentcloud/sdk-mcp 1.6.8 → 1.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +25 -0
- package/README.md +54 -35
- package/knowledge/build-index.js +28 -4
- package/knowledge/chunker.js +82 -14
- package/knowledge/chunking-policy.js +100 -0
- package/knowledge/frontmatter-meta.js +167 -0
- package/knowledge/path-meta.js +28 -6
- package/knowledge/search/exact-lookup.js +26 -123
- package/knowledge/search/filter-pool.js +12 -29
- package/knowledge/search/framework-fallback.js +22 -0
- package/knowledge/search/intent-router.js +13 -0
- package/knowledge/search/query-normalizer.js +56 -3
- package/knowledge/search/search-core.js +391 -0
- package/knowledge/search/search-knowledge.js +290 -361
- package/knowledge/search/search-message.js +87 -0
- package/knowledge/search/search-pass.js +428 -0
- package/knowledge/search/search-types.js +1 -0
- package/knowledge/search/url-row-scorer.js +258 -0
- package/package.json +1 -1
- package/resource/index/manifest.json +1 -1
- package/resource/integration/callkit/preset/ios/integration.md +1 -0
- package/resource/integration/chat/preset/flutter/integration.md +1 -0
- package/resource/integration/livekit/preset/live/vue/live-player-desk-integration.md +11 -9
- package/resource/integration/livekit/preset/live/vue/live-pusher-integration.md +11 -11
- package/resource/knowledge/callkit/best-practice/callkit-miniprogram/uniapp-shrink.md +64 -0
- package/resource/knowledge/callkit/best-practice/common/call-autoplay-blocked.md +81 -0
- package/resource/knowledge/callkit/best-practice/common/call-message-in-chat.md +84 -0
- package/resource/knowledge/callkit/best-practice/common/call-vs-calls.md +114 -0
- package/resource/knowledge/callkit/best-practice/common/callengine-call-flow.md +128 -0
- package/resource/knowledge/callkit/best-practice/common/callengine-log-level.md +72 -0
- package/resource/knowledge/callkit/best-practice/common/callkit-get-engine-instance.md +87 -0
- package/resource/knowledge/callkit/best-practice/common/callkit-get-roomid.md +83 -0
- package/resource/knowledge/callkit/best-practice/common/callkit-limitations.md +37 -0
- package/resource/knowledge/callkit/best-practice/common/callkit-user-register-and-kicked.md +103 -0
- package/resource/knowledge/callkit/preset/react/api.md +1 -150
- package/resource/knowledge/callkit/preset/vue/api.md +1 -38
- package/resource/knowledge/chat/best-practice/common/avchatroom-message-loss-diagnosis.md +71 -0
- package/resource/knowledge/chat/best-practice/common/group-conversation-cleanup-on-system-notice.md +67 -0
- package/resource/knowledge/chat/best-practice/common/image-message-url-lifecycle.md +63 -0
- package/resource/knowledge/chat/best-practice/common/login-repeat-2025-diagnosis.md +65 -0
- package/resource/knowledge/chat/best-practice/common/message-read-report-and-receipt.md +72 -0
- package/resource/knowledge/chat/best-practice/common/message-receive-event.md +70 -0
- package/resource/knowledge/chat/best-practice/common/message-risk-error-and-render.md +69 -0
- package/resource/knowledge/chat/best-practice/common/message-unread-count.md +71 -0
- package/resource/knowledge/chat/best-practice/miniprogram/audio-message-send.md +118 -0
- package/resource/knowledge/chat/best-practice/miniprogram/login-timeout-2801-diagnosis.md +67 -0
- package/resource/knowledge/chat/best-practice/miniprogram/media-upload-fail-diagnosis.md +68 -0
- package/resource/knowledge/chat/best-practice/web/audio-message-send.md +123 -0
- package/resource/knowledge/chat/preset/android/features/conversation-list.md +1 -0
- package/resource/knowledge/chat/preset/android/features/language.md +1 -0
- package/resource/knowledge/chat/preset/android/features/message-input.md +1 -0
- package/resource/knowledge/chat/preset/android/features/message-list.md +1 -0
- package/resource/knowledge/chat/preset/flutter/features/conversation-list.md +1 -0
- package/resource/knowledge/chat/preset/flutter/features/message-input.md +1 -0
- package/resource/knowledge/chat/preset/flutter/features/message-list.md +1 -0
- package/resource/knowledge/chat/preset/ios/features/conversation-list.md +1 -0
- package/resource/knowledge/chat/preset/ios/features/message-input.md +1 -0
- package/resource/knowledge/chat/preset/ios/features/message-list.md +1 -0
- package/resource/knowledge/chat/preset/react/features/conversation-preview.md +1 -0
- package/resource/knowledge/chat/urls/sdk/web.md +1 -1
- package/resource/knowledge/livekit/best-practice/android/voice-room-anchor-start.md +124 -0
- package/resource/knowledge/livekit/best-practice/common/admin-take-seat.md +73 -0
- package/resource/knowledge/livekit/best-practice/common/audience-leave-live.md +81 -0
- package/resource/knowledge/livekit/best-practice/common/voice-room-no-audio-troubleshoot.md +100 -0
- package/resource/knowledge/livekit/best-practice/common/voice-room-seat-list-change.md +65 -0
- package/resource/knowledge/livekit/best-practice/flutter/voice-room-anchor-start.md +126 -0
- package/resource/knowledge/livekit/best-practice/ios/voice-room-anchor-start.md +130 -0
- package/resource/knowledge/push/config/react-native.md +1 -0
- package/resource/knowledge/push/config/unity.md +1 -0
- package/resource/knowledge/push/config/unreal-engine.md +1 -0
- package/resource/knowledge/push/integration/android.md +16 -16
- package/resource/knowledge/push/integration/flutter.md +3 -3
- package/resource/knowledge/push/integration/ios.md +3 -3
- package/resource/knowledge/push/integration/react-native.md +1 -1
- package/resource/knowledge/roomkit/best-practice/common/room-ghost-member.md +75 -0
- package/resource/knowledge/roomkit/best-practice/common/room-limit-and-multi.md +88 -0
- package/resource/knowledge/roomkit/best-practice/common/room-screen-share-preview.md +87 -0
- package/resource/knowledge/roomkit/best-practice/common/room-status-after-all-leave.md +73 -0
- package/resource/knowledge/roomkit/best-practice/vue/room-uikit-vs-atomicx.md +115 -0
- package/resource/knowledge/rtcengine/web/plugin/30-advanced-cross-room-link.md +2 -0
- package/resource/knowledge/rtcengine/web/plugin/39-advanced-video-decoder.md +2 -0
- package/server.js +8 -3
- package/tools/common/finalize_answer.js +9 -1
- package/tools/common/search_trtc_knowledge.js +1 -1
- package/tools/definitions/finalize_answer_def.js +2 -2
- package/tools/definitions/integration-boundary.js +2 -1
- package/tools/definitions/search_trtc_knowledge_def.js +1 -1
- package/utils/report-cls-client.js +1 -1
- package/utils/report-es-client.js +1 -1
- package/cursor-setting.png +0 -0
- package/mcp-server-prompt.png +0 -0
- package/resource/knowledge/callkit/best-practice/web/callengine-invitation.md +0 -80
- package/resource/knowledge/callkit/best-practice/web/callengine-log-control.md +0 -20
- package/resource/knowledge/callkit/best-practice/web/callkit-call-vs-calls.md +0 -116
- package/resource/knowledge/callkit/preset/react/uikit-api-reference.md +0 -469
- package/resource/knowledge/callkit/preset/vue/uikit-api-reference.md +0 -581
- package/resource/knowledge/callkit/preset/web/api.md +0 -79
- package/resource/knowledge/chat/best-practice/web/image-message-url-handling.md +0 -16
|
@@ -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`
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
## 前提条件
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
请确认已 开通 Push 服务 并按需完成 **Android 厂商配置**(小米 / 华为 / OPPO / vivo / 荣耀 / 魅族 / Google FCM),获取到了下列信息:
|
|
6
6
|
|
|
7
7
|
|**资源**|**获取位置**|**用途**|
|
|
8
8
|
|---------|---------|---------|
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
|
|
20
20
|
## AI 集成
|
|
21
21
|
|
|
22
|
-
通过 npx 安装 [@tencent-rtc/trtc-push-skill](https://www.npmjs.com/package/@tencent-rtc/trtc-push-skill/v/1.0.1#%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87) 到本地 AI IDE 中,辅助完成 TIMPush
|
|
22
|
+
通过 npx 安装 [@tencent-rtc/trtc-push-skill](https://www.npmjs.com/package/@tencent-rtc/trtc-push-skill/v/1.0.1#%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87) 到本地 AI IDE 中,辅助完成 TIMPush 离线推送集成。安装后,您可以直接向 AI 输入“集成 Android 离线推送”“帮我集成 Android TIMPush”等需求,AI 将根据项目类型引导您完成环境检测、厂商通道配置、凭据填写、代码接入和验证等步骤。
|
|
23
23
|
|
|
24
24
|
> **注意:**
|
|
25
25
|
> 使用 Push Skill AI 集成不是全自动流程,依然需要开发者在厂商配置控制台、腾讯云控制台等配置 Push 相关信息。具体的配置方法请参考下文相关章节。
|
|
@@ -27,11 +27,11 @@
|
|
|
27
27
|
|
|
28
28
|
## 集成 TIMPush
|
|
29
29
|
|
|
30
|
-
|
|
30
|
+
如果您想手动集成,请按下述操作步骤依次完成放置配置文件、配置 Gradle、补充 Manifest 与混淆。
|
|
31
31
|
|
|
32
32
|
### 下载并添加 TIMPush 配置文件
|
|
33
33
|
|
|
34
|
-
下载后,将该文件添加到应用模块的 `assets` 目录。推荐存储路径:`app/src/main/assets/timpush-configs.json`,其中 app
|
|
34
|
+
下载后,将该文件添加到应用模块的 `assets` 目录。推荐存储路径:`app/src/main/assets/timpush-configs.json`,其中 app 是您项目的应用模块,可替换成实际名称。如果工程中没有 `assets` 目录,请在 `src/main/` 下手动创建。
|
|
35
35
|
|
|
36
36
|
> **注意:**
|
|
37
37
|
> TIMPush 注册推送时会读取该文件中的厂商证书配置,不要放在 MainActivity 同级目录、工程根目录或 res 目录。如果文件缺失或放错目录,SDK 无法获得对应厂商通道配置,可能导致注册或收消息失败。
|
|
@@ -46,7 +46,7 @@
|
|
|
46
46
|
|荣耀|`mcs-services.json`|在荣耀开发者服务平台下载。修改项目、应用信息或开发服务设置后,需要重新下载。|
|
|
47
47
|
|Google FCM|`google-services.json`|在 Firebase 控制台下载。|
|
|
48
48
|
|
|
49
|
-
推荐放置路径如下(与应用模块的 `build.gradle` / `build.gradle.kts` 同级),其中 app
|
|
49
|
+
推荐放置路径如下(与应用模块的 `build.gradle` / `build.gradle.kts` 同级),其中 app 是您项目的应用模块,可替换成实际名称:
|
|
50
50
|
``` text
|
|
51
51
|
app/mcs-services.json # 荣耀
|
|
52
52
|
app/google-services.json # Google FCM
|
|
@@ -129,7 +129,7 @@ dependencyResolutionManagement {
|
|
|
129
129
|
|
|
130
130
|
【Gradle 7.0 版本】
|
|
131
131
|
|
|
132
|
-
Gradle 7.0 版本通常使用 Groovy DSL
|
|
132
|
+
Gradle 7.0 版本通常使用 Groovy DSL。如您的工程使用 Kotlin DSL,请将单引号改为双引号,`url "..."` 改为 `url = uri("...")`。
|
|
133
133
|
1. 在项目级 `build.gradle` 的 `buildscript > repositories` 中添加插件仓库。
|
|
134
134
|
|
|
135
135
|
``` groovy
|
|
@@ -165,7 +165,7 @@ dependencyResolutionManagement {
|
|
|
165
165
|
|
|
166
166
|
【Gradle 7.0 以下版本】
|
|
167
167
|
|
|
168
|
-
Gradle 7.0 以下版本通常使用 Groovy DSL
|
|
168
|
+
Gradle 7.0 以下版本通常使用 Groovy DSL。如您的工程使用 Kotlin DSL,请将单引号改为双引号,`url "..."` 改为 `url = uri("...")`。
|
|
169
169
|
|
|
170
170
|
在项目级 `build.gradle` 的 `buildscript > repositories` 和 `allprojects > repositories` 中添加仓库。
|
|
171
171
|
``` groovy
|
|
@@ -278,7 +278,7 @@ buildscript {
|
|
|
278
278
|
|
|
279
279
|
【Gradle 7.0 及以下】
|
|
280
280
|
|
|
281
|
-
|
|
281
|
+
如果您已在上一节「配置 Gradle 仓库」中按照 Gradle 7.0 或 Gradle 7.0 以下示例配置了 `buildscript > repositories` 和 `buildscript > dependencies`,可以跳过本节的项目级插件依赖配置。
|
|
282
282
|
|
|
283
283
|
如果尚未配置,请回到上一节,根据当前 Gradle 版本补充 `buildscript` 中的仓库和插件 classpath。
|
|
284
284
|
|
|
@@ -300,7 +300,7 @@ plugins {
|
|
|
300
300
|
}
|
|
301
301
|
```
|
|
302
302
|
|
|
303
|
-
|
|
303
|
+
如果您的应用级 `build.gradle` 使用 `apply plugin` 写法,也可以写成:
|
|
304
304
|
``` groovy
|
|
305
305
|
apply plugin: 'com.google.gms.google-services'
|
|
306
306
|
apply plugin: 'com.huawei.agconnect'
|
|
@@ -319,7 +319,7 @@ plugins {
|
|
|
319
319
|
}
|
|
320
320
|
```
|
|
321
321
|
|
|
322
|
-
|
|
322
|
+
如果您的应用级 `build.gradle.kts` 使用 `apply` 写法,也可以写成:
|
|
323
323
|
``` kotlin
|
|
324
324
|
apply(plugin = "com.google.gms.google-services")
|
|
325
325
|
apply(plugin = "com.huawei.agconnect")
|
|
@@ -509,7 +509,7 @@ public class App extends Application {
|
|
|
509
509
|
|
|
510
510
|
private void registerTIMPush() {
|
|
511
511
|
int sdkAppId = 0; // TODO: Replace with your SDKAppID.
|
|
512
|
-
String appKey = "
|
|
512
|
+
String appKey = "您的客户端密钥"; // TODO: Replace with your Push Key.
|
|
513
513
|
|
|
514
514
|
TIMPushManager.getInstance().registerPush(this, sdkAppId, appKey, new TIMPushCallback<Object>() {
|
|
515
515
|
@Override
|
|
@@ -542,7 +542,7 @@ class App : Application() {
|
|
|
542
542
|
|
|
543
543
|
private fun registerTIMPush() {
|
|
544
544
|
val sdkAppId = 0 // TODO: Replace with your SDKAppID.
|
|
545
|
-
val appKey = "
|
|
545
|
+
val appKey = "您的客户端密钥" // TODO: Replace with your Push Key.
|
|
546
546
|
|
|
547
547
|
TIMPushManager.getInstance().registerPush(this, sdkAppId, appKey, object : TIMPushCallback<Any?>() {
|
|
548
548
|
override fun onSuccess(data: Any?) {
|
|
@@ -659,7 +659,7 @@ fun loginIMAndRegisterPush(context: Context) {
|
|
|
659
659
|
|
|
660
660
|
> **警告:**
|
|
661
661
|
>
|
|
662
|
-
>
|
|
662
|
+
> 如果您的业务仅使用即时通信 IM 聊天能力,请勿在 IM 登录前先调用 `registerPush`。否则 SDK 可能会按独立推送场景注册 Push 类型账号,并产生对应的 Push DAU。Push DAU 超出套餐额度后,可能会产生额外费用。
|
|
663
663
|
>
|
|
664
664
|
|
|
665
665
|
**验证**:
|
|
@@ -792,7 +792,7 @@ V2TIMManager.getMessageManager().sendMessage(
|
|
|
792
792
|
|
|
793
793
|
通过 [V2TIMOfflinePushInfo](https://im.sdk.qcloud.com/doc/zh-cn/classcom_1_1tencent_1_1imsdk_1_1v2_1_1V2TIMOfflinePushInfo.html) 的 `ext` 属性携带跳转参数,再随消息一起发送。`setExt` 接收 `byte[]` 入参,业务自定义的 JSON 字符串需要先转成字节数组。
|
|
794
794
|
|
|
795
|
-
|
|
795
|
+
如果您接入了 TUIKit,TUIKit 内置的消息发送链路会自动用 `OfflinePushExtInfo` 组装 `ext`,无需手动设置。下方示例适用于自行调用 IM SDK 发送消息的场景。
|
|
796
796
|
|
|
797
797
|
【Java】
|
|
798
798
|
``` java
|
|
@@ -874,7 +874,7 @@ V2TIMManager.getMessageManager().sendMessage(
|
|
|
874
874
|
|
|
875
875
|
请在 `Application.onCreate()` 中调用 addPushListener 注册 `TIMPushListener`,并在 onNotificationClicked 中解析 `ext` 后跳转到业务页面。
|
|
876
876
|
|
|
877
|
-
以下示例只演示解析 `ext` 的核心逻辑,跳转部分用 `TODO`
|
|
877
|
+
以下示例只演示解析 `ext` 的核心逻辑,跳转部分用 `TODO` 占位,请按自身业务补充。如果您接入了 TUIKit 并使用 `OfflinePushExtInfo` 组装的 `ext`,可改为 `new Gson().fromJson(ext, OfflinePushExtInfo.class)` 解析后再跳转。
|
|
878
878
|
|
|
879
879
|
【Java】
|
|
880
880
|
``` java
|
|
@@ -1099,7 +1099,7 @@ pushInfo.setAndroidOPPOChannelID("your_oppo_private_channel_id");
|
|
|
1099
1099
|
- 华为/荣耀:测试包签名(debug 或 release)的 SHA-256 必须已在厂商控制台「项目设置 > 常规 > SHA 证书指纹」中添加,指纹不一致会报 `6003: certificate fingerprint error`。
|
|
1100
1100
|
|
|
1101
1101
|
#### 步骤6:确认消息分类和厂商限制
|
|
1102
|
-
-
|
|
1102
|
+
- 是否超出厂商单日推送限额(例如 vivo 运营消息每日限制、小米公信消息限额)。
|
|
1103
1103
|
|
|
1104
1104
|
- 是否在夜间发送(部分厂商运营消息夜间不下发)。
|
|
1105
1105
|
|