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

UNIAPP接入网易云信IM

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

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


相关推荐

Flutter——输入部件

上一节介绍了文本部件,用于显示文本。但是在我们进行日常软件开发过程中,经常是需要获取用户键入的内容,比如用户名、密码、性别、喜好等等。Flutter提供了丰富的部件来处理用户输入,本节将主要介绍以下...

flutter系列之:做一个图像滤镜

简介很多时候,我们需要一些特效功能,比如给图片做个滤镜什么的,如果是h5页面,那么我们可以很容易的通过css滤镜来实现这个功能。那么如果在flutter中,如果要实现这样的滤镜功能应该怎么处理呢?一起...

免费好用还高级!3个必须知道的设计网站,让你的PPT好看10倍

哈喽,大家早上好鸭~好久不见,我是三石,今天我又来进行PPT技巧分享啦~诶,这不前几天编辑部的萌萌就来找我约稿,说小叶子们对于神器网站的呼声很高,问我能不能写一篇文章汇总一下,我二话没说就答应了。常言...

flutter软件开发笔记08-容器使用方法

在Flutter3中,容器组件是用于布局、装饰或约束子组件的核心部件,能让程序更加美观,如何学习呢,能快速的应用起来,下面通过例子,来快速理解各种容器组件的使用方法。一程序界面二代码实现imp...

Tauri:下一代桌面应用开发框架?

大厂技术坚持周更精选好文本文为来自教育-智能学习-前端团队成员的文章,已授权ELab发布。智能学习前端团队自创立以来,团队专注于打破大众对教育的刻板印象,突破固有的教学思维,攻破各类...

Google移动开发平台Flutter发布 iOS和Android开发者神器

在昨晚的FlutterLive2018上,Google宣布Flutter1.0正式发布。这是一个基于Dart的移动开发平台,旨在帮助开发者在iOS和Android两个平台上...

Flutter如何内存优化

Flutter是一种流行的跨平台移动应用程序开发框架,它提供了一种高效的方式来构建美观、快速、可靠的应用程序。然而,随着应用程序规模的增加,内存管理成为了一个重要的问题。本文将探讨如何优化Flutte...

阿里卖家 Flutter for Web 工程实践

作者:马坤乐(坤吾)Flutter自2015年初次亮相以来,经过了多年的发展已经相当成熟,在阿里、美团、拼多多等互联网公司都有广泛的应用。在ICBU阿里卖家上90+%的新业务使用Flu...

Flutter——按钮

上一节介绍了输入组件,让我们了解了输入框、单选、多选、进度条等部件。为了响应用户的点击或触摸操作,就需要学习一种新的部件-按钮。Flutter中有多种类型的按钮,用于响应用户的点击或触摸操作。接下来...

Flutter vs React Native 性能测试结果

FluttervsReactNative性能测试结果:谁才是王者?大家好,我是猫哥。今天会去讲一下Flutter和ReactNative的性能比较的情况。首先说一下ReactNative猫哥...

定位Flutter内存问题很难么?

内存水位升高导致的稳定性问题严重影响app用户体验,所以开发者们非常关注Flutter的内存表现。随着Flutter业务越来越多,闲鱼也面临着oom导致的crash率提升的问题,下面我们结合项目中实际...

超详解析Flutter渲染引擎|业务想创新,不了解底层原理怎么行?

作者|万红波(远湖)出品|阿里巴巴新零售淘系技术部前言Flutter作为一个跨平台的应用框架,诞生之后,就被高度关注。它通过自绘UI,解决了之前RN和weex方案难以解决的多端一致性...

flutter软件开发笔记25-内置组件总结

以下是Flutter内置的核心UI组件分类及常用组件列表,方便你系统化学习和掌握:1.基础组件组件名说明Text显示文本,支持样式、换行和富文本(TextSpan)Icon显示Materi...

Flutter CarouselView 3.24版本的一个新组件

Flutter3.24带来了几个令人兴奋的新功能,其中最引人注目的是CarouselView小部件。这个小部件允许开发人员创建可滚动的、动态的项目列表,这些列表可以在进入和退出视图时调整大小,这对于...

详解Flutter如何用思源宋体炫出你的UI

如何实现使用思源宋体字体样式。首先,让我们来了解一下什么是资源素材管理。简单来说,它就是为了方便我们管理各种资源文件,比如图片、字体、音频等。在Flutter中,我们可以使用pubspec.yam...