@tencentcloud/sdk-mcp 1.7.3 → 1.7.5

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 +23 -0
  2. package/README.md +22 -23
  3. package/knowledge/path-meta.js +23 -1
  4. package/package.json +1 -1
  5. package/resource/index/manifest.json +1 -1
  6. package/resource/integration/callkit/preset/android/integration.md +4 -0
  7. package/resource/integration/callkit/preset/flutter/integration.md +8 -4
  8. package/resource/integration/callkit/preset/ios/integration.md +16 -15
  9. package/resource/integration/callkit/preset/react/integration.md +2 -2
  10. package/resource/integration/callkit/preset/vue/integration.md +9 -12
  11. package/resource/integration/chat/preset/android/integration.md +5 -147
  12. package/resource/integration/chat/preset/flutter/integration.md +22 -130
  13. package/resource/integration/chat/preset/ios/integration.md +12 -279
  14. package/resource/integration/chat/preset/react/integration.md +27 -1
  15. package/resource/integration/chat/preset/uni-app/integration.md +5 -1
  16. package/resource/integration/chat/preset/vue/integration.md +21 -31
  17. package/resource/integration/livekit/preset/live/android/live-host-integration.md +4 -0
  18. package/resource/integration/livekit/preset/live/ios/live-host-integration.md +4 -0
  19. package/resource/integration/livekit/preset/live/ios/prepare-integration.md +3 -3
  20. package/resource/integration/livekit/preset/live/vue/live-list-integration.md +3 -4
  21. package/resource/integration/livekit/preset/live/vue/live-player-desk-integration.md +0 -1
  22. package/resource/integration/livekit/preset/live/vue/live-player-h5-integration.md +0 -1
  23. package/resource/integration/livekit/preset/live/vue/live-pusher-integration.md +4 -9
  24. package/resource/integration/roomkit/preset/vue/integration.md +152 -652
  25. package/resource/knowledge/callkit/best-practice/android/video-chat-dating.md +490 -0
  26. package/resource/knowledge/callkit/best-practice/flutter/android-keep-call-alive-background.md +79 -0
  27. package/resource/knowledge/callkit/best-practice/flutter/background-incoming-call-no-notification.md +99 -0
  28. package/resource/knowledge/callkit/best-practice/flutter/ios-keep-call-alive-background.md +93 -0
  29. package/resource/knowledge/callkit/best-practice/flutter/ios-startup-crash-version-voip.md +68 -0
  30. package/resource/knowledge/callkit/core-sdk/android/answer-call.md +2 -2
  31. package/resource/knowledge/callkit/core-sdk/android/make-call.md +5 -5
  32. package/resource/knowledge/callkit/core-sdk/flutter/answer-call.md +7 -7
  33. package/resource/knowledge/callkit/core-sdk/flutter/make-call.md +10 -10
  34. package/resource/knowledge/callkit/core-sdk/flutter/offline-push.md +1 -1
  35. package/resource/knowledge/callkit/core-sdk/ios/answer-call.md +18 -16
  36. package/resource/knowledge/callkit/core-sdk/ios/make-call.md +16 -14
  37. package/resource/knowledge/callkit/core-sdk/miniprogram/call-engine.md +19 -19
  38. package/resource/knowledge/callkit/core-sdk/miniprogram/call-event.md +16 -16
  39. package/resource/knowledge/callkit/core-sdk/uni-app/answer-call.md +2 -86
  40. package/resource/knowledge/callkit/core-sdk/uni-app/make-call.md +2 -104
  41. package/resource/knowledge/callkit/core-sdk/web/call-event.md +2 -2
  42. package/resource/knowledge/callkit/faq/android.md +4 -4
  43. package/resource/knowledge/callkit/faq/common.md +4 -4
  44. package/resource/knowledge/callkit/faq/error-code.md +62 -36
  45. package/resource/knowledge/callkit/faq/uniapp-miniprogram.md +1 -1
  46. package/resource/knowledge/callkit/preset/android/api.md +10 -10
  47. package/resource/knowledge/callkit/preset/harmonyos/api.md +362 -0
  48. package/resource/knowledge/callkit/preset/harmonyos/integration.md +322 -0
  49. package/resource/knowledge/callkit/preset/ios/api.md +9 -9
  50. package/resource/knowledge/callkit/preset/miniprogram/api-uniapp.md +293 -0
  51. package/resource/knowledge/callkit/preset/miniprogram/api.md +19 -19
  52. package/resource/knowledge/callkit/preset/miniprogram/integration.md +292 -0
  53. package/resource/knowledge/callkit/preset/miniprogram/uniapp-integration.md +521 -0
  54. package/resource/knowledge/callkit/preset/uni-app/api.md +49 -0
  55. package/resource/knowledge/callkit/preset/uni-app/integration.md +353 -0
  56. package/resource/knowledge/chat/preset/android-view/integration.md +54 -102
  57. package/resource/knowledge/chat/preset/ios/features/language.md +5 -5
  58. package/resource/knowledge/chat/preset/ios-uikit/integration.md +194 -926
  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/message-input.md +4 -4
  66. package/resource/knowledge/chat/preset/vue/features/search.md +9 -790
  67. package/resource/knowledge/chat/preset/vue/h5/integration.md +724 -0
  68. package/resource/knowledge/livekit/core-sdk/features/android/audience-list.md +3 -3
  69. package/resource/knowledge/livekit/core-sdk/features/android/live-list.md +3 -3
  70. package/resource/knowledge/livekit/core-sdk/features/flutter/audience-list.md +3 -3
  71. package/resource/knowledge/livekit/core-sdk/features/flutter/live-list.md +3 -3
  72. package/resource/knowledge/livekit/core-sdk/features/ios/audience-list.md +3 -3
  73. package/resource/knowledge/livekit/core-sdk/features/ios/live-list.md +3 -3
  74. package/resource/knowledge/livekit/core-sdk/features/uni-app/audience-list.md +3 -3
  75. package/resource/knowledge/livekit/core-sdk/features/uni-app/live-list.md +3 -170
  76. package/resource/knowledge/livekit/core-sdk/live/android/co-guest-interaction.md +1 -1
  77. package/resource/knowledge/livekit/core-sdk/live/android/host-interaction.md +3 -3
  78. package/resource/knowledge/livekit/core-sdk/live/flutter/co-guest-interaction.md +1 -1
  79. package/resource/knowledge/livekit/core-sdk/live/flutter/host-interaction.md +3 -3
  80. package/resource/knowledge/livekit/core-sdk/live/flutter/integration.md +3 -3
  81. package/resource/knowledge/livekit/core-sdk/live/ios/co-guest-interaction.md +1 -1
  82. package/resource/knowledge/livekit/core-sdk/live/ios/host-interaction.md +3 -3
  83. package/resource/knowledge/livekit/core-sdk/live/ios/integration.md +2 -2
  84. package/resource/knowledge/livekit/core-sdk/live/uni-app/co-guest-interaction.md +13 -78
  85. package/resource/knowledge/livekit/core-sdk/live/uni-app/host-interaction.md +5 -70
  86. package/resource/knowledge/livekit/core-sdk/live/uni-app/integration.md +10 -10
  87. package/resource/knowledge/livekit/core-sdk/voice/android/co-guest-interaction.md +1 -1
  88. package/resource/knowledge/livekit/core-sdk/voice/android/host-interaction.md +4 -4
  89. package/resource/knowledge/livekit/core-sdk/voice/flutter/co-guest-interaction.md +1 -1
  90. package/resource/knowledge/livekit/core-sdk/voice/ios/co-guest-interaction.md +1 -1
  91. package/resource/knowledge/livekit/core-sdk/voice/ios/host-interaction.md +4 -4
  92. package/resource/knowledge/livekit/core-sdk/voice/uni-app/integration.md +7 -7
  93. package/resource/knowledge/livekit/preset/live/vue/features/barrage.md +1 -24
  94. package/resource/knowledge/livekit/preset/live/vue/features/live-audience-list.md +0 -3
  95. package/resource/knowledge/livekit/preset/live/vue/features/live-view.md +0 -5
  96. package/resource/knowledge/push/api-reference/harmonyos.md +9 -9
  97. package/resource/knowledge/push/api-reference/unity.md +10 -10
  98. package/resource/knowledge/push/api-reference/unreal-engine.md +11 -11
  99. package/resource/knowledge/push/config/donut.md +3 -3
  100. package/resource/knowledge/push/config/harmonyos.md +12 -12
  101. package/resource/knowledge/push/config/ios.md +2 -2
  102. package/resource/knowledge/push/integration/android.md +90 -1067
  103. package/resource/knowledge/push/integration/donut.md +11 -11
  104. package/resource/knowledge/push/integration/flutter.md +38 -24
  105. package/resource/knowledge/push/integration/harmonyos.md +1 -11
  106. package/resource/knowledge/push/integration/ios.md +29 -40
  107. package/resource/knowledge/push/integration/react-native.md +1 -1
  108. package/resource/knowledge/push/integration/uni-app.md +1 -1
  109. package/resource/knowledge/push/integration/unity.md +4 -4
  110. package/resource/knowledge/push/integration/unreal-engine.md +9 -9
  111. package/resource/knowledge/roomkit/core-sdk/android/room-state.md +6 -6
  112. package/resource/knowledge/roomkit/core-sdk/android/schedule-room.md +13 -13
  113. package/resource/knowledge/roomkit/core-sdk/flutter/room-state.md +5 -5
  114. package/resource/knowledge/roomkit/core-sdk/flutter/schedule-room.md +4 -4
  115. package/resource/knowledge/roomkit/core-sdk/ios/room-state.md +6 -6
  116. package/resource/knowledge/roomkit/core-sdk/ios/schedule-room.md +4 -4
  117. package/resource/knowledge/roomkit/core-sdk/vue/device-detection.md +0 -9
  118. package/resource/knowledge/roomkit/core-sdk/vue/free-beauty-panel.md +0 -9
  119. package/resource/knowledge/roomkit/core-sdk/vue/recording.md +3 -3
  120. package/resource/knowledge/roomkit/core-sdk/vue/room-chat.md +0 -3
  121. package/resource/knowledge/roomkit/core-sdk/vue/room-view.md +0 -16
  122. package/resource/knowledge/roomkit/core-sdk/vue/schedule-room.md +0 -3
  123. package/resource/knowledge/roomkit/core-sdk/vue/virtual-background.md +3 -6
  124. package/resource/knowledge/roomkit/core-sdk/vue/whiteboard-annotation.md +0 -15
  125. package/resource/knowledge/roomkit/preset/android/integration.md +5 -202
  126. package/resource/knowledge/roomkit/preset/flutter/integration.md +17 -13
  127. package/resource/knowledge/roomkit/preset/harmonyos/integration.md +10 -2
  128. package/resource/knowledge/roomkit/preset/ios/integration.md +7 -204
  129. package/resource/knowledge/roomkit/preset/react/integration.md +0 -202
  130. package/resource/knowledge/roomkit/preset/uniapp-app/integration.md +244 -500
  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 +203 -185
  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`
@@ -135,7 +135,7 @@ class CallActivity : AppCompatActivity() {
135
135
 
136
136
  - **以下是添加"接听"和"拒接"按钮的实现方式:**
137
137
 
138
- 1. **添加接听和拒接按钮:**创建底部按钮栏容器,并在其中添加"接听"与"拒接"按钮,将其点击事件分别绑定至 [accept](https://liteav.sdk.cloudcachetci.com/doc/product/tuikit/atomic-x/android/zh/-atomic-x%20-core%20-a-p-i/io.trtc.tuikit.atomicxcore.api.call/-call-store/accept.html) 和 [reject](https://liteav.sdk.cloudcachetci.com/doc/product/tuikit/atomic-x/android/zh/-atomic-x%20-core%20-a-p-i/io.trtc.tuikit.atomicxcore.api.call/-call-store/reject.html) 方法。
138
+ 1. **添加接听和拒接按钮:**创建底部按钮栏容器,并在其中添加"接听"与"拒接"按钮,将其点击事件分别绑定至 [accept](https://liteav.sdk.cloudcachetci.com/doc/product/tuikit/atomic-x/android/zh/-atomic-x%20-core%20-a-p-i/io.trtc.tuikit.atomicxcore.api.call/-call-store/accept.html) 和 [reject](https://liteav.sdk.cloudcachetci.com/doc/product/tuikit/atomic-x/android/zh/-atomic-x%20-core%20-a-p-i/io.trtc.tuikit.atomicxcore.api.call/-call-store/reject.html) 方法。
139
139
 
140
140
  ``` java
141
141
  import io.trtc.tuikit.atomicxcore.api.device.DeviceStore
@@ -208,7 +208,7 @@ class CallActivity : AppCompatActivity() {
208
208
  }
209
209
  }
210
210
  ```
211
- 2. **拨打方取消通话或您拒接时销毁界面:**无论拨打方取消呼叫,还是接收方拒接,均会触发 [onCallEnded](https://liteav.sdk.cloudcachetci.com/doc/product/tuikit/atomic-x/android/zh/-atomic-x%20-core%20-a-p-i/io.trtc.tuikit.atomicxcore.api.call/-call-listener/on-call-ended.html)(通话结束)事件。建议监听此事件,以便在通话终止时及时关闭(销毁)通话界面。
211
+ 2. **拨打方取消通话或您拒接时销毁界面:**无论拨打方取消呼叫,还是接收方拒接,均会触发 [onCallEnded](https://liteav.sdk.cloudcachetci.com/doc/product/tuikit/atomic-x/android/zh/-atomic-x%20-core%20-a-p-i/io.trtc.tuikit.atomicxcore.api.call/-call-listener/on-call-ended.html)(通话结束)事件。建议监听此事件,以便在通话终止时及时关闭(销毁)通话界面。
212
212
 
213
213
  ``` java
214
214
  import io.trtc.tuikit.atomicxcore.api.call.CallEndReason
@@ -139,7 +139,7 @@
139
139
 
140
140
  - **以添加挂断、麦克风、摄像头按钮为例,实现方式如下:**
141
141
 
142
- 1. **创建底部栏容器**:在通话页面底部创建一个容器,用于添加挂断、麦克风、摄像头按钮。
142
+ 1. **创建底部栏容器**:在通话页面底部创建一个容器,用于添加挂断、麦克风、摄像头按钮。
143
143
 
144
144
  ``` java
145
145
  import io.trtc.tuikit.atomicxcore.api.call.CallStore
@@ -172,7 +172,7 @@
172
172
  }
173
173
  }
174
174
  ```
175
- 2. **添加挂断按钮:**在底部工具栏容器中添加挂断按钮,在点击事件中调用 [hangup](https://liteav.sdk.cloudcachetci.com/doc/product/tuikit/atomic-x/android/zh/-atomic-x%20-core%20-a-p-i/io.trtc.tuikit.atomicxcore.api.call/-call-store/hangup.html) 接口并销毁页面。
175
+ 2. **添加挂断按钮:**在底部工具栏容器中添加挂断按钮,在点击事件中调用 [hangup](https://liteav.sdk.cloudcachetci.com/doc/product/tuikit/atomic-x/android/zh/-atomic-x%20-core%20-a-p-i/io.trtc.tuikit.atomicxcore.api.call/-call-store/hangup.html) 接口并销毁页面。
176
176
 
177
177
  ``` java
178
178
  import io.trtc.tuikit.atomicxcore.api.call.CallStore
@@ -208,7 +208,7 @@
208
208
  }
209
209
  }
210
210
  ```
211
- 3. **添加麦克风开关按钮:**在底部工具栏容器中添加麦克风开关按钮,并在点击事件中调用 [openLocalMicrophone](https://liteav.sdk.cloudcachetci.com/doc/product/tuikit/atomic-x/android/zh/-atomic-x%20-core%20-a-p-i/io.trtc.tuikit.atomicxcore.api.device/-device-store/open-local-microphone.html) 或 [closeLocalMicrophone](https://liteav.sdk.cloudcachetci.com/doc/product/tuikit/atomic-x/android/zh/-atomic-x%20-core%20-a-p-i/io.trtc.tuikit.atomicxcore.api.device/-device-store/close-local-microphone.html) 接口。
211
+ 3. **添加麦克风开关按钮:**在底部工具栏容器中添加麦克风开关按钮,并在点击事件中调用 [openLocalMicrophone](https://liteav.sdk.cloudcachetci.com/doc/product/tuikit/atomic-x/android/zh/-atomic-x%20-core%20-a-p-i/io.trtc.tuikit.atomicxcore.api.device/-device-store/open-local-microphone.html) 或 [closeLocalMicrophone](https://liteav.sdk.cloudcachetci.com/doc/product/tuikit/atomic-x/android/zh/-atomic-x%20-core%20-a-p-i/io.trtc.tuikit.atomicxcore.api.device/-device-store/close-local-microphone.html) 接口。
212
212
 
213
213
  ``` java
214
214
  import io.trtc.tuikit.atomicxcore.api.call.CallStore
@@ -248,7 +248,7 @@
248
248
  }
249
249
  }
250
250
  ```
251
- 4. **添加摄像头开关按钮:**在底部工具栏容器中添加摄像头开关按钮,并在点击事件中调用 [openLocalCamera](https://liteav.sdk.cloudcachetci.com/doc/product/tuikit/atomic-x/android/zh/-atomic-x%20-core%20-a-p-i/io.trtc.tuikit.atomicxcore.api.device/-device-store/open-local-camera.html) 或 [closeLocalCamera](https://liteav.sdk.cloudcachetci.com/doc/product/tuikit/atomic-x/android/zh/-atomic-x%20-core%20-a-p-i/io.trtc.tuikit.atomicxcore.api.device/-device-store/close-local-camera.html) 接口。
251
+ 4. **添加摄像头开关按钮:**在底部工具栏容器中添加摄像头开关按钮,并在点击事件中调用 [openLocalCamera](https://liteav.sdk.cloudcachetci.com/doc/product/tuikit/atomic-x/android/zh/-atomic-x%20-core%20-a-p-i/io.trtc.tuikit.atomicxcore.api.device/-device-store/open-local-camera.html) 或 [closeLocalCamera](https://liteav.sdk.cloudcachetci.com/doc/product/tuikit/atomic-x/android/zh/-atomic-x%20-core%20-a-p-i/io.trtc.tuikit.atomicxcore.api.device/-device-store/close-local-camera.html) 接口。
252
252
 
253
253
  【Android】
254
254
  ``` java
@@ -291,7 +291,7 @@ class CallActivity : AppCompatActivity() {
291
291
  }
292
292
  ```
293
293
 
294
- 5. **实时更新媒体设备按钮文本:**监听麦克风和摄像头的状态,实时更新按钮文本。
294
+ 5. **实时更新媒体设备按钮文本:**监听麦克风和摄像头的状态,实时更新按钮文本。
295
295
 
296
296
  ``` java
297
297
  import io.trtc.tuikit.atomicxcore.api.call.*
@@ -25,7 +25,7 @@ flutter pub add atomic_x_core
25
25
  #### Android 配置
26
26
  1. 由于 SDK 内部使用了 Java 反射机制(或特性),需要将部分 SDK 类加入不混淆处理的名单。
27
27
 
28
- - 请在工程的 `android/app/` 目录下找到 `build.gradle.kts`(或 `build.gradle` )文件并配置并开启混淆规则:
28
+ - 请在工程的 `android/app/` 目录下找到 `build.gradle.kts`(或 `build.gradle` )文件并配置并开启混淆规则:
29
29
 
30
30
  【build.gradle.kts】
31
31
  ``` java
@@ -55,7 +55,7 @@ android {
55
55
 
56
56
  ```
57
57
 
58
- - 在工程的 `android/app` 目录下创建 `proguard-rules.pro` 文件,并在其中添加如下代码:
58
+ - 在工程的 `android/app` 目录下创建 `proguard-rules.pro` 文件,并在其中添加如下代码:
59
59
 
60
60
  ``` java
61
61
  -keep class com.tencent.** { *; }
@@ -177,7 +177,7 @@ Future<void> _login() async {
177
177
 
178
178
  - **以下是添加"接听"和"拒接"按钮的实现方式:**
179
179
 
180
- 1. **添加接听和拒接按钮:**创建底部按钮栏容器,并在其中添加"接听"与"拒接"按钮,将其点击事件分别绑定至 [accept](https://liteav.sdk.qcloud.com/doc/product/tuikit/atomic-x/flutter/v1.0/zh/api_call_call_store/CallStore/accept.html) 和 [reject](https://liteav.sdk.qcloud.com/doc/product/tuikit/atomic-x/flutter/v1.0/zh/api_call_call_store/CallStore/reject.html) 方法。
180
+ 1. **添加接听和拒接按钮:**创建底部按钮栏容器,并在其中添加"接听"与"拒接"按钮,将其点击事件分别绑定至 [accept](https://liteav.sdk.qcloud.com/doc/product/tuikit/atomic-x/flutter/v1.0/zh/api_call_call_store/CallStore/accept.html) 和 [reject](https://liteav.sdk.qcloud.com/doc/product/tuikit/atomic-x/flutter/v1.0/zh/api_call_call_store/CallStore/reject.html) 方法。
181
181
 
182
182
  ``` java
183
183
  import 'package:flutter/material.dart';
@@ -246,7 +246,7 @@ Future<void> _login() async {
246
246
  }
247
247
  }
248
248
  ```
249
- 2. **拨打方取消通话或您拒接时销毁界面:**无论拨打方取消呼叫,还是接收方拒接,均会触发 [onCallEnded](https://liteav.sdk.qcloud.com/doc/product/tuikit/atomic-x/flutter/v1.0/zh/api_call_call_store/CallEventListener/onCallEnded.html)(通话结束)事件。建议监听此事件,以便在通话终止时及时关闭(销毁)通话界面。
249
+ 2. **拨打方取消通话或您拒接时销毁界面:**无论拨打方取消呼叫,还是接收方拒接,均会触发 [onCallEnded](https://liteav.sdk.qcloud.com/doc/product/tuikit/atomic-x/flutter/v1.0/zh/api_call_call_store/CallEventListener/onCallEnded.html)(通话结束)事件。建议监听此事件,以便在通话终止时及时关闭(销毁)通话界面。
250
250
 
251
251
  ``` java
252
252
  import 'package:atomic_x_core/atomicxcore.dart';
@@ -1058,11 +1058,11 @@ iOS 端支持通过底层 TRTC 引擎实现应用外画中画功能。当应用
1058
1058
 
1059
1059
  4. 勾选以下三个选项:
1060
1060
 
1061
- - `Audio, AirPlay, and Picture in Picture`(保持音频采集和画中画功能)。
1061
+ - `Audio, AirPlay, and Picture in Picture`(保持音频采集和画中画功能)。
1062
1062
 
1063
- - `Voice over IP`(支持 VoIP 通话)。
1063
+ - `Voice over IP`(支持 VoIP 通话)。
1064
1064
 
1065
- - `Remote notifications`(可选,用于接收离线推送)。
1065
+ - `Remote notifications`(可选,用于接收离线推送)。
1066
1066
 
1067
1067
  配置完成后,您的 `Info.plist` 文件会自动添加以下内容:
1068
1068
 
@@ -26,7 +26,7 @@ flutter pub add atomic_x_core
26
26
  #### Android 配置
27
27
  1. 由于 SDK 内部使用了 Java 反射机制(或特性),需要将部分 SDK 类加入不进行混淆处理的名单。
28
28
 
29
- - 请在工程的 `android/app/`目录下找到 `build.gradle.kts`(或 `build.gradle` )文件中配置并开启混淆规则:
29
+ - 请在工程的 `android/app/`目录下找到 `build.gradle.kts`(或 `build.gradle` )文件中配置并开启混淆规则:
30
30
 
31
31
  【build.gradle.kts】
32
32
  ``` java
@@ -56,7 +56,7 @@ android {
56
56
 
57
57
  ```
58
58
 
59
- - 在工程的 `android/app` 目录下创建 `proguard-rules.pro` 文件,并在其中添加如下代码:
59
+ - 在工程的 `android/app` 目录下创建 `proguard-rules.pro` 文件,并在其中添加如下代码:
60
60
 
61
61
  ``` java
62
62
  -keep class com.tencent.** { *; }
@@ -186,7 +186,7 @@ android {
186
186
 
187
187
  - **以添加挂断、麦克风、摄像头按钮为例,实现方式如下:**
188
188
 
189
- 1. **创建底部栏容器**:在通话页面底部创建一个容器,用于添加挂断、麦克风、摄像头按钮。
189
+ 1. **创建底部栏容器**:在通话页面底部创建一个容器,用于添加挂断、麦克风、摄像头按钮。
190
190
 
191
191
  ``` java
192
192
  import 'package:flutter/material.dart';
@@ -208,7 +208,7 @@ android {
208
208
  }
209
209
 
210
210
  ```
211
- 2. **添加挂断按钮:**在底部工具栏容器中添加挂断按钮,在点击事件中调用 [hangup](https://liteav.sdk.qcloud.com/doc/product/tuikit/atomic-x/flutter/v1.0/zh/api_call_call_store/CallStore/hangup.html) 接口并销毁页面。
211
+ 2. **添加挂断按钮:**在底部工具栏容器中添加挂断按钮,在点击事件中调用 [hangup](https://liteav.sdk.qcloud.com/doc/product/tuikit/atomic-x/flutter/v1.0/zh/api_call_call_store/CallStore/hangup.html) 接口并销毁页面。
212
212
 
213
213
  ``` java
214
214
  import 'package:atomic_x_core/atomicxcore.dart';
@@ -237,7 +237,7 @@ android {
237
237
  );
238
238
  }
239
239
  ```
240
- 3. **添加麦克风开关按钮:**在底部工具栏容器中添加麦克风开关按钮,并在点击事件中调用 [openLocalMicrophone](https://liteav.sdk.qcloud.com/doc/product/tuikit/atomic-x/flutter/v1.0/zh/api_device_device_store/DeviceStore/openLocalMicrophone.html) 或 [closeLocalMicrophone](https://liteav.sdk.qcloud.com/doc/product/tuikit/atomic-x/flutter/v1.0/zh/api_device_device_store/DeviceStore/closeLocalMicrophone.html) 接口。
240
+ 3. **添加麦克风开关按钮:**在底部工具栏容器中添加麦克风开关按钮,并在点击事件中调用 [openLocalMicrophone](https://liteav.sdk.qcloud.com/doc/product/tuikit/atomic-x/flutter/v1.0/zh/api_device_device_store/DeviceStore/openLocalMicrophone.html) 或 [closeLocalMicrophone](https://liteav.sdk.qcloud.com/doc/product/tuikit/atomic-x/flutter/v1.0/zh/api_device_device_store/DeviceStore/closeLocalMicrophone.html) 接口。
241
241
 
242
242
  ``` java
243
243
  import 'package:atomic_x_core/atomicxcore.dart';
@@ -278,7 +278,7 @@ android {
278
278
  }
279
279
 
280
280
  ```
281
- 4. **添加摄像头开关按钮:**在底部工具栏容器中添加摄像头开关按钮,并在点击事件中调用 [openLocalCamera](https://liteav.sdk.qcloud.com/doc/product/tuikit/atomic-x/flutter/v1.0/zh/api_device_device_store/DeviceStore/openLocalCamera.html) 或 [closeLocalCamera](https://liteav.sdk.qcloud.com/doc/product/tuikit/atomic-x/flutter/v1.0/zh/api_device_device_store/DeviceStore/closeLocalCamera.html) 接口。
281
+ 4. **添加摄像头开关按钮:**在底部工具栏容器中添加摄像头开关按钮,并在点击事件中调用 [openLocalCamera](https://liteav.sdk.qcloud.com/doc/product/tuikit/atomic-x/flutter/v1.0/zh/api_device_device_store/DeviceStore/openLocalCamera.html) 或 [closeLocalCamera](https://liteav.sdk.qcloud.com/doc/product/tuikit/atomic-x/flutter/v1.0/zh/api_device_device_store/DeviceStore/closeLocalCamera.html) 接口。
282
282
 
283
283
  ``` java
284
284
  import 'package:atomic_x_core/atomicxcore.dart';
@@ -320,7 +320,7 @@ android {
320
320
  }
321
321
 
322
322
  ```
323
- 5. **实时更新媒体设备按钮状态:**在 Flutter 中,使用 `ValueListenableBuilder` 监听麦克风和摄像头的状态变化,UI 会自动更新。
323
+ 5. **实时更新媒体设备按钮状态:**在 Flutter 中,使用 `ValueListenableBuilder` 监听麦克风和摄像头的状态变化,UI 会自动更新。
324
324
 
325
325
  ``` java
326
326
  import 'package:atomic_x_core/atomicxcore.dart';
@@ -1124,11 +1124,11 @@ CallStore.shared.state.selfInfo.addListener(() {
1124
1124
 
1125
1125
  4. 勾选以下三个选项:
1126
1126
 
1127
- - `Audio, AirPlay, and Picture in Picture`(保持音频采集和画中画功能)。
1127
+ - `Audio, AirPlay, and Picture in Picture`(保持音频采集和画中画功能)。
1128
1128
 
1129
- - `Voice over IP`(支持 VoIP 通话)。
1129
+ - `Voice over IP`(支持 VoIP 通话)。
1130
1130
 
1131
- - `Remote notifications`(可选,用于接收离线推送)。
1131
+ - `Remote notifications`(可选,用于接收离线推送)。
1132
1132
 
1133
1133
  配置完成后,您的 `Info.plist` 文件会自动添加以下内容:
1134
1134
 
@@ -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 视图组件功能说明:**
@@ -163,7 +165,7 @@ class ViewController: UIViewController {
163
165
 
164
166
  - **以下是添加"接听"和"拒接"按钮的实现方式:**
165
167
 
166
- 1. **添加接听和拒接按钮:**添加"接听"与"拒接"按钮,将其点击事件分别绑定至 [accept](https://tencent-rtc.github.io/TUIKit_iOS/documentation/atomicxcore/callstore/accept(completion:)) 和 [reject](https://tencent-rtc.github.io/TUIKit_iOS/documentation/atomicxcore/callstore/reject(completion:)) 方法。
168
+ 1. **添加接听和拒接按钮:**添加"接听"与"拒接"按钮,将其点击事件分别绑定至 [accept](https://tencent-rtc.github.io/TUIKit_iOS/documentation/atomicxcore/callstore/accept(completion:)) 和 [reject](https://tencent-rtc.github.io/TUIKit_iOS/documentation/atomicxcore/callstore/reject(completion:)) 方法。
167
169
 
168
170
  【iOS(Swift)】
169
171
  ``` swift
@@ -236,7 +238,7 @@ class CallViewController: UIViewController {
236
238
 
237
239
  ```
238
240
 
239
- 2. **拨打方取消通话或您拒接时销毁界面:**无论拨打方取消呼叫,还是接收方拒接,均会触发 onCallEnded(通话结束)事件。建议监听此事件,以便在通话终止时及时关闭(销毁)通话界面。
241
+ 2. **拨打方取消通话或您拒接时销毁界面:**无论拨打方取消呼叫,还是接收方拒接,均会触发 onCallEnded(通话结束)事件。建议监听此事件,以便在通话终止时及时关闭(销毁)通话界面。
240
242
 
241
243
  ``` swift
242
244
  import UIKit
@@ -1074,19 +1076,19 @@ class CallViewController: UIViewController {
1074
1076
  为了确保应用在进入后台时仍能正常采集音频和视频(例如用户锁屏或切换到其他应用),**您需要完成:iOS 后台模式权限配置**、**设置音频会话,实现方式如下:**
1075
1077
  1. **iOS 后台模式权限配置:**在 Xcode 中打开您的项目
1076
1078
 
1077
- - 选择项目的 `Target` → `Signing & Capabilities`。
1079
+ - 选择项目的 `Target` → `Signing & Capabilities`。
1078
1080
 
1079
- - 点击 `+ Capability` 。
1081
+ - 点击 `+ Capability` 。
1080
1082
 
1081
- - 搜索并添加 `Background Modes`。
1083
+ - 搜索并添加 `Background Modes`。
1082
1084
 
1083
- - 勾选以下三个选项:
1085
+ - 勾选以下三个选项:
1084
1086
 
1085
- 1. `Audio, AirPlay, and Picture in Picture`(保持音频采集和画中画功能)。
1087
+ 1. `Audio, AirPlay, and Picture in Picture`(保持音频采集和画中画功能)。
1086
1088
 
1087
- 2. `Voice over IP`(支持 VoIP 通话)。
1089
+ 2. `Voice over IP`(支持 VoIP 通话)。
1088
1090
 
1089
- 3. `Remote notifications`(可选,用于接收离线推送)。
1091
+ 3. `Remote notifications`(可选,用于接收离线推送)。
1090
1092
 
1091
1093
  配置完成后,您的 Info.plist 文件会自动添加以下内容:
1092
1094
 
@@ -123,20 +123,22 @@ 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
  }
142
144
  ```
@@ -165,7 +167,7 @@ class CallViewController: UIViewController {
165
167
 
166
168
  - **以添加挂断、麦克风、摄像头按钮为例,实现方式如下:**
167
169
 
168
- 1. **添加挂断按钮**:创建并添加挂断按钮,在点击事件中调用 hangup 并销毁界面。
170
+ 1. **添加挂断按钮**:创建并添加挂断按钮,在点击事件中调用 hangup 并销毁界面。
169
171
 
170
172
  ``` swift
171
173
  import UIKit
@@ -216,7 +218,7 @@ class CallViewController: UIViewController {
216
218
  }
217
219
  }
218
220
  ```
219
- 2. **添加麦克风开关按钮:**创建并添加麦克风开关按钮,并在点击事件中调用 [openLocalMicrophone](https://tencent-rtc.github.io/TUIKit_iOS/documentation/atomicxcore/devicestore/openlocalmicrophone(completion:)) 或 [closeLocalMicrophone](https://tencent-rtc.github.io/TUIKit_iOS/documentation/atomicxcore/devicestore/closelocalmicrophone()) 接口。
221
+ 2. **添加麦克风开关按钮:**创建并添加麦克风开关按钮,并在点击事件中调用 [openLocalMicrophone](https://tencent-rtc.github.io/TUIKit_iOS/documentation/atomicxcore/devicestore/openlocalmicrophone(completion:)) 或 [closeLocalMicrophone](https://tencent-rtc.github.io/TUIKit_iOS/documentation/atomicxcore/devicestore/closelocalmicrophone()) 接口。
220
222
 
221
223
  ``` swift
222
224
  import UIKit
@@ -271,7 +273,7 @@ class CallViewController: UIViewController {
271
273
  }
272
274
  }
273
275
  ```
274
- 3. **添加摄像头开关按钮:**在底部工具栏容器中添加摄像头开关按钮,并在点击事件中调用 [openLocalCamera](https://tencent-rtc.github.io/TUIKit_iOS/documentation/atomicxcore/devicestore/openlocalcamera(isfront:completion:)) 或 [closeLocalCamera](https://tencent-rtc.github.io/TUIKit_iOS/documentation/atomicxcore/devicestore/closelocalcamera()) 接口。
276
+ 3. **添加摄像头开关按钮:**在底部工具栏容器中添加摄像头开关按钮,并在点击事件中调用 [openLocalCamera](https://tencent-rtc.github.io/TUIKit_iOS/documentation/atomicxcore/devicestore/openlocalcamera(isfront:completion:)) 或 [closeLocalCamera](https://tencent-rtc.github.io/TUIKit_iOS/documentation/atomicxcore/devicestore/closelocalcamera()) 接口。
275
277
 
276
278
  ``` swift
277
279
  import UIKit
@@ -327,7 +329,7 @@ class CallViewController: UIViewController {
327
329
  }
328
330
  }
329
331
  ```
330
- 4. **实时更新媒体设备按钮文本:**监听麦克风和摄像头的状态,实时更新按钮文本。
332
+ 4. **实时更新媒体设备按钮文本:**监听麦克风和摄像头的状态,实时更新按钮文本。
331
333
 
332
334
  ``` swift
333
335
  import UIKit
@@ -1177,11 +1179,11 @@ private func observeSelfCallStatus() {
1177
1179
 
1178
1180
  4. 勾选以下三个选项:
1179
1181
 
1180
- - `Audio, AirPlay, and Picture in Picture`(保持音频采集和画中画功能)。
1182
+ - `Audio, AirPlay, and Picture in Picture`(保持音频采集和画中画功能)。
1181
1183
 
1182
- - `Voice over IP`(支持 VoIP 通话)。
1184
+ - `Voice over IP`(支持 VoIP 通话)。
1183
1185
 
1184
- - `Remote notifications`(可选,用于接收离线推送)。
1186
+ - `Remote notifications`(可选,用于接收离线推送)。
1185
1187
 
1186
1188
  配置完成后,您的 `Info.plist` 文件会自动添加以下内容:
1187
1189