一、first页面
- 初始化im,运行监听函数 app.monitorIM(im)
initIM(token){
return new Promise((resolve,reject)=>{
const im = RongIMLib.init({ appkey: 'you key',token:token,
qiniuHost: 'https://upload.qiniup.com' }); // 应用初始化以获取 RongIMLib 实例对象,请务必保证此过程只被执行一次
app.monitorIM(im)
resolve(im)
})
},
- 连接im
/**连接im */
connectIM(token) {
let im=app.globalData.im
return new Promise((resolve, reject) => {
im.connect({
token: token,
appkey: 'your key',token:token,
qiniuHost: 'https://upload.qiniup.com'
}).then(user => {
console.log('链接成功, 链接用户 id 为: ', user.id);
resolve("ok")
}).catch(error => {
console.log('链接失败: ', error.code, error.msg);
reject("err")
});
})
},
app.js页面
/**im监听函数 */
const imMessage=require("./utils/imMessage.js")
monitorIM(im) {
let that=this
// 添加事件监听
im.watch({
// 监听会话列表变更事件, 触发时机:会话状态变化(置顶、免打扰)、会话未读数变化(未读数增加、未读数清空)、会话 @ 信息、会话最后一条消息变化
conversation(event) {
// 发生变更的会话列表
const updatedConversationList = event.updatedConversationList;
console.log("app.js发生变更的会话列表:",event)
},
// 监听消息通知
message(event) {
console.log("app.js新接收到的消息内容:",event)
// 新接收到的消息内容
let message = event.message;
imMessage.$emit({
name: "message",
data: message
})
if(message.messageType=="RC:TxtMsg"){
let allNotRead=String(that.globalData.allNotRead+1)
if(allNotRead>0){
wx.setTabBarBadge({
index: 0,
text: allNotRead
})
}
}
},
// 监听 IM 连接状态变化
status(event) {
console.log("IM 连接状态变化:",event)
console.log('connection status:', event.status);
},
// 监听聊天室 KV 数据变更
chatroom(event) {
console.log("聊天室 KV 存储数据更新:",event)
/**
* 聊天室 KV 存储数据更新
* @example
* [
* {
* "key": "name",
* "value": "我是小融融",
* "timestamp": 1597591258338,
* "chatroomId": "z002",
* "type": 1 // 1: 更新( 含:修改和新增 )、2: 删除
* },
* ]
*/
const updatedEntries = event.updatedEntries
},
expansion(event) {
console.log("更新的消息拓展数据:",event)
/**
* 更新的消息拓展数据
* @example {
* expansion: { key: 'value' }, // 设置或更新的扩展值
* messageUId: 'URIT-URIT-ODMF-DURR' // 设置或更新扩展的消息 uid
* }
*/
const updatedExpansion = event.updatedExpansion;
/**
* 删除的消息拓展数据
* @example {
* deletedKeys: ['key1', 'key2'], // 设置或更新的扩展值
* messageUId: 'URIT-URIT-ODMF-DURR' // 设置或更新扩展的消息 uid
* }
*/
const deletedExpansion = event.deletedExpansion;
}
});
},
imMessage.js
全局监听,进行分发消息,在开放社区找到的一位大佬写的全局监听,可以直接使用
var event = {};
//接收消息 传入params={name:"string 监听事件名",success:"function 监听事件回调",tg:"当前页面或App.js 传入this即可"}
const $on = function(params) {
if (!params) {
return false;
}
if (!params.name) {
console.error("事件监听未设置名称 属性key=name");
return false;
}
if (!params.success) {
console.error("事件监听未设置回调函数 属性key=success");
return false;
}
if (!params.tg) {
console.error("事件监听未设置目标对象 属性key=tg");
return false;
}
if (event[params.name]) {
var list = event[params.name];
list.push([params.tg, params.success]);
} else {
event[params.name] = [
[params.tg, params.success]
];
}
pageStatus(params.tg);
}
const $emit = function(params) {
if (!params) {
return false;
}
if (!params.name) {
console.error("事件发送未设置名称 属性key=name");
return false;
}
if (event[params.name]) {
var list = event[params.name];
list.forEach(item => {
item[1].call(item[0], params.data);
})
}
}
const $remove = function(params) {
if (!params) {
return false;
}
if (!params.tg) {
console.error("事件监听未设置目标对象 属性key=tg");
return false;
}
if (params.name && event[params.name]) {
console.log("手动卸载,监听移除1")
event[params.name] = event[params.name].filter(a => {
return a[0] != params.tg;
})
} else {
console.log("页面卸载,监听移除2")
// return false
for (let key in event) {
event[key] = event[key].filter(a => {
return a[0] != params.tg;
})
}
}
}
const pageStatus = function(self) {
if (self["onUnload"]) {
var s = self["onUnload"];
self["onUnload"] = function(a) {
s.call(this, a);
$remove({
tg: this
});
}
} else {
self["onUnload"] = function() {
$remove({
tg: this
});
}
}
}
exports.$on = $on;
exports.$emit = $emit;
exports.$remove = $remove;
使用
例如在index页面需要监听融云传来的消息,就可以进行后续自定义的逻辑了
imMessage.$on({
name: "message",
tg: this,
success: (res) => {
console.log("index页面收到消息了", res);
}
})