文章目录
前言
即时通信( IM
)作为现代应用的核心功能之一,广泛应用于社交、电商、在线教育等场景。本文将手把手教你如何在 Web(Vue3)
、移动端( UniApp
)和 .NET8
后端中集成腾讯云 IM
,实现跨平台的即时通信能力。
一、腾讯云IM准备工作
1.1 开通腾讯云IM服务
1.2 获取密钥
- 在应用详情页找到
"基本配置"
选项卡 - 在
"帐号体系集成"
部分点击"生成密钥"
- 保存生成的
SecretKey
(务必妥善保管,不要泄露)
1.3 下载测试UserSig生成工具
为方便测试,腾讯云提供了 UserSig
生成工具,可临时用于前端调试。
⚠️ 生产环境务必在后端生成
UserSig
,前端直接使用SecretKey
是严重的安全风险!
二、.NET8后端集成
2.1 安装必要NuGet包
Install-Package TencentCloudSDK
Install-Package TencentCloudSDK.TIM
2.2 实现UserSig生成服务
创建 IMService.cs
:
using TencentCloud.Common;
using TencentCloud.Tls.Sig;
public interface IIMService
{
string GenerateUserSig(string userId, int expireSeconds = 86400);
}
public class TencentIMService : IIMService
{
private readonly string _sdkAppId;
private readonly string _secretKey;
public TencentIMService(IConfiguration config)
{
_sdkAppId = config["TencentIM:SDKAppId"];
_secretKey = config["TencentIM:SecretKey"];
if(string.IsNullOrEmpty(_sdkAppId) || string.IsNullOrEmpty(_secretKey))
throw new ArgumentNullException("腾讯云IM配置不能为空");
}
public string GenerateUserSig(string userId, int expireSeconds = 86400)
{
var generator = new TLSSigAPIv2(_sdkAppId, _secretKey);
return generator.GenSig(userId, expireSeconds);
}
}
2.3 注册服务并配置
在 Program.cs
中添加:
// 添加配置
builder.Services.Configure<TencentIMOptions>(builder.Configuration.GetSection("TencentIM"));
// 注册IM服务
builder.Services.AddSingleton<IIMService, TencentIMService>();
在appsettings.json中添加配置:
json
{
"TencentIM": {
"SDKAppId": "你的SDKAppID",
"SecretKey": "你的SecretKey"
}
}
2.4 创建API接口
创建 IMController.cs
:
[ApiController]
[Route("api/[controller]")]
public class IMController : ControllerBase
{
private readonly IIMService _imService;
public IMController(IIMService imService)
{
_imService = imService;
}
[HttpGet("userSig")]
public IActionResult GetUserSig([FromQuery] string userId)
{
try
{
var userSig = _imService.GenerateUserSig(userId);
return Ok(new { UserSig = userSig });
}
catch(Exception ex)
{
return StatusCode(500, $"生成UserSig失败: {ex.Message}");
}
}
}
三、Vue3 Web端集成
3.1 安装SDK
npm install tim-js-sdk @tencentcloud/chat-uikit-vue
npm install tim-upload-plugin --save-dev
3.2 封装IM服务
创建 src/services/im.js
:
import TIM from 'tim-js-sdk';
import TIMUploadPlugin from 'tim-upload-plugin';
let timInstance = null;
export const initTIM = (SDKAppID) => {
timInstance = TIM.create({
SDKAppID: Number(SDKAppID)
});
// 注册文件上传插件
timInstance.registerPlugin({ 'tim-upload-plugin': TIMUploadPlugin });
return timInstance;
};
export const loginIM = async (userID, userSig) => {
if (!timInstance) throw new Error('TIM未初始化');
try {
const { code } = await timInstance.login({ userID, userSig });
if (code === 0) {
console.log('IM登录成功');
return true;
}
throw new Error(`登录失败,code: ${code}`);
} catch (error) {
console.error('IM登录失败:', error);
throw error;
}
};
export const logoutIM = async () => {
if (timInstance) {
await timInstance.logout();
timInstance = null;
}
};
// 监听新消息
export const onMessageReceived = (callback) => {
if (!timInstance) return;
timInstance.on(TIM.EVENT.MESSAGE_RECEIVED, (event) => {
callback(event.data);
});
};
3.3 在Vue组件中使用
<script setup>
import { ref, onMounted, onBeforeUnmount } from 'vue';
import { initTIM, loginIM, logoutIM, onMessageReceived } from '@/services/im';
const SDKAppID = '你的SDKAppID';
const currentUserID = '当前用户ID';
const userSig = ref('');
// 获取UserSig(实际应从后端API获取)
const fetchUserSig = async () => {
const response = await fetch(`/api/im/userSig?userId=${currentUserID}`);
const data = await response.json();
userSig.value = data.UserSig;
};
// 初始化并登录IM
const initAndLogin = async () => {
initTIM(SDKAppID);
await loginIM(currentUserID, userSig.value);
// 设置消息监听
onMessageReceived((messages) => {
messages.forEach(msg => {
console.log('收到消息:', msg);
});
});
};
onMounted(async () => {
await fetchUserSig();
await initAndLogin();
});
onBeforeUnmount(() => {
logoutIM();
});
</script>
四、UniApp移动端集成
4.1 安装SDK
npm install tim-wx-sdk tim-upload-plugin
4.2 封装IM服务
创建 utils/im.js
:
import TIM from 'tim-wx-sdk';
import TIMUploadPlugin from 'tim-upload-plugin';
let tim = null;
export const initTIM = (SDKAppID) => {
tim = TIM.create({
SDKAppID: Number(SDKAppID)
});
// 注册插件
tim.registerPlugin({ 'tim-upload-plugin': TIMUploadPlugin });
// 设置日志级别
tim.setLogLevel(0); // 0:普通级别,日志量较多
return tim;
};
export const loginIM = async (userID, userSig) => {
if (!tim) throw new Error('TIM未初始化');
try {
const { code } = await tim.login({ userID, userSig });
if (code === 0) return true;
throw new Error(`登录失败,code: ${code}`);
} catch (error) {
console.error('IM登录失败:', error);
throw error;
}
};
// 发送文本消息
export const sendTextMessage = async (toUserID, text) => {
const message = tim.createTextMessage({
to: toUserID,
conversationType: tim.TYPES.CONV_C2C,
payload: { text }
});
return await tim.sendMessage(message);
};
4.3 在页面中使用
import { onLoad, onUnload } from '@dcloudio/uni-app';
import { initTIM, loginIM, sendTextMessage } from '@/utils/im';
export default {
setup() {
const SDKAppID = '你的SDKAppID';
const currentUserID = '当前用户ID';
onLoad(async () => {
// 从后端获取UserSig
const { data } = await uni.request({
url: '/api/im/userSig',
data: { userId: currentUserID }
});
// 初始化并登录
initTIM(SDKAppID);
await loginIM(currentUserID, data.UserSig);
});
onUnload(() => {
tim.logout();
});
const handleSend = async () => {
try {
await sendTextMessage('目标用户ID', '你好,这是一条测试消息');
uni.showToast({ title: '发送成功' });
} catch (error) {
uni.showToast({ title: '发送失败', icon: 'error' });
}
};
return { handleSend };
}
};
五、常见问题解决
5.1 UserSig无效
- 检查
SDKAppID
和SecretKey
是否正确 - 检查生成
UserSig
的代码是否与腾讯云文档一致 - 检查
UserSig
是否已过期(默认有效期24小时)
5.2 Web端无法登录
- 检查是否注册了必要的插件
- 查看浏览器控制台是否有跨域错误
- 尝试降低日志级别查看详细错误:
tim.setLogLevel(0)
5.3 UniApp端消息不显示
- 确保已正确监听
MESSAGE_RECEIVED
事件 - 检查是否调用了
tim.getMessageList()
获取历史消息 - 确认发送方和接收方的
UserID
是否正确
六、最佳实践建议
- 用户状态管理:将IM登录状态与业务系统登录状态同步
- 消息本地存储:重要消息应保存在本地数据库
- 断线重连:实现自动重连机制
- 性能优化:大批量消息应分页加载
- 安全措施:定期轮换
UserSig
,不要在前端存储SecretKey
结语
通过本文的详细步骤,你应该已经成功在 Vue3
、UniApp
和 .NET8
中集成了腾讯云 IM
。IM
作为复杂系统,实际开发中还会遇到更多细节问题,建议参考腾讯云IM官方文档获取最新信息。
如果有任何问题,欢迎在评论区留言交流!如果觉得本文有帮助,请点赞收藏支持~