@tencentcloud/sdk-mcp 1.7.2 → 1.7.4

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 (135) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/README.md +25 -17
  3. package/knowledge/bm25.js +20 -11
  4. package/knowledge/path-meta.js +23 -1
  5. package/knowledge/search/generic-rerank.js +123 -0
  6. package/knowledge/search/search-pass.js +8 -1
  7. package/package.json +1 -1
  8. package/resource/_schema/query-normalization.yaml +6 -0
  9. package/resource/index/manifest.json +1 -1
  10. package/resource/integration/callkit/preset/android/integration.md +4 -0
  11. package/resource/integration/callkit/preset/flutter/integration.md +4 -0
  12. package/resource/integration/callkit/preset/ios/integration.md +14 -13
  13. package/resource/integration/callkit/preset/vue/integration.md +0 -3
  14. package/resource/integration/chat/preset/android/integration.md +35 -173
  15. package/resource/integration/chat/preset/flutter/integration.md +113 -220
  16. package/resource/integration/chat/preset/ios/integration.md +2 -269
  17. package/resource/integration/chat/preset/react/integration.md +27 -1
  18. package/resource/integration/chat/preset/uni-app/integration.md +5 -1
  19. package/resource/integration/chat/preset/vue/integration.md +21 -31
  20. package/resource/integration/livekit/preset/live/android/live-host-integration.md +4 -0
  21. package/resource/integration/livekit/preset/live/ios/live-host-integration.md +4 -0
  22. package/resource/integration/livekit/preset/live/vue/live-list-integration.md +3 -4
  23. package/resource/integration/livekit/preset/live/vue/live-player-desk-integration.md +0 -1
  24. package/resource/integration/livekit/preset/live/vue/live-player-h5-integration.md +0 -1
  25. package/resource/integration/livekit/preset/live/vue/live-pusher-integration.md +4 -9
  26. package/resource/integration/roomkit/preset/vue/integration.md +0 -213
  27. package/resource/knowledge/callkit/best-practice/android/video-chat-dating.md +490 -0
  28. package/resource/knowledge/callkit/best-practice/flutter/android-keep-call-alive-background.md +79 -0
  29. package/resource/knowledge/callkit/best-practice/flutter/background-incoming-call-no-notification.md +99 -0
  30. package/resource/knowledge/callkit/best-practice/flutter/ios-keep-call-alive-background.md +93 -0
  31. package/resource/knowledge/callkit/best-practice/flutter/ios-startup-crash-version-voip.md +68 -0
  32. package/resource/knowledge/callkit/core-sdk/flutter/offline-push.md +1 -1
  33. package/resource/knowledge/callkit/core-sdk/ios/answer-call.md +9 -7
  34. package/resource/knowledge/callkit/core-sdk/ios/make-call.md +10 -7
  35. package/resource/knowledge/callkit/core-sdk/ios/offline-push.md +1 -1
  36. package/resource/knowledge/callkit/core-sdk/miniprogram/call-engine.md +19 -19
  37. package/resource/knowledge/callkit/core-sdk/miniprogram/call-event.md +16 -16
  38. package/resource/knowledge/callkit/core-sdk/uni-app/answer-call.md +0 -84
  39. package/resource/knowledge/callkit/core-sdk/uni-app/make-call.md +0 -102
  40. package/resource/knowledge/callkit/core-sdk/web/call-event.md +2 -2
  41. package/resource/knowledge/callkit/faq/error-code.md +62 -36
  42. package/resource/knowledge/callkit/faq/uniapp-miniprogram.md +1 -1
  43. package/resource/knowledge/callkit/preset/android/api.md +10 -10
  44. package/resource/knowledge/callkit/preset/harmonyos/api.md +362 -0
  45. package/resource/knowledge/callkit/preset/harmonyos/integration.md +322 -0
  46. package/resource/knowledge/callkit/preset/ios/api.md +9 -9
  47. package/resource/knowledge/callkit/preset/miniprogram/api-uniapp.md +293 -0
  48. package/resource/knowledge/callkit/preset/miniprogram/api.md +19 -19
  49. package/resource/knowledge/callkit/preset/miniprogram/integration.md +292 -0
  50. package/resource/knowledge/callkit/preset/miniprogram/uniapp-integration.md +521 -0
  51. package/resource/knowledge/callkit/preset/uni-app/api.md +49 -0
  52. package/resource/knowledge/callkit/preset/uni-app/integration.md +353 -0
  53. package/resource/knowledge/chat/best-practice/common/web-sdk-log-level.md +76 -0
  54. package/resource/knowledge/chat/best-practice/miniprogram/desktop-wechat-miniprogram-error.md +79 -0
  55. package/resource/knowledge/chat/best-practice/miniprogram/login-timeout-2801-diagnosis.md +1 -1
  56. package/resource/knowledge/chat/preset/android-view/integration.md +84 -124
  57. package/resource/knowledge/chat/preset/ios/features/language.md +5 -5
  58. package/resource/knowledge/chat/preset/ios-uikit/integration.md +184 -923
  59. package/resource/knowledge/chat/preset/react/features/search.md +9 -214
  60. package/resource/knowledge/chat/preset/react/h5/integration.md +965 -0
  61. package/resource/knowledge/chat/preset/vue/features/chat-header.md +0 -36
  62. package/resource/knowledge/chat/preset/vue/features/contact-list.md +0 -34
  63. package/resource/knowledge/chat/preset/vue/features/conversation-list.md +0 -39
  64. package/resource/knowledge/chat/preset/vue/features/conversation-preview.md +0 -74
  65. package/resource/knowledge/chat/preset/vue/features/search.md +9 -790
  66. package/resource/knowledge/chat/preset/vue/h5/integration.md +724 -0
  67. package/resource/knowledge/livekit/core-sdk/features/uni-app/live-list.md +0 -167
  68. package/resource/knowledge/livekit/core-sdk/live/android/co-guest-interaction.md +1 -1
  69. package/resource/knowledge/livekit/core-sdk/live/android/host-interaction.md +1 -1
  70. package/resource/knowledge/livekit/core-sdk/live/flutter/co-guest-interaction.md +1 -1
  71. package/resource/knowledge/livekit/core-sdk/live/flutter/host-interaction.md +1 -1
  72. package/resource/knowledge/livekit/core-sdk/live/flutter/integration.md +1 -1
  73. package/resource/knowledge/livekit/core-sdk/live/ios/co-guest-interaction.md +1 -1
  74. package/resource/knowledge/livekit/core-sdk/live/ios/host-interaction.md +1 -1
  75. package/resource/knowledge/livekit/core-sdk/live/ios/integration.md +2 -2
  76. package/resource/knowledge/livekit/core-sdk/live/uni-app/co-guest-interaction.md +1 -66
  77. package/resource/knowledge/livekit/core-sdk/live/uni-app/host-interaction.md +1 -66
  78. package/resource/knowledge/livekit/core-sdk/live/uni-app/integration.md +1 -1
  79. package/resource/knowledge/livekit/core-sdk/voice/android/co-guest-interaction.md +1 -1
  80. package/resource/knowledge/livekit/core-sdk/voice/android/host-interaction.md +2 -2
  81. package/resource/knowledge/livekit/core-sdk/voice/flutter/co-guest-interaction.md +1 -1
  82. package/resource/knowledge/livekit/core-sdk/voice/ios/co-guest-interaction.md +1 -1
  83. package/resource/knowledge/livekit/core-sdk/voice/ios/host-interaction.md +2 -2
  84. package/resource/knowledge/livekit/core-sdk/voice/uni-app/integration.md +2 -2
  85. package/resource/knowledge/livekit/preset/live/vue/features/barrage.md +1 -24
  86. package/resource/knowledge/livekit/preset/live/vue/features/live-audience-list.md +0 -3
  87. package/resource/knowledge/livekit/preset/live/vue/features/live-view.md +0 -5
  88. package/resource/knowledge/push/api-reference/harmonyos.md +9 -9
  89. package/resource/knowledge/push/api-reference/unity.md +10 -10
  90. package/resource/knowledge/push/api-reference/unreal-engine.md +11 -11
  91. package/resource/knowledge/push/config/android/fcm.md +2 -6
  92. package/resource/knowledge/push/integration/android.md +824 -428
  93. package/resource/knowledge/push/integration/donut.md +57 -74
  94. package/resource/knowledge/push/integration/flutter.md +208 -63
  95. package/resource/knowledge/push/integration/harmonyos.md +6 -11
  96. package/resource/knowledge/push/integration/ios.md +44 -99
  97. package/resource/knowledge/push/integration/react-native.md +3 -2
  98. package/resource/knowledge/push/integration/uni-app.md +29 -107
  99. package/resource/knowledge/push/integration/unity.md +3 -2
  100. package/resource/knowledge/push/integration/unreal-engine.md +4 -3
  101. package/resource/knowledge/roomkit/best-practice/vue/screen-share-auto-stop-on-leave.md +62 -0
  102. package/resource/knowledge/roomkit/core-sdk/android/room-state.md +3 -3
  103. package/resource/knowledge/roomkit/core-sdk/android/schedule-room.md +4 -4
  104. package/resource/knowledge/roomkit/core-sdk/flutter/room-state.md +2 -2
  105. package/resource/knowledge/roomkit/core-sdk/flutter/schedule-room.md +4 -4
  106. package/resource/knowledge/roomkit/core-sdk/ios/room-state.md +3 -3
  107. package/resource/knowledge/roomkit/core-sdk/ios/schedule-room.md +4 -4
  108. package/resource/knowledge/roomkit/core-sdk/react/network-proxy.md +84 -0
  109. package/resource/knowledge/roomkit/core-sdk/vue/device-detection.md +0 -9
  110. package/resource/knowledge/roomkit/core-sdk/vue/free-beauty-panel.md +0 -9
  111. package/resource/knowledge/roomkit/core-sdk/vue/network-proxy.md +84 -0
  112. package/resource/knowledge/roomkit/core-sdk/vue/recording.md +245 -0
  113. package/resource/knowledge/roomkit/core-sdk/vue/room-chat.md +0 -3
  114. package/resource/knowledge/roomkit/core-sdk/vue/room-view.md +0 -16
  115. package/resource/knowledge/roomkit/core-sdk/vue/schedule-room.md +0 -3
  116. package/resource/knowledge/roomkit/core-sdk/vue/virtual-background.md +0 -3
  117. package/resource/knowledge/roomkit/core-sdk/vue/whiteboard-annotation.md +181 -0
  118. package/resource/knowledge/roomkit/faq/error-code.md +103 -0
  119. package/resource/knowledge/roomkit/preset/android/integration.md +1 -202
  120. package/resource/knowledge/roomkit/preset/flutter/integration.md +13 -13
  121. package/resource/knowledge/roomkit/preset/harmonyos/integration.md +465 -0
  122. package/resource/knowledge/roomkit/preset/ios/integration.md +0 -201
  123. package/resource/knowledge/roomkit/preset/react/features/network-proxy.md +80 -0
  124. package/resource/knowledge/roomkit/preset/react/integration.md +0 -202
  125. package/resource/knowledge/roomkit/preset/uniapp-app/integration.md +279 -0
  126. package/resource/knowledge/roomkit/preset/vue/features/ai-caption-translation.md +69 -0
  127. package/resource/knowledge/roomkit/preset/vue/features/ai-denoiser.md +67 -0
  128. package/resource/knowledge/roomkit/preset/vue/features/network-proxy.md +80 -0
  129. package/resource/knowledge/roomkit/preset/vue/features/recording.md +85 -0
  130. package/resource/knowledge/roomkit/preset/vue/features/whiteboard-annotation.md +86 -0
  131. package/resource/knowledge/rtcengine/web/plugin/42-advanced-realtime-transcriber.md +25 -6
  132. package/server.js +1 -1
  133. package/utils/preflight-route.js +18 -6
  134. package/utils/report-cls-client.js +1 -1
  135. package/utils/report-es-client.js +1 -1
@@ -0,0 +1,99 @@
1
+ ---
2
+ title: TUICallKit Flutter 后台/锁屏来电无系统通知、无接听挂断按钮、不拉起 App(Notification/VoIP/权限排查)
3
+ product: call
4
+ frameworks: [flutter, android, ios]
5
+ scope: platform_specific
6
+ tags: [TUICallKit, Flutter, Android, iOS, 后台来电, 锁屏来电, TIMPush, VoIP, CallKit, Notification, enableIncomingBanner, 悬浮窗权限]
7
+ version_range: ">=2.0.0"
8
+ ---
9
+
10
+ # TUICallKit Flutter 后台/锁屏来电无系统通知、无接听挂断按钮、不拉起 App(Notification/VoIP/权限排查)
11
+
12
+ ## 1. 核心结论
13
+
14
+ - Android:后台/锁屏来电要同时具备**系统通知 + 接听挂断按钮 + 自动拉起 App**,需要 TIMPush(FCM 等厂商推送)+ `enableIncomingBanner` 开关 + **悬浮窗权限**与**后台拉起界面权限**三者齐备;缺任意一项都会退化为"有铃声无通知/无按钮/不拉起"。
15
+ - iOS:**TIMPush 当前不支持 iOS 的 VoIP 推送**(官方文档明确说明,2026-08-12 更新)。Flutter iOS 端只能走 **APNs 普通推送**,无法使用系统级 CallKit 来电 UI,因此 App 被系统杀死或锁屏时,iOS **无法**做到像 Android 那样自动拉起接听/挂断按钮界面,只能收到普通通知,点击后唤醒 App。
16
+ - 根因排查方向:先确认平台(Android 用权限排查,iOS 用推送类型能力边界排查),二者原因和修复路径完全不同,不能用同一套方案套用。
17
+ - 若 App 处于**前台**收到来电但无按钮/不拉起:与推送无关,需检查是否遗漏 `enableIncomingBanner` 配置或悬浮窗权限(Android),或未正确监听 `onCallReceived` 事件展示通知(iOS/Android 通用)。
18
+
19
+ ## 2. 字段语义对照
20
+
21
+ | 字段/能力 | 作用 | 说明 |
22
+ |---|---|---|
23
+ | `TIMPush`(`tencent_cloud_chat_push` 插件) | 离线推送通用方案 | Android 支持 VoIP 类型推送(走 FCM 等厂商通道);iOS **当前只支持 APNs**,不支持 VoIP |
24
+ | `TUIOfflinePushInfo.iOSPushType` | 指定 iOS 推送类型 | 仅可设置为 `TUICallIOSOfflinePushType.APNs`,设置为 VoIP 相关值在当前官方能力下不生效 |
25
+ | `enableIncomingBanner` | 控制被叫端来电展示模式 | `false`(默认):直接尝试拉起全屏通话界面;`true`:先展示横幅通知,需**悬浮窗权限**配合才能展示 |
26
+ | 悬浮窗权限(显示在其他应用上层) | Android 系统权限 | 用于展示自定义来电横幅及通话悬浮窗,缺失则横幅/接听按钮无法展示 |
27
+ | 后台拉起界面权限 | Android 系统权限(部分厂商如 vivo 严格要求) | 用于 App 在后台时拉起通话界面,缺失则无法自动拉起 App |
28
+ | iOS CallKit / PushKit | iOS 原生系统级来电能力 | Flutter TUICallKit **未提供**该方案的官方接入文档,仅原生 iOS SDK 有相关文档 |
29
+
30
+ ## 3. 机制/时序
31
+
32
+ 用户症状:有铃声但没有系统通知、顶部没有接听挂断按钮、不拉起 App -> 先判断平台:
33
+
34
+ **Android 排查路径**:确认是否已集成 TIMPush 并注册推送 -> 确认 IM 控制台已正确上传 FCM 证书且消息类型为"透传(数据)消息" -> 确认是否调用了 `enableIncomingBanner(true)` -> 确认设备已授予**悬浮窗权限**与**后台拉起界面权限**(不同厂商权限名不同,如 vivo/红米需单独手动开启)-> 若仍拉不起界面,检查主 Activity 启动栈判断代码(`isTaskRoot()` 逻辑)是否缺失,且确认该 Activity 启动模式**不是** `singleTask`。
35
+
36
+ **iOS 排查路径**:确认预期是否合理——**iOS 当前官方不支持 VoIP 推送**,无法实现系统级来电 UI(接听/挂断按钮、锁屏/App 被杀死后自动拉起)-> 若只是 APNs 普通推送场景,检查证书是否正确上传、`iOSPushType` 是否设置为 `APNs`、是否正确调用 `TencentCloudChatPush().registerPush` -> 若业务强需要系统级来电体验,需评估自行通过原生桥接接入 CallKit + PushKit(超出官方标准方案范围,需自行实现并承担维护成本)。
37
+
38
+ ## 4. 标准用法
39
+
40
+ 1. 两端通用:安装并注册 `tencent_cloud_chat_push` 插件,登录成功后立即调用 `TencentCloudChatPush().registerPush(...)`。
41
+
42
+ 2. **Android**:
43
+ - 集成 FCM(或所需厂商)推送通道,IM 控制台消息类型选择"透传(数据)消息"。
44
+ - 调用 `TUICallKit.instance.enableIncomingBanner(true)` 开启来电横幅(如需横幅+按钮展示)。
45
+ - 请求悬浮窗权限与后台拉起权限:
46
+
47
+ ``` kotlin
48
+ PermissionRequester.newInstance(
49
+ PermissionRequester.FLOAT_PERMISSION,
50
+ PermissionRequester.BG_START_PERMISSION
51
+ ).request()
52
+ ```
53
+
54
+ - 在应用默认启动的主 Activity(如 SplashActivity,且**启动模式不能是 `singleTask`**)中添加:
55
+
56
+ ``` java
57
+ if (!isTaskRoot() && getIntent() != null
58
+ && getIntent().hasCategory(Intent.CATEGORY_LAUNCHER)
59
+ && Intent.ACTION_MAIN.equals(getIntent().getAction())) {
60
+ finish();
61
+ return;
62
+ }
63
+ ```
64
+
65
+ 3. **iOS**:
66
+ - 仅接入 APNs 普通推送:申请并上传 APNs 证书,设置 `offlinePushInfo.iOSPushType = TUICallIOSOfflinePushType.APNs`。
67
+ - 明确告知业务方:iOS 端**无法**通过官方标准方案实现"App 被杀死/锁屏后自动拉起系统级接听挂断按钮"的效果,只能收到通知,用户点击通知后唤醒 App 进入来电流程。
68
+ - 若必须要该体验,需自行原生开发 PushKit + CallKit 桥接方案(不在 TUICallKit 官方支持范围内)。
69
+
70
+ 4. 两端在**前台**收到来电时,均可通过监听 `onCallReceived` 事件,结合 `flutter_local_notifications` 等插件自定义展示通知样式(不依赖离线推送链路)。
71
+
72
+ ## 5. 结果判定
73
+
74
+ - Android:App 处于后台/锁屏,收到来电后能展示横幅或全屏界面,可见接听/挂断按钮,点击后能正确拉起/唤醒 App。
75
+ - iOS:App 处于后台,收到 APNs 通知,点击通知后 App 被唤醒并进入通话流程;**不应**期望在 App 被杀死或锁屏时出现系统级接听/挂断来电界面(当前官方能力不支持)。
76
+ - 两端在前台收到来电,均能正常展示通话邀请 UI 或自定义通知。
77
+
78
+ ## 6. 常见误区
79
+
80
+ - 误区 1:把 Android 和 iOS 的后台来电问题当作同一个问题排查——二者根因完全不同(Android 是权限配置问题,iOS 是官方能力边界问题),用同一套方案(如只排查权限)无法解决 iOS 问题。
81
+ - 误区 2:认为给 iOS 设置 `iOSPushType = VoIP` 就能获得系统级来电 UI——TIMPush 当前**不支持** iOS VoIP,设置该值不会生效,只有 `APNs` 是当前受支持的合法值。
82
+ - 误区 3:Android 只开启了推送证书配置,未开启悬浮窗权限和后台拉起权限,误以为是推送没收到,实际是收到了推送但系统权限不足导致界面拉不起来(应先看日志确认是否收到 `onCallReceived`,再排查权限)。
83
+
84
+ ## 7. 问题定义(检索辅助,极简)
85
+
86
+ Flutter TUICallKit 应用在后台/锁屏收到来电时只有铃声、没有系统通知、没有接听挂断按钮、也不拉起 App,Android 和 iOS 分别需要哪些配置(Notification、CallKit、VoIP Push、TIMPush)。
87
+
88
+ ## 8. 同义问法覆盖(检索召回,极简)
89
+
90
+ - Flutter TUICallKit 后台来电没有通知怎么办?
91
+ - TUICallKit Flutter iOS 支持 VoIP 来电吗?
92
+ - Flutter 来电横幅不显示接听挂断按钮?
93
+ - Android 后台收到来电拉不起 App?
94
+
95
+ ## 9. 参考来源(可选)
96
+
97
+ - Flutter 离线推送 Notification 配置:`https://cloud.tencent.com/document/product/647/106014`
98
+ - Flutter VoIP 配置(iOS 当前不支持的官方说明):`https://cloud.tencent.com/document/product/647/106015`
99
+ - Android 被叫端来电显示策略与权限排查:`https://cloud.tencent.com/document/product/647/78767`
@@ -0,0 +1,93 @@
1
+ ---
2
+ title: TUICallKit Flutter iOS 应用切后台/锁屏时通话音频中断(Background Modes + AVAudioSession 配置)
3
+ product: call
4
+ frameworks: [flutter, ios]
5
+ scope: platform_specific
6
+ tags: [TUICallKit, Flutter, iOS, VoIP, AVAudioSession, Background Modes, UIBackgroundModes, playAndRecord, 后台保活, CallKit, MethodChannel]
7
+ version_range: ">=2.0.0"
8
+ ---
9
+
10
+ # TUICallKit Flutter iOS 应用切后台/锁屏时通话音频中断(Background Modes + AVAudioSession 配置)
11
+
12
+ ## 1. 核心结论
13
+
14
+ - 需要:iOS 系统会限制后台应用访问麦克风/扬声器,通话切后台或锁屏后若未正确配置,音频采集/播放会被系统中断。
15
+ - 根因:Background Modes 未声明或 `AVAudioSession` 未手动配置为 `.playAndRecord` 类别;TUICallKit **不会自动配置** `AVAudioSession`,需要开发者在原生层自行设置。
16
+ - 修复方向:Xcode 勾选 Background Modes 三项(与 iOS 系统版本**无关**,所有版本均需配置)+ 在通话开始前通过 Flutter `MethodChannel` 触发原生层设置 `AVAudioSession`。
17
+ - 无需集成 CallKit:本方案不依赖 iOS `CallKit` 框架,仅通过 Background Modes + `AVAudioSession` 即可实现纯语音/视频通话的后台音频保活。
18
+ - 澄清(避免误用):Apple 的 `com.apple.developer.avfoundation.multitasking-camera-access` entitlement 是**画中画(PiP)场景下摄像头后台采集**的专属方案,与本问题(纯音频通话后台保活)无关,不要混用。
19
+
20
+ ## 2. 字段语义对照
21
+
22
+ | 字段/能力 | 作用 | 说明 |
23
+ |---|---|---|
24
+ | `Audio, AirPlay, and Picture in Picture` | Background Modes 能力项 | 保持后台音频采集/播放能力,所有 iOS 版本均需勾选 |
25
+ | `Voice over IP` | Background Modes 能力项 | 支持 VoIP 场景后台运行,**所有版本**均需勾选,非 iOS 18+ 专属 |
26
+ | `Remote notifications`(可选) | Background Modes 能力项 | 用于接收离线推送,非音频保活必需 |
27
+ | `AVAudioSession.Category.playAndRecord` | 音频会话类别 | 支持同时播放和录音,需在通话前**手动**设置,SDK 不会自动配置 |
28
+ | `.allowBluetooth` / `.allowBluetoothA2DP` | 音频会话选项 | 支持蓝牙耳机接入及高质量蓝牙音频(A2DP) |
29
+ | `MethodChannel` | Flutter 与原生通信桥 | `AVAudioSession` 配置必须在原生 Swift/ObjC 层完成,Flutter 侧通过其触发 |
30
+
31
+ ## 3. 机制/时序
32
+
33
+ 应用切后台/锁屏 -> iOS 系统限制后台麦克风/扬声器访问 -> 若未配置则通话音频被中断(对端听不到本端声音) -> 排查:确认 Background Modes 是否勾选 `Audio, AirPlay, and Picture in Picture` + `Voice over IP` -> 定位:确认是否在通话开始前配置了 `AVAudioSession.setCategory(.playAndRecord)` 并 `setActive(true)` -> 修复:Xcode 声明 Background Modes + 原生层配置 `AVAudioSession` + Flutter 侧 `MethodChannel` 触发 -> 复验:切后台/锁屏后通话音频持续正常,`Info.plist` 中 `UIBackgroundModes` 含 `audio`/`voip`。
34
+
35
+ ## 4. 标准用法
36
+
37
+ 1. 在 Xcode 中打开项目,选择 `Target` > `Signing & Capabilities` > `+ Capability`,搜索并添加 `Background Modes`,勾选 `Audio, AirPlay, and Picture in Picture` 与 `Voice over IP`(`Remote notifications` 可选,用于离线推送)。配置完成后 `Info.plist` 会自动写入:
38
+
39
+ ``` xml
40
+ <key>UIBackgroundModes</key>
41
+ <array>
42
+ <string>audio</string>
43
+ <string>voip</string>
44
+ </array>
45
+ ```
46
+
47
+ 2. 在 iOS 原生层(Swift)实现音频会话配置方法,在通话开始前(通话界面 `viewDidLoad`、发起通话 `calls` 之前、或接听 `accept` 之前)调用:
48
+
49
+ ``` swift
50
+ import AVFoundation
51
+
52
+ func setupAudioSessionForCall() {
53
+ let audioSession = AVAudioSession.sharedInstance()
54
+ do {
55
+ // .playAndRecord:同时支持播放和录音
56
+ // .allowBluetooth / .allowBluetoothA2DP:支持蓝牙耳机及高质量蓝牙音频
57
+ try audioSession.setCategory(.playAndRecord, options: [.allowBluetooth, .allowBluetoothA2DP])
58
+ try audioSession.setActive(true)
59
+ } catch {
60
+ // 音频会话配置失败
61
+ }
62
+ }
63
+ ```
64
+
65
+ 3. 在 Flutter 侧注册 `MethodChannel`,在通话开始(`calls`/`accept` 成功)时调用原生 `setupAudioSessionForCall()`,通话结束时可将 `AVAudioSession` 恢复或停用,避免影响其他音频场景。
66
+
67
+ 4. 不需要集成 iOS `CallKit` 框架即可实现上述后台音频保活;若后续需要接入系统来电 UI/锁屏接听等能力,才需要额外集成 `CallKit`(属于另一独立能力,不是后台保活的前提)。
68
+
69
+ ## 5. 结果判定
70
+
71
+ - 应用切到后台或锁屏后,通话音频采集/播放不中断,对端持续能听到本端声音。
72
+ - `Info.plist` 中 `UIBackgroundModes` 正确包含 `audio` 与 `voip`。
73
+ - 未集成 `CallKit` 的情况下,纯语音/视频通话后台保活功能正常。
74
+
75
+ ## 6. 常见误区
76
+
77
+ - 误区 1:认为 TUICallKit Flutter/iOS SDK 内置了 `AVAudioSession` 配置,无需自己设置(实际 SDK 不会自动配置,必须开发者在原生层主动调用 `setCategory`/`setActive`)。
78
+ - 误区 2:把"通话音频后台保活"和"画中画(PiP)摄像头后台采集"混为一谈,为纯语音/视频通话去申请 `com.apple.developer.avfoundation.multitasking-camera-access` entitlement——该 entitlement 仅用于 PiP 场景下的**摄像头视频**后台采集,与音频通话保活无关,普通通话不需要申请。
79
+ - 误区 3:误以为 `Voice over IP` 只是 iOS 18+ 才需要勾选,实际上 Background Modes 三项与 iOS 系统版本无关,所有版本(iOS 15+)均需配置一致。
80
+
81
+ ## 7. 问题定义(检索辅助,极简)
82
+
83
+ Flutter TUICallKit 在 iOS 应用切后台/锁屏时通话音频中断,是否需要配置 Background Modes 与 AVAudioSession,是否需要集成 CallKit,与画中画方案的区别。
84
+
85
+ ## 8. 同义问法覆盖(检索召回,极简)
86
+
87
+ - TUICallKit Flutter iOS 切后台没声音怎么办?
88
+ - Flutter iOS 通话锁屏后音频停止?
89
+ - 不用 CallKit 能后台保活语音通话吗?
90
+ - AVAudioSession playAndRecord 怎么配置才能后台采集?
91
+
92
+ ## 9. 参考来源(可选)
93
+ - 腾讯云 TRTC iOS 画中画文档(`multitasking-camera-access` entitlement 的真实适用场景):`https://cloud.tencent.com/document/product/647/128652`
@@ -0,0 +1,68 @@
1
+ ---
2
+ title: TUICallKit Flutter iOS 启动闪退排查(最低系统版本、Release 符号裁剪、VoIP PushKit 适用性澄清)
3
+ product: call
4
+ frameworks: [flutter, ios]
5
+ scope: platform_specific
6
+ tags: [TUICallKit, Flutter, iOS, 闪退, crash, tencent_calls_uikit, PushKit, CallKit, VoIP, symbol not found, 最低系统版本]
7
+ version_range: ">=2.0.0"
8
+ ---
9
+
10
+ # TUICallKit Flutter iOS 启动闪退排查(最低系统版本、Release 符号裁剪、VoIP PushKit 适用性澄清)
11
+
12
+ ## 1. 核心结论
13
+
14
+ - 最低系统版本:Flutter 插件 `tencent_calls_uikit` 官方要求 iOS **12.0** 及以上;iOS 16 在该范围内,天然兼容,无需额外适配。
15
+ - Flutter TUICallKit **标准离线推送方案不集成 PushKit VoIP**,仅提供 APNs 普通推送(数据消息)方案;因此"收到 VoIP 推送未上报 CallKit 导致系统 Kill App"这条 iOS 13+ 规则**不适用于**未额外自定义扩展的标准集成。
16
+ - 真实的 Flutter TUICallKit iOS 启动闪退最常见原因:**Release 构建时 Xcode 符号裁剪优化误移除 TRTC 的 C 符号**,导致 `symbol not found`,与 VoIP/PushKit/CallKit 无关。
17
+ - 若开发者**自行额外**接入了 PushKit VoIP(超出 TUICallKit 官方标准方案范围),才需要遵守"收到 VoIP 推送后必须立即调用 `reportNewIncomingCall`/`reportNewIncomingConversation`,否则会被系统 Kill"的 Apple 强制规则,这属于自定义扩展的责任范围,不是 TUICallKit 内置行为。
18
+
19
+ ## 2. 字段语义对照
20
+
21
+ | 字段/能力 | 作用 | 说明 |
22
+ |---|---|---|
23
+ | `tencent_calls_uikit` | Flutter TUICallKit 插件包名 | 官方要求 iOS 12.0+,与底层 `TXLiteAVSDK_Professional`(另一独立库,podspec 声明 iOS 8.0)是不同层级的版本要求,不可混用命名 |
24
+ | APNs(远程推送) | Flutter TUICallKit 官方离线推送方案 | 通过 `tencent_cloud_chat_push` 插件实现,iOS 侧仅涉及 APNs 证书配置,不涉及 PushKit |
25
+ | PushKit VoIP | iOS 原生系统级来电推送机制 | Flutter TUICallKit **官方文档未提供**该方案;仅原生 iOS(Swift/ObjC)集成文档中存在(基于 `LiveCommunicationKit`/`CallKit`) |
26
+ | `reportNewIncomingCall`/`reportNewIncomingConversation` | 收到 VoIP 推送后的强制上报接口 | 仅在**已注册 PushKit VoIP** 的场景下才需要调用,5 秒内未上报会被系统 Kill;不适用于未集成 PushKit 的标准 Flutter 方案 |
27
+ | Deployment Postprocessing / Strip Style | Xcode Build Settings 选项 | 用于避免 Release 构建时符号裁剪误删 TRTC FFI 相关 C 符号,是 Flutter TUICallKit 已知的真实闪退成因 |
28
+
29
+ ## 3. 机制/时序
30
+
31
+ App 启动或收到通话相关事件 -> 闪退/无法拉起 -> 排查方向一:检查是否为 **Release 构建**且未配置符号裁剪选项 -> 若是,误删 TRTC C 符号导致 `symbol not found` -> 修复:配置 `Deployment Postprocessing = Yes` + `Strip Style = Non-Global Symbols` -> 复验:Release 包正常运行不再闪退。
32
+
33
+ 排查方向二(仅当项目**额外自行集成**了 PushKit VoIP 时才适用):收到 VoIP 推送 -> 未在 5 秒内调用 `reportNewIncomingCall`/`reportNewIncomingConversation` -> 系统强制 Kill App -> 修复:在 `PKPushRegistryDelegate` 的 `didReceiveIncomingPushWith` 回调中立即上报。
34
+
35
+ ## 4. 标准用法
36
+
37
+ 1. 确认项目 `tencent_calls_uikit` 依赖版本与目标设备系统版本:iOS 12.0 及以上均受官方支持,iOS 16 无需特殊适配。
38
+ 2. 若在 iOS Release 包运行时出现 `symbol not found` 闪退,在 Xcode 的 `Build Settings` 中:
39
+ - 将 **Deployment Postprocessing** 设置为 **Yes**;
40
+ - 将 **Strip Style**(Release 配置)设置为 **Non-Global Symbols**。
41
+ 3. 若业务只需要标准的离线来电通知能力,直接按 Flutter 官方 `tencent_cloud_chat_push` 插件文档接入 **APNs** 方案即可,**不需要**也不应额外接入 PushKit VoIP(官方 Flutter 方案未提供此能力)。
42
+ 4. 若业务确有强需求要在 Flutter iOS 上实现系统级 VoIP 来电体验(如锁屏/进程杀死后仍能唤起系统来电 UI),需要开发者自行通过原生桥接(`MethodChannel` + 原生 Swift 层参考 iOS 原生 CallKit/PushKit 集成方案)自定义实现,并严格遵守"5 秒内上报"规则,避免闪退;这是自定义扩展方案,不是 TUICallKit Flutter 官方内置能力。
43
+
44
+ ## 5. 结果判定
45
+
46
+ - iOS 16(及 12.0 以上其他版本)设备上,TUICallKit Flutter 正常启动、登录、拨打/接听通话,无系统兼容性问题。
47
+ - Release 包运行时不出现 `symbol not found` 崩溃。
48
+ - 未额外集成 PushKit 的标准项目,不会因为"VoIP 推送未上报"这条规则被系统 Kill(因为标准方案未注册 PushKit VoIP,不会触发该规则)。
49
+
50
+ ## 6. 常见误区
51
+
52
+ - 误区 1:把底层库 `TXLiteAVSDK_Professional` 的版本要求与 Flutter 插件 `tencent_calls_uikit` 的版本要求混为一谈,二者是不同的依赖层级,应分别核对。
53
+ - 误区 2:认为 Flutter TUICallKit iOS 启动闪退的最常见原因是"PushKit VoIP 未上报 CallKit",但官方 Flutter 标准方案并未集成 PushKit VoIP,该规则对标准集成不适用;真实最常见原因是 Release 符号裁剪导致的 `symbol not found`。
54
+ - 误区 3:误以为可以在 Flutter 侧直接调用原生 iOS 的 `CXProvider.reportNewIncomingCall` 或 `LiveCommunicationKit` API——这些是原生 Swift/ObjC API,Flutter 侧无法直接调用,必须通过原生桥接层自行实现(且 TUICallKit 官方未提供该桥接)。
55
+
56
+ ## 7. 问题定义(检索辅助,极简)
57
+
58
+ Flutter TUICallKit iOS 启动闪退排查:最低系统版本要求、iOS 16 兼容性、以及 PushKit VoIP CallKit 上报规则是否适用于 Flutter 标准集成。
59
+
60
+ ## 8. 同义问法覆盖(检索召回,极简)
61
+
62
+ - Flutter TUICallKit iOS 打不开/闪退怎么排查?
63
+ - tencent_calls_uikit 支持 iOS 16 吗?
64
+ - TUICallKit Flutter 需要接 PushKit VoIP 吗?
65
+ - Flutter iOS Release 包 symbol not found 怎么解决?
66
+
67
+ ## 9. 参考来源(可选)
68
+ - `tencent_calls_uikit` 官方最低版本要求(iOS 12.0+):`https://pub.dev/packages/tencent_calls_uikit`
@@ -152,7 +152,7 @@ public class MyApplication extends TencentCloudChatPushApplication {
152
152
 
153
153
  5. 输入用户电子邮件地址(您的邮箱)、常用名称(您的名称或公司名),选择**存储到磁盘**,单击**继续**,系统将生成一个 `*.certSigningRequest` 文件。
154
154
 
155
- 6. 返回上述 步骤3 中 Apple Developer 网站刚才的页面,单击 **Choose File** 上传生成的 `*.certSigningRequest` 文件。
155
+ 6. 返回上述 [步骤3](#step3) 中 Apple Developer 网站刚才的页面,单击 **Choose File** 上传生成的 `*.certSigningRequest` 文件。
156
156
 
157
157
  7. 单击 **Continue**,即可生成推送证书。
158
158
 
@@ -125,18 +125,20 @@ class ViewController: UIViewController {
125
125
  import AtomicXCore
126
126
 
127
127
  class CallViewController: UIViewController {
128
- // 1.创建通话页面
128
+ private var callCoreView: CallCoreView?
129
+
129
130
  override func viewDidLoad() {
130
131
  super.viewDidLoad()
131
132
  view.backgroundColor = .black
132
- //2.通话页面绑定 CallCoreView
133
- callCoreView = CallCoreView(frame: view.bounds)
134
- callCoreView?.autoresizingMask = [.flexibleWidth, .flexibleHeight]
135
- if let callCoreView = callCoreView {
136
- view.addSubview(callCoreView)
137
- }
133
+
134
+ let coreView = CallCoreView(frame: view.bounds)
135
+ coreView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
136
+ coreView.setLayoutTemplate(.float)
137
+ view.addSubview(coreView)
138
+ callCoreView = coreView
138
139
  }
139
140
  }
141
+
140
142
  ```
141
143
 
142
144
  **CallCoreView 视图组件功能说明:**
@@ -123,22 +123,25 @@ class ViewController: UIViewController {
123
123
 
124
124
  【iOS】
125
125
  ``` swift
126
+
126
127
  import UIKit
127
128
  import AtomicXCore
128
129
 
129
130
  class CallViewController: UIViewController {
130
- // 1.创建通话页面
131
+ private var callCoreView: CallCoreView?
132
+
131
133
  override func viewDidLoad() {
132
134
  super.viewDidLoad()
133
135
  view.backgroundColor = .black
134
- //2.通话页面绑定 CallCoreView
135
- callCoreView = CallCoreView(frame: view.bounds)
136
- callCoreView?.autoresizingMask = [.flexibleWidth, .flexibleHeight]
137
- if let callCoreView = callCoreView {
138
- view.addSubview(callCoreView)
139
- }
136
+
137
+ let coreView = CallCoreView(frame: view.bounds)
138
+ coreView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
139
+ coreView.setLayoutTemplate(.float)
140
+ view.addSubview(coreView)
141
+ callCoreView = coreView
140
142
  }
141
143
  }
144
+
142
145
  ```
143
146
 
144
147
  **CallCoreView 视图组件功能说明:**
@@ -1,4 +1,4 @@
1
- 本文档将指导您如何基于 [TIMPush](https://cloud.tencent.com/document/product/269/133003) 服务实现 VoIP 推送功能,适用于使用 AtomicXCore 进行无 UI 集成的场景。
1
+ 本文档将指导您如何基于 TIMPush 服务实现 VoIP 推送功能,适用于使用 AtomicXCore 进行无 UI 集成的场景。
2
2
 
3
3
  > **注意:**
4
4
  > - 使用 **VoIP** 推送功能首先需要 开通 TIMPush 服务。
@@ -12,40 +12,40 @@ TUICallEngine API 是音视频通话组件的**无 UI 接口**,如果 TUICallK
12
12
 
13
13
  |API|描述|
14
14
  |---------|---------|
15
- |createInstance|创建 TUICallEngine 实例(静态方法)|
16
- |destroyInstance|销毁 TUICallEngine 实例(静态方法)|
17
- |on|增加事件监听|
18
- |off|取消事件监听|
15
+ |[createInstance](#createInstance)|创建 TUICallEngine 实例(静态方法)|
16
+ |[destroyInstance](#destroyInstance)|销毁 TUICallEngine 实例(静态方法)|
17
+ |[on](#on)|增加事件监听|
18
+ |[off](#off)|取消事件监听|
19
19
 
20
20
  ### 通话操作相关接口函数
21
21
 
22
22
  |API|描述|
23
23
  |---------|---------|
24
- |calls|发起 1v1 通话|
25
- |inviteUser|在群组通话中,邀请其他人加入|
26
- |join|主动加入当前的群组通话中|
27
- |accept|接听通话|
28
- |reject|拒绝通话|
29
- |hangup|结束通话|
24
+ |[calls](#calls)|发起 1v1 通话|
25
+ |[inviteUser](#inviteUser)|在群组通话中,邀请其他人加入|
26
+ |[join](#join)|主动加入当前的群组通话中|
27
+ |[accept](#accept)|接听通话|
28
+ |[reject](#reject)|拒绝通话|
29
+ |[hangup](#hangup)|结束通话|
30
30
 
31
31
  ### 设备控制相关接口函数
32
32
 
33
33
  |API|描述|
34
34
  |---------|---------|
35
- |openCamera|开启摄像头|
36
- |closeCamera|关闭摄像头|
37
- |switchCamera|切换前后摄像头|
38
- |openMicrophone|打开麦克风|
39
- |closeMicrophone|关闭麦克风|
40
- |selectAudioPlaybackDevice|选择音频播放设备(听筒/扬声器)|
35
+ |[openCamera](#openCamera)|开启摄像头|
36
+ |[closeCamera](#closeCamera)|关闭摄像头|
37
+ |[switchCamera](#switchCamera)|切换前后摄像头|
38
+ |[openMicrophone](#openMicrophone)|打开麦克风|
39
+ |[closeMicrophone](#closeMicrophone)|关闭麦克风|
40
+ |[selectAudioPlaybackDevice](#selectAudioPlaybackDevice)|选择音频播放设备(听筒/扬声器)|
41
41
 
42
42
  ### 其他接口函数
43
43
 
44
44
  |API|描述|
45
45
  |---------|---------|
46
- |setSelfInfo|设置用户的头像、昵称|
47
- |setLogLevel|设置日志等级|
48
- |setBeautyLevel|设置美颜级别,支持关闭默认美颜|
46
+ |[setSelfInfo](#setSelfInfo)|设置用户的头像、昵称|
47
+ |[setLogLevel](#setLogLevel)|设置日志等级|
48
+ |[setBeautyLevel](#setBeautyLevel)|设置美颜级别,支持关闭默认美颜|
49
49
 
50
50
  ## API 详情
51
51
  ``` javascript
@@ -8,22 +8,22 @@ TUICallEvent API 是音视频通话组件的事件接口。
8
8
 
9
9
  |事件名|说明|
10
10
  |---------|---------|
11
- |ON_CALL_RECEIVED|通话请求的事件。|
12
- |USER_ACCEPT|用户接听,**v4.x.x 已废弃。**|
13
- |USER_ENTER|用户进入通话。|
14
- |USER_LEAVE|用户离开通话。|
15
- |USER_UPDATE|用户更新。|
16
- |REJECT|用户拒绝通话。|
17
- |NO_RESP|用户无响应。|
18
- |LINE_BUSY|用户忙线。|
19
- |ON_CALL_NOT_CONNECTED|通话未建立时,通话的各端都会抛出该事件。|
20
- |ON_CALL_BEGIN|通话接通时抛出的事件。|
21
- |ON_CALL_END|通话结束。|
22
- |KICKED_OUT|被踢下线。|
23
- |ERROR|错误信息。|
24
- |ON_USER_NETWORK_QUALITY_CHANGED|所有用户网络质量的事件。|
25
- |USER_VIDEO_AVAILABLE|xxxx 用户是否有视频流的事件。|
26
- |USER_AUDIO_AVAILABLE|xxxx 用户是否有音频流的事件。|
11
+ |[ON_CALL_RECEIVED](#ON_CALL_RECEIVED)|通话请求的事件。|
12
+ |[USER_ACCEPT](#USER_ACCEPT)|用户接听,**v4.x.x 已废弃。**|
13
+ |[USER_ENTER](#USER_ENTER)|用户进入通话。|
14
+ |[USER_LEAVE](#USER_LEAVE)|用户离开通话。|
15
+ |[USER_UPDATE](#USER_UPDATE)|用户更新。|
16
+ |[REJECT](#REJECT)|用户拒绝通话。|
17
+ |[NO_RESP](#NO_RESP)|用户无响应。|
18
+ |[LINE_BUSY](#LINE_BUSY)|用户忙线。|
19
+ |[ON_CALL_NOT_CONNECTED](#ON_CALL_CANCELED)|通话未建立时,通话的各端都会抛出该事件。|
20
+ |[ON_CALL_BEGIN](#ON_CALL_BEGIN)|通话接通时抛出的事件。|
21
+ |[ON_CALL_END](#CALL_END)|通话结束。|
22
+ |[KICKED_OUT](#KICKED_OUT)|被踢下线。|
23
+ |[ERROR](#ERROR)|错误信息。|
24
+ |[ON_USER_NETWORK_QUALITY_CHANGED](#ON_USER_NETWORK_QUALITY_CHANGED)|所有用户网络质量的事件。|
25
+ |[USER_VIDEO_AVAILABLE](#USER_VIDEO_AVAILABLE)|xxxx 用户是否有视频流的事件。|
26
+ |[USER_AUDIO_AVAILABLE](#USER_AUDIO_AVAILABLE)|xxxx 用户是否有音频流的事件。|
27
27
 
28
28
  ## TUICallEvent 详情
29
29
  ``` javascript
@@ -122,27 +122,6 @@ const handleLogin = () => {
122
122
  };
123
123
  </script>
124
124
 
125
- <style scoped>
126
- .btn {
127
- width: 60px;
128
- margin: 10px 20px;
129
- }
130
-
131
- .btn-img {
132
- width: 60px;
133
- height: 60px;
134
- border-radius: 140px;
135
- }
136
-
137
- .btn-text {
138
- font-size: 12px;
139
- color: #d5e0f2;
140
- font-weight: 400;
141
- text-align: center;
142
- margin-top: 10px;
143
- }
144
- </style>
145
-
146
125
  ```
147
126
  2. **添加拒接按钮:**添加"拒接"按钮,将其点击事件分别绑定至 [reject](https://liteav.sdk.qcloud.com/doc/product/tuikit/atomic-x/uni-app/zh/v1.0/api/index.html#reject) 方法。
148
127
 
@@ -165,25 +144,6 @@ const handleLogin = () => {
165
144
  };
166
145
  </script>
167
146
 
168
- <style scoped>
169
- .btn {
170
- margin: 10px 20px;
171
- }
172
-
173
- .btn-img {
174
- width: 60px;
175
- height: 60px;
176
- border-radius: 140px;
177
- }
178
-
179
- .btn-text {
180
- font-size: 12px;
181
- color: #d5e0f2;
182
- font-weight: 400;
183
- text-align: center;
184
- margin-top: 10px;
185
- }
186
- </style>
187
147
  ```
188
148
  3. **拨打方取消通话或您拒接时销毁界面:**无论拨打方取消呼叫,还是接收方拒接,均会触发 `onCallEnded`(通话结束)事件。建议监听此事件,以便在通话终止时及时关闭(销毁)通话界面。
189
149
 
@@ -442,12 +402,6 @@ const handleLogin = () => {
442
402
  });
443
403
  </script>
444
404
 
445
- <style>
446
- .call-view-container {
447
- background: rgba(15, 16, 20, 0.5);
448
- overflow: hidden;
449
- }
450
- </style>
451
405
  ```
452
406
 
453
407
  > **说明:**
@@ -526,12 +480,6 @@ const handleLogin = () => {
526
480
  });
527
481
  </script>
528
482
 
529
- <style>
530
- .call-view-container {
531
- background: rgba(15, 16, 20, 0.5);
532
- overflow: hidden;
533
- }
534
- </style>
535
483
  ```
536
484
  - `networkQualityIcons` **接口参数详细说明:**
537
485
 
@@ -665,12 +613,6 @@ const handleLogin = () => {
665
613
  });
666
614
  </script>
667
615
 
668
- <style>
669
- .call-view-container {
670
- background: rgba(15, 16, 20, 0.5);
671
- overflow: hidden;
672
- }
673
- </style>
674
616
  ```
675
617
  - `participantAvatars` **属性参数详细说明:**
676
618
 
@@ -729,12 +671,6 @@ const handleLogin = () => {
729
671
  });
730
672
  </script>
731
673
 
732
- <style>
733
- .call-view-container {
734
- background: rgba(15, 16, 20, 0.5);
735
- overflow: hidden;
736
- }
737
- </style>
738
674
  ```
739
675
  - `waitingAnimation` **接口参数详细说明:**
740
676
 
@@ -783,19 +719,6 @@ const handleLogin = () => {
783
719
  });
784
720
  </script>
785
721
 
786
- <style scoped>
787
- .call-timer {
788
- display: flex;
789
- align-items: center;
790
- justify-content: center;
791
- }
792
-
793
- .timer-text {
794
- font-size: 28rpx;
795
- color: #FFFFFF;
796
- font-weight: 400;
797
- }
798
- </style>
799
722
  ```
800
723
 
801
724
  ## 更多功能
@@ -884,13 +807,6 @@ const handleLogin = () => {
884
807
  });
885
808
  </script>
886
809
 
887
- <style>
888
- .call-view-container {
889
- background: rgba(15, 16, 20, 0.5);
890
- overflow: hidden;
891
- }
892
- </style>
893
-
894
810
  ```
895
811
  - `layoutTemplate` **属性参数详细说明:**
896
812