会话列表页 | 聊天页 | 音视频通话 |
![]() | ![]() | ![]() |
AtomicXCore 管理数据,通过 TUIChatKit_Swift 提供 SwiftUI 页面。接入方可直接使用 ConversationsPage、ChatPage、ContactsPage,无须自行组装聊天界面。iOS Deployment Target 设置为 15.0 或更高,并与 Podfile 中的 platform :ios 保持一致。SDKAppID、UserID 和 UserSig。参见 开通服务。git clone https://github.com/Tencent-RTC/TUIKit_iOS_SwiftUI.git
chat 文件夹整体复制到您的工程根目录下。复制完成后的目录结构如下:YourApplication/├── source/ # 您的工程代码├── chat/ # Chat 源码│ ├── demo/ # 示例工程│ ├── demo_mini/ # 最小示例工程│ └── uikit/ # TUIChatKit 组件库│ ├── TUIChatKit_Swift.podspec│ ├── components/ # UI 组件│ ├── page/ # 完整页面│ └── resources/ # 图片及本地化资源├── Podfile # 依赖配置文件├── YourApplication.xcworkspace # 您的项目文件
TUIKit_iOS_SwiftUI 是包含多个产品的开源仓库,Chat 的 UI 源码位于 chat/ 目录下(chat/uikit 为 SwiftUI 组件库,chat/demo 为示例工程)。模块目录可放在工程任意位置,只需在 Podfile 中设置正确的相对路径即可。实际集成到你的项目中时 demo 和 demo_mini 这两个目录应该删除。Podfile 中添加依赖,按源码位置调整相对路径。以下假设已将 chat 文件夹整体复制到工程根目录,且 Podfile 位于同一工程根目录platform :ios, '15.0'# 将 YourApplication 替换为 App target 名称。依赖版本范围与当前聊天 Demo 保持一致。target 'YourApplication' douse_frameworks! :linkage => :staticpod 'TUIChatKit_Swift', :path => './chat/uikit/TUIChatKit_Swift.podspec'pod 'AtomicXCore', '>= 4.3.10', '< 5.0'# 需要音视频通话时添加# pod 'TUICallKit_Swift'end
pod install# 如果无法安装 TUIKit 最新版本,执行以下命令更新本地的 CocoaPods 仓库列表。# pod repo update# pod update

LoginStore 的 login 接口,传入上文获取的 sdkAppID、userID、userSig 进行登录鉴权。代码如下:import AtomicXCore// let yourSdkAppID: Int32 = 10_000_000_00 替换为您的实际 SDKAppID// let testUserID = "testUserID" 替换为您的测试用户 ID// let userSig = "xxxxxxx" 该用户对应的 UserSig,从步骤1的控制台获取LoginStore.shared.login(sdkAppID: yourSdkAppID, userID: testUserID, userSig: userSig) { result inDispatchQueue.main.async {switch result {case .success:// 进入会话列表界面等(步骤3)case .failure(let error):print("login failed: \\(error.code) \\(error.message)")}}}
import SwiftUIimport AtomicXCoreimport TUIChatKit_Swift// 进入会话列表页面NavigationLink(destination: ConversationsDestination())private struct ConversationsDestination: View {@State private var navigationInfo: NavigationInfo?@State private var showChat = falsevar body: some View {ConversationsPage(config: nil, // 会话操作配置,nil 使用默认配置onConversationClick: { info in // 会话打开回调,返回会话及可选的定位消息navigationInfo = infoshowChat = true}).navigationBarHidden(true).background(chatNavigationLink)}// 响应 onConversationClick 进入聊天页面,ChatPageDestination 的定义可以看步骤4构建聊天界面@ViewBuilderprivate var chatNavigationLink: some View {if let info = navigationInfo {NavigationLink(destination: ChatPageDestination(conversation: info.conversation,locateMessage: info.locateMessage),isActive: $showChat) { EmptyView() }.hidden()}}}
ConversationInfo 用于指定要进入的会话。其中 conversationID 与 type 是必填的关键字段,title 用于聊天页导航栏标题的初始展示。可以选填 messageListConfig 和 messageInputConfig,它们负责配置消息列表和消息输入模块的功能和样式等。import SwiftUIimport AtomicXCoreimport TUIChatKit_Swift// 进入单聊NavigationLink("进入单聊",destination: ChatPageDestination(conversation: makeTestC2CConversationInfo(),locateMessage: nil))private func makeTestC2CConversationInfo() -> ConversationInfo {var conversation = ConversationInfo(conversationID: ChatUtil.getC2CConversationID('test2'))conversation.type = .c2cconversation.title = "与 \\(MiniTestAccount.c2cChatUserID) 聊天"return conversation}// 进入群聊NavigationLink("进入群聊",destination: ChatPageDestination(conversation: makeTestGroupConversationInfo(),locateMessage: nil))private func makeTestGroupConversationInfo() -> ConversationInfo {var conversation = ConversationInfo(conversationID: ChatUtil.getGroupConversationID('testGroup'))conversation.type = .groupconversation.title = "测试群:\\(MiniTestAccount.chatGroupID)"return conversation}private struct ChatPageDestination: View {@Environment(\\.dismiss) private var dismisslet conversation: ConversationInfovar locateMessage: MessageInfo? = nilvar body: some View {ChatPage(conversation: conversation, // 会话信息locateMessage: locateMessage, // 需要定位的消息,nil 不指定定位消息messageListConfig: nil, // 消息列表配置,nil 使用默认配置messageInputConfig: nil, // 输入配置,nil 使用默认配置isShowMoreButton: false, // 是否显示导航栏的更多按钮showsNavigationBar: true, // 是否显示 SDK 自绘导航栏topBannerView: nil, // 自定义顶部横幅,nil 不显示onBack: { dismiss() }, // 返回按钮点击回调onUserClick: nil, // 用户点击回调,返回用户 IDonMoreClick: nil // 导航栏标题或更多按钮点击回调).navigationBarHidden(true)}}
<key>NSCameraUsageDescription</key><string>需要访问您的相机权限,开启后才能发送图片或视频</string><key>NSMicrophoneUsageDescription</key><string>需要访问您的麦克风权限,开启后才能发送语音</string><key>NSPhotoLibraryAddUsageDescription</key><string>需要访问您的相册权限,开启后保存图片或视频</string><key>NSPhotoLibraryUsageDescription</key><string>需要访问您的相册权限,开启后才能发送图片或视频</string>
import SwiftUIimport AtomicXCoreimport TUIChatKit_Swiftprivate struct ContactsDestination: View {var body: some View {ContactsPage(config: nil, // 联系人列表配置,nil 使用默认配置onContactClick: { item in // 联系人点击回调,进入联系人信息// openChat(makeC2CConversation(item))},onGroupClick: { item in // 群点击回调,进入群信息// openChat(makeGroupConversation(item))}).navigationBarTitleDisplayMode(.inline).navigationBarHidden(true)// .background(chatNavigationLink) // 挂载隐藏导航链接,用于打开聊天页}}
LoginStore 登录只建立了消息通道,在登录成功后,通话引擎需单独初始化:import RTCRoomEngineimport TUICallKit_Swiftfunc initializeCall(sdkAppID: Int32, userID: String, userSig: String) {TUICallEngine.createInstance().`init`(sdkAppID, userId: userID, userSig: userSig) {TUICallKit.createInstance().enableIncomingBanner(enable: true)} fail: { code, message inprint("初始化通话失败:\\(code) \\(message ?? "")")}}
import TUICallKit_Swiftfunc startVideoCall(userID: String) {TUICallKit.createInstance().calls(userIdList: [userID], // 被叫用户 ID 列表。单人通话传一个元素;传多个则为群组通话mediaType: .video, // 通话类型:.video 视频通话、.audio 语音通话params: nil,completion: nil)}
import SwiftUIimport AtomicXCoreimport TUIChatKit_Swift// 构造不带音视频通话的 messageInputConfig 传入该config, 输入 View 的更多面板中没有音视频通话private func makeMessageInputConfig () -> ChatMessageInputConfig {var inputConfig = ChatMessageInputConfig()inputConfig.isShowVideoCall = false // 关闭视频通话inputConfig.isShowAudioCall = false // 关闭音频通话return inputConfig}
chat/demo_mini。页面的配置对象参数可以省略或传 nil,组件会使用默认配置,只需设置需要覆盖的选项。TUIChatKit_Swift,避免混用 UIKit 接口。TUIChatKit_Swift,源码应使用 import TUIChatKit_Swift。确认 Podfile 路径正确,执行 pod install 后打开 .xcworkspace。资源包 ChatUIKitBundle 无须改名。.environmentObject(ThemeState.shared),并隐藏系统导航栏。ChatPage.onBack 是返回事件回调,需要接入方执行导航返回。SDKAppID、UserID、UserSig 是否匹配,以及签名是否过期。开发时重新生成测试签名;正式环境检查服务端生成签名的参数。文档反馈