uni-app

最近更新时间:2026-03-30 14:53:11

我的收藏
TUIKit 是一款基于腾讯云 IM SDK 和 UTS 原生渲染技术的 uni-app UI 组件库,流畅度远超传统 Webview 方案,提供了一系列通用的 UI 组件,涵盖会话、聊天、群组、音视频通话等核心功能。基于这些精心设计的 UI 组件,您可以快速构建优雅、可靠、可扩展的即时通讯应用。

核心的聊天页面我们使用了原生动画模块,对每一个关键结构单独处理位置计算,带来更加流畅的聊天体验。
多结构单独结算位置信息效果示意图
多结构单独结算位置信息效果示意图


关键概念

原生渲染:基于 UTS 技术直接编译为 Kotlin/Swift 原生代码,流畅度远超 Webview 方案。
开源免费:插件源码以 uni_modules 形式开放,UI 样式、交互逻辑均可直接修改,无需二次封装。配套 GitHub Demo 开箱即用。

前提条件

IDE: HBuilderX 版本 ≥ 4.66。
Vue 版本: Vue3。
支持平台: 仅支持打包为 Android / iOS App,不支持 H5 和小程序。
说明:
Vue2、H5 和小程序项目,如有需要请参考以下替代方案:
Vue2 打包 App。 可参考:chat-uikit-uniapp
Vue3/Vue2 打包 H5。 可参考:chat-uikit-uniapp
Vue3/Vue2 打包小程序。可参考:uni-app 完整版(Vue3/Vue2)
接入过程中遇到任何卡点或有改进建议,欢迎通过 UniApp Atomicx 接入体验反馈 告诉我们,我们会及时跟进处理。

集成步骤

步骤1:创建项目

打开 HBuilderX,在菜单栏中选择 “文件 > 新建 > 项目”,创建一个名为 chat-example 的 uni-app 项目。


步骤2:安装 TUIKit 插件

进入【官方】腾讯云聊天+通话+直播响应式 SDK。点击【下载插件并导入 HBuilderX】,将插件导入 chat-example 项中。


步骤3:配置原生模块与 Android 权限

说明:
CameraVideoPlayer 模块用于聊天中的拍照和视频播放功能。Android 权限用于录音、网络访问和文件存储。
1. 模块配置。点击 manifest.json > 点击安卓/iOS模块配置 > 勾选 Camera&Gallery(相机和相册)和 VideoPlayer(视频播放)。如图所示:

2. 配置 Android 相关权限。点击 manifest.json> 点击安卓/iOS权限配置 > Android 云打包配置中配置如下权限。如图所示:
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />


步骤4:集成 TUIKit

1. 拷贝 TUIKit 页面 && 静态资源:将⁠uni_modules/tuikit-atomic-x/quickstart/⁠下的⁠pages/*⁠拷贝到项目 page⁠ 目录,⁠static/*⁠拷贝到项目 static 目录下。
Mac 端
Windows 端
cp -r uni_modules/tuikit-atomic-x/quickstart/static/* static/ && cp -r uni_modules/tuikit-atomic-x/quickstart/pages/* pages/
xcopy /E /I /Y "uni_modules\\tuikit-atomic-x\\quickstart\\static\\*" "static\\" && xcopy /E /I /Y "uni_modules\\tuikit-atomic-x\\quickstart\\pages\\*" "pages\\"
2. 配置页面路由:替换 pages.json 内容,注册所需页面路由:
{
"pages": [
{
"path": "pages/login/login",
"style": {
"navigationStyle": "custom"
}
},
{
"path": "pages/index/index",
"style": {
"navigationStyle": "custom"
}
},
{
"path": "pages/scenes/chat/conversationList/conversationList",
"style": {
"navigationStyle": "custom",
"backgroundColor": "#f5f5f5"
}
},
{
"path": "pages/scenes/chat/chat/index",
"style": {
"navigationStyle": "custom",
"backgroundColor": "#f5f5f5",
"app-plus": {
"titleNView": false
}
}
},
{
"path": "pages/scenes/chat/chatSetting/index",
"style": {
"navigationStyle": "custom",
"backgroundColor": "#f5f5f5"
}
},
{
"path": "pages/scenes/chat/groupManagement/index",
"style": {
"navigationStyle": "custom"
}
},
{
"path": "pages/scenes/chat/groupMemberList/index",
"style": {
"navigationStyle": "custom",
"backgroundColor": "#f5f5f5"
}
},
{
"path": "pages/scenes/chat/search/search",
"style": {
"navigationStyle": "custom"
}
},
{
"path": "pages/scenes/chat/search/searchInConversation",
"style": {
"navigationStyle": "custom"
}
},
{
"path": "pages/scenes/chat/userPicker/userPicker",
"style": {
"navigationBarTitleText": "选人列表",
"navigationBarBackgroundColor": "#ffffff",
"navigationBarTextStyle": "black",
"backgroundColor": "#f5f5f5"
}
},
{
"path": "pages/scenes/chat/createGroup/createGroup",
"style": {
"navigationBarTitleText": "创建群聊",
"navigationBarBackgroundColor": "#ffffff",
"navigationBarTextStyle": "black",
"backgroundColor": "#f5f5f5"
}
},
{
"path": "pages/scenes/chat/groupTypeInfo/groupTypeInfo",
"style": {
"navigationBarTitleText": "选择群类型",
"navigationBarBackgroundColor": "#ffffff",
"navigationBarTextStyle": "black",
"backgroundColor": "#f5f5f5"
}
},
{
"path": "pages/scenes/chat/videoPlayer/videoPlayer",
"style": {
"app-plus": {
"titleNView": false,
"screenOrientation": [
"portrait-primary",
"landscape-primary",
"landscape-secondary"
]
}
}
},
{
"path": "pages/scenes/chat/contacts/contactList/index",
"style": {
"navigationStyle": "custom",
"backgroundColor": "#f5f5f5"
}
},
{
"path": "pages/scenes/chat/contacts/contactInfo/index",
"style": {
"navigationStyle": "custom",
"backgroundColor": "#f5f5f5"
}
},
{
"path": "pages/scenes/chat/contacts/addFriend/index",
"style": {
"navigationStyle": "custom",
"backgroundColor": "#f5f5f5"
}
},
{
"path": "pages/scenes/chat/contacts/addGroup/index",
"style": {
"navigationStyle": "custom",
"backgroundColor": "#f5f5f5"
}
},
{
"path": "pages/scenes/chat/contacts/contactList/friendApplicationList",
"style": {
"navigationStyle": "custom",
"backgroundColor": "#f5f5f5"
}
},
{
"path": "pages/scenes/chat/contacts/contactList/groupApplicationList",
"style": {
"navigationStyle": "custom",
"backgroundColor": "#f5f5f5"
}
},
{
"path": "pages/scenes/chat/contacts/contactList/groupList",
"style": {
"navigationStyle": "custom",
"backgroundColor": "#f5f5f5"
}
},
{
"path": "pages/scenes/chat/contacts/contactList/blackList",
"style": {
"navigationStyle": "custom",
"backgroundColor": "#f5f5f5"
}
},
{
"path": "pages/scenes/chat/contacts/applicationVerify/index",
"style": {
"navigationStyle": "custom",
"backgroundColor": "#f5f5f5"
}
},
{
"path": "pages/scenes/chat/contacts/setRemark/index",
"style": {
"navigationStyle": "custom",
"backgroundColor": "#f5f5f5"
}
}
],
"tabBar": {
"color": "#999999",
"selectedColor": "#147AFF",
"borderStyle": "black",
"backgroundColor": "#ffffff",
"list": [
{
"pagePath": "pages/scenes/chat/conversationList/conversationList",
"text": "消息",
"iconPath": "static/tuikit/message.png",
"selectedIconPath": "static/tuikit/message-selected.png"
},
{
"pagePath": "pages/scenes/chat/contacts/contactList/index",
"text": "通讯录",
"iconPath": "static/tuikit/relation.png",
"selectedIconPath": "static/tuikit/relation-selected.png"
}
]
},
"globalStyle": {
"navigationBarTextStyle": "black",
"navigationBarTitleText": "腾讯云 IM",
"navigationBarBackgroundColor": "#EBF0F6",
"backgroundColor": "#F8F8F8"
}
}
说明:
如需调整页面路由,请同步修改页面和 uni_modules/tuikit-atomic-x/components 中路由跳转逻辑。

运行和测试

1. 制作自定义基座。点击运行 > 运行到手机或模拟器 > 制作自定义调试基座:
说明:
首次制作自定义基座需要下载 Gradle 依赖,Android 通常需要 10~20 分钟,iOS 需要 5~10 分钟,请耐心等待,请勿中断。

2. 获取 SDKAppID、userID 和 userSig 并配置。
注意:
本文示例代码采用从 即时通信 IM 控制台 获取 UserSig 的方案,该方法仅适合本地跑通功能调试。 正确的 UserSig 签发方式请参见 服务端生成 UserSig
安全提示:示例代码中的 UserSig 仅供测试使用,生产环境请通过服务端生成
SDKAppID:在 即时通信 IM 控制台 > 应用管理 单击创建新应用,获取 SDKAppID。
说明:
SDKAppID 是腾讯云 IM 客户应用的唯一标识。我们建议每一个独立的 App 都申请一个新的 SDKAppID。不同 SDKAppID 之间的消息是天然隔离的,不能互通。

userID:单击 即时通信 IM 控制台 > 消息服务 Chat > 账号管理,切换至目标应用所在账号,您可以创建 2~3 个账号用于体验单聊、群聊的功能。
说明:
用户的唯一标识符,由您定义,只能包含大小写字母(a-z,A-Z)、数字(0-9)、下划线和连字符。

userSig:单击 即时通信 IM 控制台 > 开发工具 > UserSig生成校验,切换至目标应用所在账号,填写创建的 userID,即可生成 userSig。
说明:
用户登录即时通信 IM 的密码,其本质是对 UserID 等信息加密后得到的密文。
开发环境:快速跑通 Demo,可以通过 即时通信 IM 控制台 获取 UserSig。
生产环境:将 UserSig 的生成代码集成到您的服务端,并提供面向项目的接口, 正确的 UserSig 签发方式请参见 服务端生成 UserSig

pages/login/login.vue 文件中的 login 函数,填入 SDKAppID、userID、 UserSig。
// 登录
login({
sdkAppID: Number(sdkAppId.value), // SDKAppID
userID: userId.value, // userID
userSig: '', // UserSig
success: () => {
uni.reLaunch({ url: '/pages/scenes/chat/conversationList/conversationList' })
},
fail: (code: number, msg: string) => {
isLoading.value = false
uni.showToast({ title: msg || '登录失败', icon: 'none' })
}
})
3. 运行项目。点击运行 > 运行到手机或模拟器 > 运行到Android/iOS基座,使用上一步中制作的自定义基座运行到手机:


集成音视频通话(推荐)

1. 下载腾讯云音视频通话 UTS 插件。访问 DCloud 插件市场——【官方】腾讯云音视频通话插件 TencentCloud-Call 并导入该插件到自己的项目。

2. 全局注册 TUICallKit 插件。在根目录下的 main.js 中引入如下代码,用于把 $TUICallKit$TUIStore 注册到全局变量中:
import { TUICallKit } from "@/uni_modules/TencentCloud-Call/callkit/callServices/services/index";
import { TUIStore } from "@/uni_modules/TencentCloud-Call/callkit/callServices/TUIStore/index";

uni.$TUICallKit = TUICallKit;
uni.$TUIStore = TUIStore;
3. 注册 TUICallKit 页面。在根目录下的 pages.json 中注册唤起通话页面。
{
"path": "uni_modules/TencentCloud-Call/callkit/callPage",
"style": {
"navigationBarTitleText": "",
"navigationStyle": "custom"
}
}

常见问题

技术兼容性类

Q:该 TUIKit 插件是否支持编译到 H5 或微信小程序?

A:不支持。由于新版 TUIKit 基于 UTS (Uni-app Type Script) 插件架构开发,深度依赖 Android 和 iOS 的原生能力(如原生渲染引擎、本地数据库、音视频编解码),因此仅支持打包为 App (Android/iOS)。如果您需要 H5 或小程序版本,请使用腾讯云 IM 的 Web 或小程序专用 SDK。

Q:我的现有项目全是 .vue 页面(Webview 渲染),能直接集成吗?

A:可以混用,但需要注意页面模式。
nvue 页面和 vue 页面可以互相跳转,但是 vue 页面的子组件不建议是 nvue 组件。TUIKit 的 UI 组件是 nvue 组件,因此使用 TUIKit 所在的页面(Pages)必须也是 nvue 文件。
建议方案: 将聊天页、会话列表等 IM 相关核心页面配置为 nvue 页面。
注意事项:pages.json 中配置相关路由时,请确保样式渲染模式正确。现有项目的 .vue 页面可以通过路由跳转到 IM 的 nvue 页面,两者可以共存,但不能在同一个页面文件中混写。可以理解为 nvue 组件具有污染性,nvue 组件的父组件、父页面都要是 nvue 文件。

Q:页面样式错乱、布局塌陷?

A:没有严格遵守 nvue 的 Flex 布局规范。
nvue 页面中:
1. 默认 flex-directioncolumn(纵向),而非 Web 的 row
2. 文本必须包裹在 <text> 组件中,不能直接写在 <div><view> 里。
3. 不支持简写属性(例如 margin: 10px 20px),必须写全(margin-top, margin-left 等)。

集成与构建类

Q:运行报错 "uni is not defined" 或组件无法加载?

A:请检查是否制作并使用了自定义调试基座
由于插件包含原生代码(Java/Objective-C),标准基座不包含这些原生库。
解决步骤: 请严格按照文档“运行和测试-步骤2”操作,在 HBuilderX 中点击 运行 > 运行到手机或模拟器 > 制作自定义调试基座。制作完成后,运行时请务必选择运行到 Android/iOS 基座,并勾选“使用自定义基座”。

Q:制作自定义基座时一直失败或卡顿怎么办?

A:这通常是本地原生编译环境(Gradle 或 CocoaPods)配置问题导致的。
Android: 请检查本地 JDK 版本是否兼容,以及网络是否能正常访问 Maven/Google 仓库。
iOS: 请确保已安装 CocoaPods 且版本更新,同时检查网络环境是否能访问 GitHub 或 CDN 库。

Q:如何移除 CallKit 功能?

如果您不需要集成 CallKit 功能,请在 pages/scenes/chat/chat/index.nvue 中给 MessageInput 组件传入 toolList 属性,如下所示:
<template>
<MessageInput
v-if="conversationID"
ref="messageInputRef"
:conversationID="conversationID"
:toolList="customToolList"
@height-change="onMessageInputHeightChange"
/>
</template>

<script setup lang="ts">
import MessageInput, { DEFAULT_TOOLS } from '@/uni_modules/tuikit-atomic-x/components/MessageInput/MessageInput.nvue';
const customToolList = computed(() => DEFAULT_TOOLS.filter(tool => tool.id !== 'videoCall' && tool.id !== 'voiceCall'));
</script>

联系我们

如遇任何问题,可联系 官网售后 反馈,享有专业工程师的支持,解决您的难题。