uniapp对接腾讯云IM+音视频。音视频含UI集成

这篇具有很好参考价值的文章主要介绍了uniapp对接腾讯云IM+音视频。音视频含UI集成。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

uniapp对接腾讯云IM+音视频


前言

提示:作者已经实现uniapp集成腾讯云IM+音视频到android和ios平台,如有疑问可在下方留言。音视频为含ui集成


一、准备工作

  • uniapp腾讯云音视频插件地址 官方插件显示的ios版本为9-15,本人ios版本号为16.1,亲测可行
  • uniapp 腾讯云音视频文档
  • uniapp 腾讯云IM文档 注意这个是uni的v3+ts版本,如果是v2版本腾讯云没有直接的sdk,可以参考腾讯云IM中web的sdk可以查看这个文档: web对接腾讯云IM文档
  • 需要文件,用于后续生成userSig,下载地址: 用于生成userSig
  • 请认真阅读插件的使用步骤
  • 缺少依赖的自行安装npm i xx

二、使用步骤

1.App.vue配置

代码如下(示例):

<script>
import TIM from 'tim-js-sdk';
import { genTestUserSig } from '@/debug/GenerateTestUserSig.js'; // 准备工作第四步,下载解压到项目根目录并引入。注意修改GenerateTestUserSig.js中的SDKAPPID和SECRETKEY
const TUICallKit = uni.requireNativePlugin('TencentCloud-TUICallKit');
const TUICallKitEvent = uni.requireNativePlugin('globalEvent');
const TUICallEngine = uni.requireNativePlugin('TencentCloud-TUICallKit-TUICallEngine');

export default {
	globalData: {
		SDKAppID: genTestUserSig('').sdkAppID, // 修改GenerateTestUserSig.js中的SDKAPPID
		userID: '', // 用户id,登录接口返回的用户id,也可以任意指定,但不要重复
		userSig: '', // 登录时生成
	},
	onLaunch() {
		// 登录成功后存储的userID和userSig
		if(uni.getStorageSync('USERID')){
			this.globalData.userID = uni.getStorageSync('USERID')
		}
		if(uni.getStorageSync('USERSIG')){
			this.globalData.userSig = uni.getStorageSync('USERSIG')
		}
		// 重点注意: 为了 uni-app 更好地接入使用 tim,快速定位和解决问题,请勿修改 uni.$TUIKit 命名。
		// 如果您已经接入 tim ,请将 uni.tim 修改为 uni.$TUIKit。
		uni.$TUIKit = TIM.create({
			SDKAppID: this.globalData.SDKAppID
		});
		uni.$TIM = TIM;
		// 将原生插件挂载在 uni 上
		uni.$TUICallKit = TUICallKit;
		uni.$TUICallKitEvent = TUICallKitEvent;
		uni.$TUICallEngine = TUICallEngine;
		// 添加监听事件
		// 通话状态监听
		TUICallKitEvent.addEventListener('onError', (res) => {
		  console.log('onError', JSON.stringify(res));
		});
		TUICallKitEvent.addEventListener('onCallReceived', (res) => {
		  console.log('onCallReceived', JSON.stringify(res));
		});
		TUICallKitEvent.addEventListener('onCallCancelled', (res) => {
		  console.log('onCallCancelled', res);
		});
		TUICallKitEvent.addEventListener('onCallBegin', (res) => {
		  console.log('onCallBegin', JSON.stringify(res));
		});
		TUICallKitEvent.addEventListener('onCallEnd', (res) => {
		  console.log('onCallEnd', JSON.stringify(res));
		});
		// IM监听
		uni.$TUIKit.on(TIM.EVENT.ERROR, function(event) {
			console.log(event,'收到 SDK 发生错误通知')
		  // 收到 SDK 发生错误通知,可以获取错误码和错误信息
		  // event.name - TIM.EVENT.ERROR
		  // event.data.code - 错误码
		  // event.data.message - 错误信息
		});
		
		uni.$TUIKit.on(TIM.EVENT.SDK_NOT_READY, function(event) {
			console.log(event,'收到 SDK 进入 not ready 状态通知')
		  // 收到 SDK 进入 not ready 状态通知,此时 SDK 无法正常工作
		  // event.name - TIM.EVENT.SDK_NOT_READY
		})
		
		uni.$TUIKit.on(TIM.EVENT.NET_STATE_CHANGE, function(event) {
			console.log(event,'网络状态发生改变')
		  // 网络状态发生改变(v2.5.0 起支持)
		  // event.name - TIM.EVENT.NET_STATE_CHANGE
		  // event.data.state 当前网络状态,枚举值及说明如下:
		  //   - TIM.TYPES.NET_STATE_CONNECTED - 已接入网络
		  //   - TIM.TYPES.NET_STATE_CONNECTING - 连接中。很可能遇到网络抖动,SDK 在重试。接入侧可根据此状态提示“当前网络不稳定”或“连接中”
		  //   - TIM.TYPES.NET_STATE_DISCONNECTED - 未接入网络。接入侧可根据此状态提示“当前网络不可用”。SDK 仍会继续重试,若用户网络恢复,SDK 会自动同步消息
		});
		
		uni.$TUIKit.on(TIM.EVENT.CONVERSATION_LIST_UPDATED, function(event) {
			let badge = 0
			for (let i in event.data) {
				badge += event.data[i].unreadCount
			}
			// badeg为未读消息总数,可用于设置角标...
			console.log(event,'收到会话列表更新通知')
		  // 收到会话列表更新通知,可通过遍历 event.data 获取会话列表数据并渲染到页面
		  // event.name - TIM.EVENT.CONVERSATION_LIST_UPDATED
		  // event.data - 存储 Conversation 对象的数组 - [Conversation]
		});
		
		// 监听事件,如:
		uni.$TUIKit.on(TIM.EVENT.SDK_READY, function(event) {
			console.log(event,' 收到离线消息和会话列表同步完毕通知')
		  // 收到离线消息和会话列表同步完毕通知,接入侧可以调用 sendMessage 等需要鉴权的接口
		  // event.name - TIM.EVENT.SDK_READY
		});
		
		uni.$TUIKit.on(TIM.EVENT.MESSAGE_RECEIVED, this.onReceiveMessage);
		// 收到推送的单聊、群聊、群提示、群系统通知的新消息,可通过遍历 event.data 获取消息列表数据并渲染到页面
		// event.name - TIM.EVENT.MESSAGE_RECEIVED
		// event.data - 存储 Message 对象的数组 - [Message]
		// 如果已登录并且能获取到用户id
		if(uni.getStorageSync('token') && this.globalData.userID){
			console.log(uni.getStorageSync('token'), this.globalData.userID);
			// 登录腾讯IM
			uni.$TUIKit.login({
				userID: this.globalData.userID,
				userSig: this.globalData.userSig,
			})
			uni.$TUICallKit.login({
				SDKAppID: this.globalData.SDKAppID,
				userID: this.globalData.userID,
				userSig: this.globalData.userSig,
			}, (res) => {
				if (res.code === 0) {
					// 开启悬浮窗
					uni.$TUICallKit.enableFloatWindow(true);
				} else {
					console.error('login failed, failed message = ', res.msg);
				}
			});
			// 如果设置的是手动关闭启动图则打开下方注释
			// plus.navigator.closeSplashscreen()
		}else{
			uni.reLaunch({
				url: '/pages/login/login',
				success: ()=>{
					// 如果设置的是手动关闭启动图则打开下方注释
					// plus.navigator.closeSplashscreen()
				}
			})
		}
	},
	onShow() {
		console.log('App Show');
	},
	onHide() {
		console.log('App Hide');
	},
	methods: {
		onReceiveMessage(event){
			// 设置已读
			var pages = getCurrentPages()
			let route = pages[pages.length - 1].route
			// 如果当前是在聊天页面,则直接设置该消息已读
			if(route == 'pages/news/chatRoom/chatRoom'){
				// 因为返回的是数组,虽然是一条为了保险起见写成循环(万一是多条呢!!!)
				for (let i in event.data) {
					uni.$TUIKit.setMessageRead({conversationID: event.data[i].conversationID})
				}
			}
		}
	}
};
</script>
<style>
/*每个页面公共css */
</style>

2.登录时操作 login.vue

下面操作,需要在登录接口执行后再执行

代码如下(示例):

//login页面需引入 import { genTestUserSig } from '@/debug/GenerateTestUserSig.js';
// 下方代码放到登录接口的回调中
const userID = String('userID'); // userID必须要字符串类型,后台登录接口返回		
const userSig = genTestUserSig(userID).userSig; // 引入上方js并调用,生成userSig
uni.$TUIKit.login({
	userID: userID,
	userSig: userSig
}).then(() =>{
	let onSdkReady = (event) => {
		// 更新用户昵称及头像
		uni.$TUIKit.updateMyProfile({
			nick: '', // 接口返回的用户昵称
			avatar: '', // 接口返回的用户头像
		}).then(() => {
		}, err => {
		})
	}
	// 监听事件,如:
	uni.$TUIKit.on(uni.$TIM.EVENT.SDK_READY, onSdkReady)
})
uni.$TUICallKit.login({
	SDKAppID: genTestUserSig('').sdkAppID,
	userID: userID,
	userSig: userSig,
}, (res) => {
	if (res.code === 0) {
		// 开启悬浮窗
		uni.$TUICallKit.enableFloatWindow(true);
		// 登录成功后进入首页
		uni.switchTab({
			url: '/pages/index/index'
		})
	} else {
		console.error('login failed, failed message = ', res.msg);
	}
});
// 可以把userID和userSig缓存到本地,用于持久登录
uni.setStorageSync('USERID',userID)
uni.setStorageSync('USERSIG',userSig)
getApp().globalData.userID = userID;
getApp().globalData.userSig = userSig;

3.使用方法

一、音视频

腾讯云音视频插件只需要执行拨打方法即可,收到来电请求后,TUICallKit 组件会自动唤起来电提醒的接听界面。

  • 音视频1V1
uni.$TUICallKit.call({
	userID: String('userID'), // 对方的userID
	callMediaType: 1, // 语音通话(callMediaType = 1)、视频通话(callMediaType = 2)
}, (res) => {
    if (res.code === 0) {
		push({
			user_id: String(this.userID),
			content: `[${this.$store.state.common.userInfo.nickname}]向您发起了${type == 1 ? '语音通话' : '视频通话'}`
		})
        console.log('call success');
    } else {
        console.log(`call failed, error message = ${res.msg}`);
    }
});
  • 音视频1VN
uni.$TUICallKit.groupCall({
	groupID: 'myGroup',
 	userIDList: ['mike', 'tom'],
  	callMediaType: 1, // 语音通话(callMediaType = 1)、视频通话(callMediaType = 2)
}, (res) => {
  if (res.code === 0) {
    console.log('groupCall success');
  } else {
    console.log(`groupCall failed, error message = ${res.msg}`);
  }
});

还有更多api请查看插件地址: 插件地址


二、IM

监听会话列表&设置消息已读方法在App.vue中已经实现.文章来源地址https://www.toymoban.com/news/detail-467851.html

  • 获取会话列表
uni.$TUIKit.getConversationList().then(res=>{
	console.log(res.data.conversationList)
})
  • 删除会话
let promise = uni.$TUIKit.deleteConversation('conversationID');
promise.then(function(imResponse) {
	// 删除会话成功
	const { conversationID } = imResponse.data; // 被删除的会话 ID
	uni.showToast({
		title: '删除成功',
		icon: "none"
	})
}).catch(function(imError) {
	console.warn('deleteConversation error:', imError); // 删除会话失败的相关信息
});
  • 创建文字/图片消息并发送
let message = uni.$TUIKit.createTextMessage({
	to: 'userID', // 对方用户id
	conversationType: uni.$TIM.TYPES.CONV_C2C, // 消息类型
	// 消息优先级,用于群聊(v2.4.2起支持)。如果某个群的消息超过了频率限制,后台会优先下发高优先级的消息,详细请参考:https://cloud.tencent.com/document/product/269/3663#.E6.B6.88.E6.81.AF.E4.BC.98.E5.85.88.E7.BA.A7.E4.B8.8E.E9.A2.91.E7.8E.87.E6.8E.A7.E5.88.B6)
	// 支持的枚举值:TIM.TYPES.MSG_PRIORITY_HIGH, TIM.TYPES.MSG_PRIORITY_NORMAL(默认), TIM.TYPES.MSG_PRIORITY_LOW, TIM.TYPES.MSG_PRIORITY_LOWEST
	// priority: TIM.TYPES.MSG_PRIORITY_NORMAL,
	payload: {
		text: 'hello world !!!', // 文字内容
	},
	// v2.20.0起支持C2C消息已读回执功能,如果您发消息需要已读回执,需购买旗舰版套餐,并且创建消息时将 needReadReceipt 设置为 true
	needReadReceipt: true
	// 消息自定义数据(云端保存,会发送到对端,程序卸载重装后还能拉取到,v2.10.2起支持)
	// cloudCustomData: 'your cloud custom data'
})
// 图片消息
// message = uni.$TUIKit.createImageMessage({
//     to: 'userID',
//     conversationType: uni.$TIM.TYPES.CONV_C2C,
//     payload: { file: [] }, // uni.chooseImage返回的本地文件,直接把数组拿过来,参考下方发送视频消息
//     onProgress: function(event) { console.log('file uploading:', event) }
// });
let promise = uni.$TUIKit.sendMessage(message);
promise.then((imResponse)=>{
	// 发送成功
	console.log(imResponse);
}).catch(function(imError) {
	// 发送失败
	console.warn('sendMessage error:', imError);
});
  • 创建视频消息并发送
uni.chooseVideo({
	mediaType: ['video'], // 视频
	count: 1,
	compressed: false,
	sourceType: ['camera', 'album'], // album 从相册选视频,camera 使用相机拍摄,默认为:['album', 'camera']
	maxDuration: 60, // 设置最长时间60s
	camera: 'back', // 后置摄像头
	success:(res)=>{
		let message = uni.$TUIKit.createVideoMessage({
			to: 'userID',
			conversationType: uni.$TIM.TYPES.CONV_C2C,
			payload: { file: res },
			onProgress: function(event) { console.log('file uploading:', event) }
		});
		// 2. 发送消息
		let promise = uni.$TUIKit.sendMessage(message);
		promise.then((imResponse)=>{
			// 发送成功
			console.log(imResponse);
		}).catch(function(imError) {
			// 发送失败
			console.warn('sendMessage error:', imError);
		});
	}
})
  • 创建语音消息并发送语音消息走的是自定义消息,参考文档上的创建语音消息并没有实现会有报错
let message = uni.$TUIKit.createCustomMessage({
	to: 'userID',
	conversationType: uni.$TIM.TYPES.CONV_C2C,
	// 消息优先级,用于群聊(v2.4.2起支持)。如果某个群的消息超过了频率限制,后台会优先下发高优先级的消息,详细请参考:https://cloud.tencent.com/document/product/269/3663#.E6.B6.88.E6.81.AF.E4.BC.98.E5.85.88.E7.BA.A7.E4.B8.8E.E9.A2.91.E7.8E.87.E6.8E.A7.E5.88.B6)
	// 支持的枚举值:TIM.TYPES.MSG_PRIORITY_HIGH, TIM.TYPES.MSG_PRIORITY_NORMAL(默认), TIM.TYPES.MSG_PRIORITY_LOW, TIM.TYPES.MSG_PRIORITY_LOWEST
	// priority: TIM.TYPES.MSG_PRIORITY_HIGH,
	// 注意,这三个参数我这边因为没有其他需求所以直接把三个参数分别使用了。如果有其他的自定义消息,可以把参数设置为JSON对象,定义好自己的规范
	payload: {
		data: '', // 语音地址
		description: 'voice', // 语音类型
		extension: '', // 语音时长
	}
});
// 3. 发送消息
let promise = uni.$TUIKit.sendMessage(message);
promise.then((imResponse)=>{
	// 发送成功
	console.log(imResponse);
}).catch(function(imError) {
	// 发送失败
	console.warn('sendMessage error:', imError);
});

更多api: 文档地址


总结

如有疑问,或者困难可在下方留言.如本文对你有所帮助,给个点赞、收藏再走吧。

本文原创,转载请注明出处!!!

到了这里,关于uniapp对接腾讯云IM+音视频。音视频含UI集成的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • springboot+websocket+webrtc 仿微信、仿QQ 音视频通话聊天 飞鱼chat IM即时通讯

    仿微信、QQ音视频聊天,文字表情、收发文件图片等功能。本项目使用springboot+websocket+webrtc-bootstrap5+H5+JQuery3.3+mysql实现,可自适应PC端和移动端 git地址在最后 pc端效果图 WebSocket是一种在单个TCP连接上进行全双工通信的协议,这使得客户端和服务器之间的数据交换变得更加简单

    2024年02月04日
    浏览(56)
  • GB28181 对接海康平台,解决音视频卡顿问题

    一、概述 设备使用GB28181协议对接海康平台时,发现音频和视频存在卡顿现象,不是一直卡顿,有时候卡有时候不卡,但是卡顿的时候音视频一起卡顿。 从2016版国标文档上可以看出,要求携带者音视频数据,并且对音视频数据还是有要求的,出现这种卡顿的问题肯定是上传的

    2024年02月10日
    浏览(114)
  • 记录一下uniapp 集成腾讯im特别卡(未解决)

    uniapp的项目运行在微信小程序 , 安卓 , ios手机三端 , 之前这个项目集成过im,不过版本太老了,0.x的版本, 现在需要添加客服功能,所以就升级了 由于是二开 , 也为了方便 , 沿用之前的webview嵌套腾讯IM的方案 , 选用uniapp集成ui ,升级之后所有安卓用户反馈点击进去特别卡,几乎不能用

    2024年01月21日
    浏览(42)
  • 腾讯云音视频及融合通信技术

    随着直播、游戏、电商、VR等场景的普及,基于音视频的实时娱乐社交、3D虚拟直播、AI视频招聘、元宇宙等新场景也纷纷涌现,下面一起走进音视频的世界。 腾讯云音视频产品,从底层编解码、到传输网络、到平台架构、再到用户终端,无一不决定产品“生死”,与此同时,

    2024年02月11日
    浏览(55)
  • 【新知实验室】——腾讯云TRTC实时音视频体验

    【新知实验室】——腾讯云TRTC实时音视频体验 前言 一、腾讯实时音视频TRTC是什么? 二、DEMO体验 1.注册腾讯云账号 2.使用实时音视频(需先开通) 3.查看项目(查看密钥和快速上手操作) 4.运行快速上手项目(静态页面) 随着短视频行业的不断发展,人们对实时音视频的需

    2024年02月11日
    浏览(43)
  • 【新知实验室】TRTC腾讯实时音视频动手实验

    https://cloud.tencent.com/document/product/647/16788 应用 TRTC 通过应用的形式来管理不同的业务或项目。您可以在 TRTC 控制台 给不同的业务或项目分别创建不同的应用,从而实现业务或项目数据的隔离。每个腾讯云账号最多可以创建100个 TRTC 应用。 SDKAppID SDKAppID(应用标识/应用 ID)是腾

    2024年02月01日
    浏览(53)
  • GB28181设备接入侧如何对接外部编码后音视频数据并实现预览播放

     技术背景 我们在对接GB28181设备接入模块的时候,遇到这样的技术诉求,好多开发者期望能提供编码后(H.264/H.265、AAC/PCMA)数据对接,确保外部采集设备,比如无人机类似回调过来的数据,直接通过模块,对接到GB28181平台侧,此外,还期望不支持或者内网没有外部网络权限

    2024年02月12日
    浏览(50)
  • Android之 集成音视频通话

    一,背景 1.1 最近接收一个即时通讯二开项目,即时通讯部分用的XMPP协议,音视频则是集成的国外的开源免费库jitsi-meet-sdk-2.4.0-4.aar,是基于WebRTC的开源框架。但客户想要微信那种页面的排版,后来经研究jitsi是不能修改UI的,UI部分是用混合框架ReactNative写的,这样难度就大了

    2024年02月12日
    浏览(65)
  • 音视频开发五:visual studio集成使用FFmpeg

    ffmpeg 官网 - download - 选择Windows系统 - 选择gyan.dev版本- shared版本 在Windows系统上,Gyan.dev和BtbN都提供了FFmpeg的预编译版本。Gyan.dev通常使用MSVC编译器,而BtbN使用MinGW编译器。因此,Gyan.dev的版本可能会更符合Windows标准,而BtbN的版本可能会更加开放和跨平台。 选择 shared版本 各

    2024年02月04日
    浏览(63)
  • 声网 Agora音视频uniapp插件跑通详解

    在使用声网SDK做音视频会议开发时, 通过声网官方论坛 了解到,声网是提供uniapp插件的,只是在官方文档中不是很容易找到。 插件地址如下: Agora音视频插件 Agora音视频插件(JS) 本文讲解如何跑通演示示例

    2024年02月15日
    浏览(133)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包