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

UNIAPP接入网易云信IM

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

本例主要介绍在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);
    }
});


相关推荐

驱动网卡(怎么从新驱动网卡)
驱动网卡(怎么从新驱动网卡)

网卡一般是指为电脑主机提供有线无线网络功能的适配器。而网卡驱动指的就是电脑连接识别这些网卡型号的桥梁。网卡只有打上了网卡驱动才能正常使用。并不是说所有的网卡一插到电脑上面就能进行数据传输了,他都需要里面芯片组的驱动文件才能支持他进行数据传输...

2026-01-30 00:37 liuian

win10更新助手装系统(微软win10更新助手)

1、点击首页“系统升级”的按钮,给出弹框,告诉用户需要上传IMEI码才能使用升级服务。同时给出同意和取消按钮。华为手机助手2、点击同意,则进入到“系统升级”功能华为手机助手华为手机助手3、在检测界面,...

windows11专业版密钥最新(windows11专业版激活码永久)

 Windows11专业版的正版密钥,我们是对windows的激活所必备的工具。该密钥我们可以通过微软商城或者通过计算机的硬件供应商去购买获得。获得了windows11专业版的正版密钥后,我...

手机删过的软件恢复(手机删除过的软件怎么恢复)
手机删过的软件恢复(手机删除过的软件怎么恢复)

操作步骤:1、首先,我们需要先打开手机。然后在许多图标中找到带有[文件管理]文本的图标,然后单击“文件管理”进入页面。2、进入页面后,我们将在顶部看到一行文本:手机,最新信息,文档,视频,图片,音乐,收藏,最后是我们正在寻找的[更多],单击...

2026-01-29 23:55 liuian

一键ghost手动备份系统步骤(一键ghost 备份)

  步骤1、首先把装有一键GHOST装系统的U盘插在电脑上,然后打开电脑马上按F2或DEL键入BIOS界面,然后就选择BOOT打USDHDD模式选择好,然后按F10键保存,电脑就会马上重启。  步骤...

怎么创建局域网(怎么创建局域网打游戏)

  1、购买路由器一台。进入路由器把dhcp功能打开  2、购买一台交换机。从路由器lan端口拉出一条网线查到交换机的任意一个端口上。  3、两台以上电脑。从交换机任意端口拉出网线插到电脑上(电脑设置...

精灵驱动器官方下载(精灵驱动手机版下载)

是的。驱动精灵是一款集驱动管理和硬件检测于一体的、专业级的驱动管理和维护工具。驱动精灵为用户提供驱动备份、恢复、安装、删除、在线更新等实用功能。1、全新驱动精灵2012引擎,大幅提升硬件和驱动辨识能力...

一键还原系统步骤(一键还原系统有哪些)

1、首先需要下载安装一下Windows一键还原程序,在安装程序窗口中,点击“下一步”,弹出“用户许可协议”窗口,选择“我同意该许可协议的条款”,并点击“下一步”。  2、在弹出的“准备安装”窗口中,可...

电脑加速器哪个好(电脑加速器哪款好)

我认为pp加速器最好用,飞速土豆太懒,急速酷六根本不工作。pp加速器什么网页都加速,太任劳任怨了!以上是个人观点,具体性能请自己试。ps:我家电脑性能很好。迅游加速盒子是可以加速电脑的。因为有过之...

任何u盘都可以做启动盘吗(u盘必须做成启动盘才能装系统吗)

是的,需要注意,U盘的大小要在4G以上,最好是8G以上,因为启动盘里面需要装系统,内存小的话,不能用来安装系统。内存卡或者U盘或者移动硬盘都可以用来做启动盘安装系统。普通的U盘就可以,不过最好U盘...

u盘怎么恢复文件(u盘文件恢复的方法)

开360安全卫士,点击上面的“功能大全”。点击文件恢复然后点击“数据”下的“文件恢复”功能。选择驱动接着选择需要恢复的驱动,选择接入的U盘。点击开始扫描选好就点击中间的“开始扫描”,开始扫描U盘数据。...

系统虚拟内存太低怎么办(系统虚拟内存占用过高什么原因)

1.检查系统虚拟内存使用情况,如果发现有大量的空闲内存,可以尝试释放一些不必要的进程,以释放内存空间。2.如果系统虚拟内存使用率较高,可以尝试增加系统虚拟内存的大小,以便更多的应用程序可以使用更多...

剪贴板权限设置方法(剪贴板访问权限)
剪贴板权限设置方法(剪贴板访问权限)

1、首先打开iphone手机,触碰并按住单词或图像直到显示选择选项。2、其次,然后选取“拷贝”或“剪贴板”。3、勾选需要的“权限”,最后选择开启,即可完成苹果剪贴板权限设置。仅参考1.打开苹果手机设置按钮,点击【通用】。2.点击【键盘】,再...

2026-01-29 21:37 liuian

平板系统重装大师(平板重装win系统)

如果你的平板开不了机,但可以连接上电脑,那就能好办,楼主下载安装个平板刷机王到你的个人电脑上,然后连接你的平板,平板刷机王会自动识别你的平板,平板刷机王上有你平板的我刷机包,楼主点击下载一个,下载完成...

联想官网售后服务网点(联想官网售后服务热线)

联想3c服务中心是联想旗下的官方售后,是基于互联网O2O模式开发的全新服务平台。可以为终端用户提供多品牌手机、电脑以及其他3C类产品的维修、保养和保险服务。根据客户需求层次,联想服务针对个人及家庭客户...