本篇文章借鉴了一些资料,然后在这个基础上,我将环信的实现全部都集成在一个组件里面进行实现;

https://blog.csdn.net/github_35631540/article/details/80278114

第一步,获取 webim.config.js

1. 下载地址 http://www.easemob.com/download/im,然后点击如下图的位置进行下载

解压后将 webim.config.js 拷贝到自己的文件夹下面(我这儿放的位置是src->assets->lib->webim下面),由于easemob-websdk strophe.js,我们都可以通过 npm 安装的形式完成,所以就不需要再引入了。



2. 在 webim.config.js 中修改部分代码







这儿的 appkey 是根据实际情况进行修改的。

第二步,下载easemob-websdk、strophe.js

1. 通过 npm 进行安装,注意:这儿的版本很重要,最好就用下面的版本;

 ```
npm i easemob-websdk strophe.js --save
```

版本:

"easemob-websdk": "1.8.3", "strophe.js": "1.2.16"

2. 修改 /node_modules/strophe.js/strophe.js

代码如下(注意如果有同学直接搜索reset进行快速搜索的话,要找到第二个reset,不是第一个reset)

    setJid: function (jid) {
this.jid = jid;
this.authzid = Strophe.getBareJidFromJid(this.jid);
this.authcid = Strophe.getNodeFromJid(this.jid);
},
getJid: function () {
return this.jid;
},

3. 修改 /node_modules/easemob-websdk/src/connection.js

代码如下

    var Strophe = require('strophe.js').Strophe;
var meStrophe = require('strophe.js');
$iq = meStrophe.$iq;
$build = meStrophe.$build;
$msg = meStrophe.$msg;
$pres = meStrophe.$pres;

第三步,在组件里面进行使用

1. 设置基本信息

let WebIM = require('easemob-websdk');

const conn = new WebIM.connection({
isMultiLoginSessions: WebIM.config.isMultiLoginSessions,
https: typeof WebIM.config.https === 'boolean' ? WebIM.config.https : location.protocol === 'https:',
url: WebIM.config.xmppURL,
heartBeatWait: WebIM.config.heartBeatWait,
autoReconnectNumMax: WebIM.config.autoReconnectNumMax,
autoReconnectInterval: WebIM.config.autoReconnectInterval,
apiUrl: WebIM.config.apiURL,
isAutoLogin: true
}) const options = {
apiUrl: WebIM.config.apiURL,
user: '1',
pwd: 'xiuxiutrip123456', // 待会会进行覆盖
appKey: WebIM.config.appkey,
success:function (re) {
console.log('登陆成功')
},
error:function (err) {
alert(err)
}
}

2. 在 data() 里面进行初始化

  data () {
return {
$imconn: {},
$imoption: {}
}
},

3. 在created里面对 $imconn、$imoption 进行赋值,然后进行登录

  created () {
this.$imconn = conn;
this.$imoption = options;
this.loginWebIM();
},

4. 登录并监听

    loginWebIM () {
// 这儿是测试用的账号和密码,这个账号密码是通过环信后台生成的
this.$imoption.user = '13880283427';
this.$imoption.pwd = '123456'; this.$imconn.open(this.$imoption);
let _this = this;
this.$imconn.listen({
    onOpened: function (message) {
console.log('用户已上线')
_this.getGroupOfWebIM();
// 由于我们用的是聊天室,所以登录成功后必须加入聊天室
_this.joinRoom();
},
onClosed: function (message) {
console.log('用户已下线')
},
onEmojiMessage: function (message) {
console.log('这儿接收到了表情')
},
onPictureMessage: function (message) {
console.log('这儿接收到了图片')
},
onTextMessage: function (message) {
// 每次接收信息都会在这儿监听到
console.log('这儿接收到了文本信息');
console.log(message)
},
onPresence: function ( message ) {
// 加入聊调室后,这儿会被执行
console.log('这儿是监听聊天室')
_this.handlePresence(message)
}
})
},

5. 加入聊调室

    handlePresence (e) {
// 官网给出的例子是
e.type == 'joinChatRoomSuccess' // 加入成功
e.type == 'joinChatRoomFailed' // 加入失败
e.type == 'deleteGroupChat' // 聊天室被删除
// 但是实际操作的时候,不管有没得聊天室id,都能返回joinChatRoomSuccess
// 所以实际判断的时候,如果加入聊天室失败,会返回一个error的属性,所有正确的判断应该是
if (e.error) {
console.log('加入失败')
} else {
console.log('加入成功')
}
},
joinRoom () {
// 加入聊天室
this.$imconn.joinChatRoom({
roomId: this.roomId // 聊天室id
});
},
closeWebIM () {
// 退出聊天室,每次离开聊天室的时候一定要退出聊天室
this.$imconn.quitChatRoom({
roomId: this.roomId // 聊天室id
});
this.$imconn.close(); // 如果是退出登录,那么这一句必须要,否则会出现,第一次可以登录,第二次登录掉线或者无法登陆的情况
},



上面是有人离开聊调室的返回信息,下面是有人进来的返回信息

6. 发送信息

handleReply () {
// 这儿必须通过接口获取roomId
let sendText = this.description;
// 将请求框置空
this.description = ''; var id = this.$imconn.getUniqueId(); // 生成本地消息id
var msg = new WebIM.message('txt', id); // 创建文本消息
let _this = this; var option = {
msg: sendText, // 这儿是发送的消息内容
to: '63099105247233', // 接收消息对象(聊天室id) this.roomId
roomType: true,
chatType: 'chatRoom',
// 这儿的ext是自定义属性,安卓端可以根据这个属性获取信息,以name、age为例(与安卓商量着来)
ext: {name:'', age: ''},
success: function () {
console.log('send room text success');
},
fail: function () {
console.log('failed');
this.$message.error('信息发送失败');
}
};
msg.set(option);
msg.setGroup('groupchat');
this.$imconn.send(msg.body);
},

注意事项

1. 有时候环形的登录会出现问题,那么有必要在登录失败的时候重新进行登录

// 这时候可以将conn的定义放到data里面,option的定义通过方法获取,当登录失败的时候,就可以调用重新登录的方法
{
data () {
return {
conn: new WebIM.connection({
isMultiLoginSessions: WebIM.config.isMultiLoginSessions,
https: typeof WebIM.config.https === 'boolean' ? WebIM.config.https : location.protocol === 'https:',
url: WebIM.config.xmppURL,
heartBeatWait: WebIM.config.heartBeatWait,
autoReconnectNumMax: WebIM.config.autoReconnectNumMax,
autoReconnectInterval: WebIM.config.autoReconnectInterval,
apiUrl: WebIM.config.apiURL,
isAutoLogin: true
}),
}
}
methods: {
getOptions () {
let _this = this;
return {
apiUrl: WebIM.config.apiURL,
user: '',
pwd: '',
appKey: WebIM.config.appkey,
success:function (res) {
console.log('这儿是this', _this)
// console.log('登陆成功')
},
error:function (err) {
console.log(err)
console.log('这儿重新登录', _this);
_this.loginWebIM();
}
}
},
}
}

2. 此时 created() 钩子函数里面就可以修改为

this.$imconn = this.conn;
this.$imoption = this.getOptions();

3. 另外还有一个地方可以修改

    ...
let _this = this;
this.$imconn.listen({
onClosed: function (message) {
console.log('用户已下线')
// 如果是在聊天页面
if (...) {
console.log('这儿重新进行登录');
_this.loginWebIM();
}
},
...
})

最新文章

  1. PHP常用函数总结
  2. Nodejs事件引擎libuv源码剖析之:高效线程池(threadpool)的实现
  3. [python实现设计模式]-2.模板方法模式---把大象关进冰箱.
  4. bootstrap制作搜索框及添加回车搜索事件
  5. Hadoop入门经典:WordCount
  6. java 选择排序法
  7. 知识面 z
  8. CSS3中的选择器
  9. log4cxx第三篇----使用多个logger
  10. 关于以base64编码形式上传图片
  11. python 获取列表中次大的数值.
  12. 洛谷P1057传球游戏题解
  13. linux 用户登陆信息查询
  14. bimgotoblock-BIM要上区块链
  15. IO模型--阻塞IO,非阻塞IO,IO多路复用,异步IO
  16. folly无锁队列,尝试添加新的函数(续)
  17. Expressions入门示例
  18. C#6.0语言规范(十一) 结构
  19. Sleeping会话导致阻塞原理(上)
  20. Excel编程的基本概念

热门文章

  1. 关于vsphere exsi安装时遇到的问题
  2. 保护Laravel .env文件,防止直接访问
  3. h5 app 设置全屏
  4. springcloud -zuul(1-zuul的简单使用)
  5. vue在v-for循环中绑定v-model
  6. cookie中文转码
  7. JavaWeb学习篇之----自定义标签&&JSTL标签库详解
  8. 优化剪枝搜索——牛客多校第二场F
  9. 动态隐藏显示窗口的标题栏(同时保持窗口的sizeable性能
  10. NX二次开发-更改图纸尺寸内容(编辑文本)uc5566