摘要:最近在做一款有語音直播功能的小程序,用到了環信集成功能,由于我搜了下目前用環信做小程序的的確是少之又少,而且環信官方說從月份不再更新代碼具體原因我也沒問,可能本身微信就是一款聊天工具所以用處不大我們產品需要用到聊天室功能,之前做端登錄完成之
最近在做一款有語音直播功能的小程序,用到了環信IM集成功能,由于我搜了下目前用環信做小程序的的確是少之又少,而且環信官方說從2月份不再更新代碼(具體原因我也沒問,可能本身微信就是一款聊天工具所以用處不大)
我們產品需要用到聊天室功能,之前做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); }; };
執行完login方法有一個_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);
修改環信connection.js代碼:
//登錄代碼 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; };
具體思路就是這樣,由于環信小程序代碼有很多坑,所以遇到問題多看看源碼,有些功能就需要自己去修改代碼,這是環信工單回答我的問題:
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/94404.html
摘要:基本就是一邊看文檔一邊做,不懂的,所以這個項目可能有些地方寫的不好,有時間想到了改進下項目,但是期間學習到了很多知識。 cnodejs客戶端 項目地址 https://github.com/linwh1115/... 首頁和詳情頁UI參考 https://github.com/shinygang/... API由 https://cnodejs.org/api 提供 在官方提供的AP...
摘要:容器跟虛擬化是解決不同問題的,從這一點來看與有相似之處,我認為虛擬化解決的一個重大問題是隔離和安全的問題,而容器則解決的是快速交付的問題。同時也可以應用一些虛擬化比較成熟的技術,包括容器的容器的熱遷移,現在也都具備一些初步的方案。 5月26日,數人云產品戰略發布會在北京萬達索菲特酒店舉行,發布會最后一個環節圓桌論壇可謂大咖云集,小數為大家在第一時間帶來了實錄分享,快來感受下容器生態圈的...
閱讀 1496·2023-04-26 01:28
閱讀 3315·2021-11-22 13:53
閱讀 1420·2021-09-04 16:40
閱讀 3189·2019-08-30 15:55
閱讀 2677·2019-08-30 15:54
閱讀 2489·2019-08-30 13:47
閱讀 3366·2019-08-30 11:27
閱讀 1146·2019-08-29 13:21