최근 음성 라이브 방송 기능이 있는 작은 프로그램을 만들고 있는데, 검색해 보니 환신 IM 통합 기능을 사용하고 있는데, 실제로 환신을 사용해 작은 프로그램을 만드는 사람이 거의 없습니다. 거의 없고, Huanxin은 2월부터 더 이상 코드를 업데이트하지 않을 것이라고 공식적으로 밝혔습니다(구체적인 이유는 묻지 않았습니다. WeChat 자체가 채팅 도구이므로 별로 유용하지 않을 수도 있습니다)
저희 제품은 채팅방 기능을 이용했는데 H5 클라이언트 로그인이 완료되면 채팅방에 들어갈 수 있습니다:
WebIM.conn.open(options); WebIM.conn.joinChatRoom(option1);
미니 프로그램에서는 같은 방법이 작동하지 않고 계속 오류가 발생합니다:
Cannot read property 'sendIQ' of undefined
바이두에서 검색해보니 채팅방 참여는 로그인 성공 후 콜백에 들어가야 한다고 해서 소스코드를 확인해 보니 Connection.js에서
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); }
로그인 성공을 위한 내부 콜백이 있고 _login(data.data, conn) 메소드가 콜백에서 호출됩니다.
//具体里面执行什么去源代码查看,我就不贴代码了 var _login = function (options, conn) { var callback = function (status, msg) { _loginCallback(status, msg, conn); }; };
로그인 메소드를 실행한 후 _loginCallback 콜백이 있습니다.
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; };
중단하여 실행이 else에 도달하면 if (status == Strophe.Status.ATTACHED || status == Strophe.Status.CONNECTED) 로그인 성공이므로 채팅방 참여를 위한 콜백을 이 판단에 넣어야 합니다. 구체적인 방법은 다음과 같습니다.
//项目中封装一个加入聊天室函数 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);
Huanxin Connection.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; };
구체적인 아이디어는 Huanxin 애플릿 코드에 함정이 많기 때문에 문제가 발생하면 소스 코드를 더 살펴보세요. 일부 기능은 직접 수정해야 합니다. 이것이 Huanxin 작업 순서입니다. 내 질문에 답해 주세요: