Récemment, je réalise un petit programme avec fonction de diffusion vocale en direct, et j'utilise la fonction d'intégration Huanxin IM
Il y a en effet très peu de personnes qui utilisent Huanxin pour créer de petits programmes. Il y en a peu, et Huanxin a officiellement déclaré qu'il ne mettrait plus à jour le code à partir de février (je n'ai pas demandé la raison précise, peut-être que WeChat lui-même est un outil de chat, donc il n'est pas très utile)
Notre produit doit utilisez la fonction de salon de discussion, et nous faisions H5. Une fois la connexion du client terminée, vous pouvez rejoindre le salon de discussion :
WebIM.conn.open(options); WebIM.conn.joinChatRoom(option1);
La même méthode ne fonctionne pas sur le mini programme, et il continue de signaler une erreur :
Cannot read property 'sendIQ' of undefined
Baidu a recherché et a déclaré que rejoindre le salon de discussion devait être placé dans le rappel après une connexion réussie, j'ai donc vérifié son code source connection.js trouvé :
connection.prototype.open = function (options) { var pass = _validCheck(options, this); if (!pass) { return; } var conn = this; if (conn.isOpening() || conn.isOpened()) { return; } if (options.accessToken) { options.access_token = options.accessToken; _login(options, conn); } else { //登录成功的回调函数 var suc = function (data, xhr, myName) { conn.context.status = _code.STATUS_DOLOGIN_IM; conn.context.restTokenData = data; if (data.statusCode != '404' && data.statusCode != '400') { wx.showToast({ title: '登录成功', icon: 'none', duration: 4000 }); } //回调成功后执行这个方法 _login(data.data, conn); }; var options = { url: apiUrl + '/' + orgName + '/' + appName + '/token', data: loginfo, success: suc || _utils.emptyfn, error: error || _utils.emptyfn }; _utils.ajax(options); }
Il existe un rappel interne pour une connexion réussie, et un _login(data.data, conn) est appelée dans le rappel : //具体里面执行什么去源代码查看,我就不贴代码了
var _login = function (options, conn) {
var callback = function (status, msg) {
_loginCallback(status, msg, conn);
};
};
var _loginCallback = function (status, msg, conn) { var conflict, error; //console.log('_loginCallback 1', Strophe.Status, status, msg) if (msg === 'conflict') { conflict = true; } console.log(status) if (status == Strophe.Status.CONNFAIL) { } else if (status == Strophe.Status.ATTACHED || status == Strophe.Status.CONNECTED) { //登录成功 } else if (status == Strophe.Status.DISCONNECTING) { } else if (status == Strophe.Status.DISCONNECTED) { } else if (status == Strophe.Status.AUTHFAIL) { } else if (status == Strophe.Status.ERROR) { } conn.context.status_now = status; };
En l'interrompant, j'ai découvert que lorsque l'exécution atteint
else if (status == Strophe.Status.ATTACHED || status == Strophe.Status.CONNECTED), la connexion est réussie. Par conséquent, le rappel pour rejoindre le salon de discussion doit être placé dans ce jugement. I La méthode spécifique est la suivante :
//项目中封装一个加入聊天室函数 joinRoom: function () { var option1 = {}; var option2 = {}; //加入聊天室 WebIM.conn.joinChatRoom(option1); WebIM.conn.joinChatRoom(option2); }; //在环信登录函数中添加一个自己的回调: var options = { apiUrl: WebIM.config.apiURL, user: userId + '', pwd: userId + '', grant_type: "password", appKey: WebIM.config.appkey, //自己添加的回调函数 callBack:function(){ //调用加入聊天室 that.joinRoom(); } }; WebIM.conn.open(options);
Modifiez la connexion Huanxin.js. code :
//登录代码 connection.prototype.open = function (options) { var suc = function (data, xhr, myName) { //callBack传入加入聊天室回调 _login(data.data, conn, options.callBack); }; var options = { url: apiUrl + '/' + orgName + '/' + appName + '/token', data: loginfo, success: suc || _utils.emptyfn, //添加加入聊天室的回调函数 callBack: options.callBack, error: error || _utils.emptyfn }; } }; //_login代码 var _login = function (options, conn, callBack) { var callback = function (status, msg) { //把加入聊天室函数传给_login回调函数 _loginCallback(status, msg, conn, callBack); }; }; //_loginCallback代码 var _loginCallback = function (status, msg, conn,callBack) { var conflict, error; //console.log('_loginCallback 1', Strophe.Status, status, msg) if (msg === 'conflict') { conflict = true; } console.log(status) if (status == Strophe.Status.CONNFAIL) { } else if (status == Strophe.Status.ATTACHED || status == Strophe.Status.CONNECTED) { //登录成功执行加入聊天室 callBack(); } else if (status == Strophe.Status.DISCONNECTING) { } else if (status == Strophe.Status.DISCONNECTED) { } else if (status == Strophe.Status.AUTHFAIL) { } else if (status == Strophe.Status.ERROR) { } conn.context.status_now = status; };