Uni-App IMLib 原生插件,从连接到收发消息保姆级教程

Uni-App IMLib 原生插件,从连接到收发消息保姆级教程

1. 在 HBuilderX 新建一个项目工程

(1) 新建工程,这里以新建一个默认模版、Vue3 工程为例

(2) 获取 DCloud AppID ( uni-app应用标识 ),注意:HBuilderX 需要登录 DCloud 账号,创建项目才会默认分配标识

2. 原生插件配置

(1) 点击【插件市场】

(2) 在插件市场搜索 RCUniIMV2 ,点击进入详情,然后点击【购买】

(3) 点击RongCloud 进入融云 uni-app 插件集合,找到 RongCloud-IMWrapper-V2 融云IM原生插件包装层 点击下载并导入 HBuilderX

(4) 选择云端插件(为云打包做准备)

3. 进行云打包,按照如下图配置完毕后,点击【打包】

提示

a. 打包需要一定的时间,等打包完成,按照如下方式运行,测试打包是否正常。

b. IOS 云打包,基本跟 Android 一致,区别就是 IOS 需要您这边的证书,没有云端证书。

c. 快速安心打包,uni-app 平台有一定的限制,demo 验证可以先选择传统打包。

注意

由于uni-app IMLib 原生插件只支持App,一定使用真机进行运行

4. 编写初始化、连接、收发消息代码

(1) 初始化 ,这里在 App.vue onLaunch 生命周期中进行初始化,实际请以您业务逻辑调整初始化时机。示例代码:


<script>
	import RCIMIWEngine from "@/uni_modules/RongCloud-IMWrapper-V2/js_sdk/RCIMEngine"
	export default {
		
		globalData:{
			imEngine:null
		},
		
		async onLaunch(){
			console.log('App Launch')
			const appKey = '您的 App Key'
			const options = {}
			const engine = await RCIMIWEngine.create(appKey, options)
			this.globalData.imEngine = engine
			console.log('App 全局 imEngine =', this.globalData.imEngine)
		},
		
		onShow: function() {
			console.log('App Show')
		},
		
		onHide: function() {
			console.log('App Hide')
		}
	}
</script>

提示

a. 更多初始化(options)配置,参考文档:引擎配置 | 融云开发者文档

b. 如果您找不到对应的 App Key,登录 融云 RongCloud 开发者平台 ,参考如下图获取(注意:生产开发App Key 数据是隔离的,不互通)

(2) 连接,消息发送,消息接收参考如下代码:

<template>
	<view class="content">
			<button class="title" @click="connectIM">连接</button>
			<button class="title" @click="sendMessage">发消息</button>
			<text class="title">接收的消息为:{{msg}}</text>
	</view>
</template>

<script>
	import {RCIMIWConversationType,} from "@/uni_modules/RongCloud-IMWrapper-V2/js_sdk/RCIMDefines"
	export default {
		data() {
			return {
				imEngine:null,
				msg:'',
			}
		},
		onLoad() {
		  
		},
		onShow() {
			this.getEngine()
			/**
			 * 接收消息
			 */
			this.imEngine.setOnMessageReceivedListener((res) => {
				console.log('res =', JSON.stringify(res, null, 2))
			    this.msg = JSON.stringify(res, null, 2)
			});
		},
		methods: {
			/**
			 * 连接 IM 
			 */
         async connectIM(){
			  this.getEngine()
			  let token = 'wRRcc7tpneznfWJ8b8iAmHOsAEUbWUSplgyrA552U0I=@sdkq.cn.rongnav.com;sdkq.cn.rongcfg.com'
              let callback = {
				  
              onDatabaseOpened:(res) => {
                console.log("数据库打开")
              },
			  
              onConnected:(res) => {
              		 console.log(res)
              		 if(res.code ===0){
              		 uni.showToast({
              		     title:'连接成功',
              			 icon:"none"
              		 })
              	     }else if(res.code ===34001){
              		 uni.showToast({
              		 title:'连接已存在,不需要再李连接',
              		 icon:"none"
              		})
              	 }
              }};
              let code = await this.imEngine.connect(token, 20, callback);
		  },
		  
		  /**
		   * 发送消息
		   */
		  async sendMessage(){
			  this.getEngine()
			  let type = RCIMIWConversationType.private;
			  let targetId = '9996';
			  let channelId = '';
			  let text = '测试'
			  let message = await this.imEngine.createTextMessage(
			        type,
			        targetId,
			        channelId,
			        text,
			      );
			   let callback = {
			   onMessageSaved:(res) => {
				console.log(res)
			   },
			   onMessageSent:(res) => {
				console.log(res)
			    if(res.code ===0){
			    uni.showToast({
			        title:'消息发送成功成功',
			        icon:"none",
			    });
				}
			   }};
			   let code = await this.imEngine.sendMessage(message, callback);
		   },
		   
		   
		   /**
			* 为了防止 Vue页面修改重新挂载导致 data 里面 的imEngine 对象被清空
			* 这里只是单页面,为了方便,这么写,实际使用中,可以写成工具类获取其他
			* 比较符合您业务的方式
			*/
		   getEngine(){
			   if(!this.imEngine){
				  let app = getApp();
				  this.imEngine = app.globalData?.imEngine; 
			   }
		   },
		}
	}
</script>

<style>
	.content {
		display: flex;
		flex-direction: column;
		align-items: center;
		justify-content: center;
	}

	.logo {
		height: 200rpx;
		width: 200rpx;
		margin-top: 200rpx;
		margin-left: auto;
		margin-right: auto;
		margin-bottom: 50rpx;
	}

	.text-area {
		display: flex;
		justify-content: center;
	}

	.title {
		font-size: 36rpx;
		color: #8f8f94;
		width: 50%;
		margin-top: 90rpx;
	}
</style>

提示

a. 更多连接细节参考:连接 | 融云开发者文档

b. 更多发送消息细节参考:发送消息 | 融云开发者文档

c. 消息创建细节参考:消息介绍 | 融云开发者文档

d. 更多消息接收细节参考:接收消息 | 融云开发者文档

e. 连接 Token 快速获取参考如下图:

注意

a. 如果只是快速跑通 demo,可以按照如上方式快速获取 Token 进行验证,实际场景获取 Token 一定要在 App 服务端进行获取,App 再从应用服务端进行获取。

服务端获取 Token 参考: 注册用户 | 融云开发者文档

更多支持

如有疑问,欢迎提交工单