百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT知识 > 正文

UNIAPP接入网易云信IM

liuian 2025-01-17 12:18 45 浏览

本例主要介绍在uniapp中使用网易云信IM聊天教程,使用其他IM的可以参考,在对接云信IM聊天的过程中,以下几点请注意:

  1. IM聊天历史聊天记录查询是以时间段为查询条件
  2. 初始化聊天时,离线消息优先级要高于漫游消息
  3. 多端登录和多账号切换建议谨慎处理

使用示例:

一、下载SDK ,其它端可根据需要选择

NIM_Web_NIM_weixin_v6.9.0.js


NIM_Web_Netcall_weixin_v6.8.0.js(音视频SDK暂不需要)

(微信小程序SDK)

二、创建目录

我的存放位置

components>NIM



config>index,js

// IM 初始化配置
export let config = {
    debug: false,
    appKey: '',//配置自己的appKey
};

controller>im.js

//引入配置文件
import NetcallWeixin from '../sdk/NIM_Web_Netcall_weixin_v6.8.0.js'
import NIM from '../sdk/NIM_Web_NIM_weixin_v6.8.0.js'
import store from '@/store/index.js'
import { config } from '../config/index.js'
//创建IM实例
// im实例
class IMController {
    constructor(props) {
        let nim = NIM.getInstance({
            promise: true,
            transports: ['websocket'],
            syncSessionUnread: true, // 同步未读数
            syncFriends: false, // 是否同步好友列表
            autoMarkRead: false,
            ...nimConfig,
            ...props,
            onconnect: this.onConnect,
            onwillreconnect: this.onWillReconnect,
            ondisconnect: this.onDisConnect,
            onerror: this.onError,
            onloginportschange: this.onLoginPortsChange,
            //onsessions: this.onSessions,
            onupdatesession: this.onUpdateSession,
            onmsg: this.onMsg,
            onroamingmsgs: this.onRoamingMsgs // 漫游消息
            onsyncdone:this.onSyncDone, //同步消息完成
        })
        store.commit('setNim', nim)
    }
    // 连接成功
    onConnect(data) {
        const { nim } = store.state.nim
    }
    // 即将重连的回调
    onWillReconnect(data) {
        console.log('即将重连的回调 ===>  ', data)
    }
    // 断开连接后的回调
    onDisConnect(data) {
        console.log('断开连接后的回调 ===>  ', data)
        switch (data.code) {
            case 'kicked':
                console.log('您的账号在别的地方登陆, 是否重新登陆')
                break;
            case '':
                break;
            default:
                break;
        }
    }
    // 发生错误的回调
    onError(error) {
        console.log('发生错误的回调 ===>  ', error)
    }
    // 多端登录状态变化的回调
    onLoginPortsChange(data) {
        console.log('多端登录状态变化的回调 ===>  ', data)
    }
    // 同步最近会话列表回调
    onSessions(data) {
        console.log('同步最近会话列表回调 ===>  ', data)
        if(Object.keys(store.state.nim.rawMessageList).length == 0){
            let list = {
                to:data[0].to,
                msgs:[],
            };
            data.map(item =>{
                list.msgs.push(item.msgs)
            })
        }else{
            data.map(item => {
                item.lastMsg.cntype = 1
                store.commit('addMsgsItem', item.lastMsg)
            })
        }
    }
    // 更新会话的回调
    onUpdateSession(data) {}
    // 同步离线消息的回调
    onofflinemsgs(data) {
        console.log('同步离线消息的回调 ===>  ', data)
        store.commit('addOfflinemsgs', data)
    }
    // 漫游消息
    onRoamingMsgs(data) {
        console.log('漫游消息', data)
        store.commit('addRoamingMsgs', data);
    }
    // 收到消息的回调
    onMsg(data) {
        console.log(data,'00000')
        data.cntype = 2
        store.commit('addMsgsItem', data)
    }
    onSyncDone(){
        console.log('同步完成,跳转聊天界面')
        uni.navigateTo({
            url:'/pages/doctor/chat/chat',
        })
    }
export default IMController

sdk(sdk存放位置)

store>nim>index.js (供参考)

export default {
  state: {
    isInit:‘’,
    nim: {},
    messageList: [], // 所有的聊天,
    nmsgs:[],//初始化后的所有聊天
  },
  getters: {},
  actions: {},
  mutations: {
    // 设置Nim实例
    setNim: function(state, value) {
      state.nim = value
    },
    //添加离线消息
    addOfflinemsgs:function(state,props){
        props.msgs.map(item=>{
            state.messageList.push(item)
        })
    },
    //添加漫游消息
    addRoamingMsgs:function(state,props){
        props.msgs.map(item=>{
            state.messageList.push(item)
        })
    },
    //添加消息
    addMsgsItem:function(state,msg){
        state.messageList.push(msg)
    },
  },
}

初始化聊天

在需要的位置添加(App.vue OnLaunch() 或者在切换账号的位置添加)
_init(account){
    this.$store.state.nim.nmsgs = []; //清空消息记录
    uni.showLoading({
        title:'正在初始化聊天,请稍等',
        icon:'none',
    })
    //此处需要请求后台接口初始化聊天信息
    let data = responseData; //假设data为接口返回信息,具体可参考云信官方文档,此处主要获取accid和token
    // 初始化im聊天
    new IMController({
        account: data.accid,
        token: data.token
    });
    this.$store.state.nim.isInit = account // 保存聊天初始化情况
},

聊天界面,可以使用插件市场上的聊天组件也可以选择自己封装一套

如果使用scroll-view处理聊天内容,web界面下不会自动向上滚动,小程序和app没问题

初始化时动态设置聊天窗口大小

const res = uni.getSystemInfoSync();
this.style.pageHeight = res.windowHeight;
this.style.contentViewHeight = res.windowHeight - res.screenWidth / 750 * (100);

自动化滚动到底部代码

// 滚动至聊天底部
scrollToBottom() {
    let that = this
    let query = uni.createSelectorQuery()
    query.select('#scrollview').boundingClientRect()
    query.select('#content').boundingClientRect() //聊天组件外部框
    query.exec((res) => {
        console.log(res)
        if(res[0] !=null && res[1] !=null){
        that.scrollTop = res[1].height
        }
    })
},

如果使用第三方,可以直接跳过

聊天消息信息渲染(根据不同的type类型渲染聊天界面,参考消息发送)

computed: {
    ...mapState({ messageList:state => state.nim.messageList })
},
watch:{
    messageList: function(val,nval){
        let len = this.messageList.length;
        if(this.messageList[len-1].type == 'custom'){
            this.messageList[len-1].content = JSON.parse(this.messageList[len-1].content)
        }
        this.msgs.push(this.messageList[len-1])
        this.scrollToBottom()
    },
},
onLoad(){
    let messageList = this.messageList;
    let mmsgs = this.mmsgs;
    for(let i in messageList){
        if(messageList[i].from == this.account){
            mmsgs.push(messageList[i])
        }
    }
    console.log('初始化后的消息',mmsgs)
    //合并消息
    this.scrollToBottom()//数据加载完成之后滚动到底部
}

消息收发(建议参考官方文档)

//获取历史消息
nim.getHistoryMsgs({
    to:self.account,
    scene: 'p2p',
    beginTime:start, //开始时间
    endTime:end,//结束时间
    reverse: true,
    done: (err, list) => {
        if(list.msgs.length>0){
            let data = list.msgs.reverse();
            self.hmsgs = data
        }
    }
})
//文字消息
nim.sendText({
    scene: 'p2p',
    to: account,
    text: text,
    isHistoryable:true,
    done: (err, msg) => {
        _this.$store.commit('addMsgsItem', msg);//添加消息
        _this.text = '';
    }
})
//图片消息
nim.sendFile({
    type: 'image',
    scene:'p2p',
    to: account,
    filePath:tempFilePaths[i],
    //wxFilePath: tempFilePaths[i],
    done: (err, msg) => {
        self.$store.commit('addMsgsItem', msg);
    }
})
//音频消息
nim.sendFile({
    scene: 'p2p',
    to: account,
    type: 'audio',
    filePath:res.tempFilePath,
    //blob:res.tempFilePath,
    //wxFilePath: res.tempFilePath,
    done: (err,msg) => {
        self.$store.commit('addMsgsItem', msg);
    }
});
//自定义
nim.sendCustomMsg({
    scene: 'p2p',
    to: account,
    content: JSON.stringify('测试'),
    done: (err, msg) => {
        self.$store.commit('addMsgsItem', msg);
    }
});


相关推荐

怎么返回原来的系统(华为手机怎么退出鸿蒙系统)

1,首先,打开Windows7系统,在“计算机”的右键菜单中选择【控制面板】,点击进入。2,在【控制面板】中点击【备份和还原】。3,在窗口中选择【恢复系统或计算机】。4,在窗口中选择【打开系统还原】。...

126邮箱登录入口手机登陆(126邮箱登录登录)
126邮箱登录入口手机登陆(126邮箱登录登录)

126邮箱登录入口手机版:打开网址输入www.126.com.126邮箱是网易的一个免费邮箱登录入口在浏览器输入:mail.126.com浏览器进入126邮箱网站之后,即可自行登录126邮箱账号。126邮箱是网易的一个免费邮箱登录入口在浏...

2025-12-20 03:55 liuian

win10打印机无法共享(win10打印机不能共享的原因)

Win10打印机无法共享的解决办法:1、按下“Win+x”组合键或在开始菜单单击右键,在打开的菜单中点击“控制面板”;2、将查看方式修改为“大图标”,点击“设备和打印机”;3、在共享的打印机上单击右键...

电脑总是弹出usb无法识别(电脑总是弹出usb无法识别网络)
  • 电脑总是弹出usb无法识别(电脑总是弹出usb无法识别网络)
  • 电脑总是弹出usb无法识别(电脑总是弹出usb无法识别网络)
  • 电脑总是弹出usb无法识别(电脑总是弹出usb无法识别网络)
  • 电脑总是弹出usb无法识别(电脑总是弹出usb无法识别网络)
进入三星官网(三星官网首页登录界面)

找一找我自己的输入密码,就可以登录官网去了。三星云端的官网登录入口为https://support.samsungcloud.com/登陆三星帐户后可查看三星云使用情况及三星云中的照片和文档等信息,选...

光速虚拟机怎么用(光速虚拟机怎么用流量使用)

部落冲突光速虚拟机是一款可以加速部落冲突游戏运行的工具。使用方法很简单,首先需要下载并安装光速虚拟机软件,然后打开软件并登录你的部落冲突账号。接下来,在光速虚拟机内部运行部落冲突游戏,就可以享受到游戏...

以太网无法连接到internet怎么解决
以太网无法连接到internet怎么解决

以太网不能连接到internet连接的原因,有可能是路由器的外网连接不通或者当前的主机无法获取有效IP地址导致的。这个时候需要具体问题具体分析,如果是前者的话,那么我们需要进入路由器中配置WAN上网条件。如果配置好了以后还是上不了网的话,那...

2025-12-20 01:05 liuian

cad注册表怎么彻底删除(cad2019注册表怎么彻底删除)

注:在操作注册表之前,请先备份注册表,以免操作失误造成系统故障,另外,本文中使用的操作方法适用于Windows操作系统。以下是详细的删除cad在注册表中的操作步骤:1.打开“运行”窗口,可以通过快...

内存不够用了怎么办(内存不够用了怎么办手机)

我们的手机在使用过程中,会产生各种各样的垃圾和缓存文件,这些东西占据了很大的内存空间,所以我们平时需要定期清理这些垃圾文件。安卓的手机基本都自带手机管家类型的APP,我们可以利用这类APP实现清理垃圾...

联想电脑怎么连接wifi(联想电脑怎么连接wifi步骤台式)
  • 联想电脑怎么连接wifi(联想电脑怎么连接wifi步骤台式)
  • 联想电脑怎么连接wifi(联想电脑怎么连接wifi步骤台式)
  • 联想电脑怎么连接wifi(联想电脑怎么连接wifi步骤台式)
  • 联想电脑怎么连接wifi(联想电脑怎么连接wifi步骤台式)
三星官方固件下载地址(三星官方固件下载网站)

请您参考:1.通过手机中“三星应用商店”或“Galaxy特色订制”搜索需要的软件并下载安装。2.通过手机浏览器搜索需要的软件下载安装(若是自带的浏览器,下载的安装包保存在我的文件-Download文件...

win10企业版和专业版有什么区别哪个好

就性能而言,Windows10企业版比专业版好。1.企业版的更新频率比专业版少,可以降低更新所需要的可用时间。2.如果你是企业,在管理、保护数据安全、部署和集中管理设备方面,企业版会比专业版更具优势...

51重装系统后怎么恢复原来的系统

方法/步骤分步阅读1/5在开始菜单中打开控制面板,打开控制面板之后,选择:备份和还原选项。2/5点击:打开系统还原,如果有账户控制则会有所提示,通过即可。3/5然后会开始还原文件和设置的向导,你只需要...

可能没有权限使用网络资源(可能没有权限使用网络资源 win10)

右击“我的电脑”→“属性”→“计算机名”,看该选项卡中有没有出现你的局域网工作组名称,如“workgroup”等。然后单击“网络ID”按钮,开始“网络标识向导”:单击“下一步”,选择“本机是商业网络...

怎么查看宽带账号和密码(怎么查宽带帐号和密码)
怎么查看宽带账号和密码(怎么查宽带帐号和密码)

宽带账号密码要记牢,重要的账号密码要记小本本上!下面我来具体讲讲获取方法。1.查看发票、合同、官方小卡片是否标明。以我们这个城市为例,发票上的用户号码就是宽带账号。047403100006就是宽带账号,密码是123456,密码错误就是身份证...

2025-12-19 21:05 liuian