微信小程序使用騰訊雲IM
新項目已經完成很久啦,久的我都想放棄啦。
這個項目裏主要的難點其實是1v1聊天。他們對比了好幾家的即時通訊,最後選擇了騰訊雲通信。我猜,可能是因爲騰訊雲上說日活低於10w可以不付費吧。省錢嘛~踩坑踩了大概一週多兩週了,就把一些步驟寫下來,萬一以後也會用到呢。不過,騰訊雲的demo和sdk真的是萬年不更新了,真的是好難用啊....坑都是自己一個一個踩一個一個填的。
1.下載sdk並且引用至項目
在官網中找到自己所需要的sdk並且下載,然後放在自己的項目中,引用進去。
var webim = require('../../utils/webim.js');
在將sdk文件引用到項目中後,就可以開始使用了,首先是登陸。登陸分爲獨立模式和託管模式,託管模式還需要引用額外的文件。不過,由於我們的項目只用到了獨立模式,所以我也只有從獨立模式寫起。
2.登陸
登陸需要用到的方法是 webim.login
webim.login(loginInfo,listener,options,cbOk,cbErr);//第一個是登陸信息,第二個是事件回調,第三個其他對象,後面兩個就是成功回調和錯誤回調
//用戶信息對象
var loginInfo = {
'sdkAppID':xxxxxxx,//用戶標識接入SDK的應用ID,必填。(這個可以在騰訊雲的後臺管理看到)
'appIDAt3rd':xxxxxxx,//App 用戶使用 OAuth 授權體系分配的 Appid,必填 (這個其實和上面那個是一樣的)
'identifier':yang47,//用戶帳號,必填 (這個就是自己服務器裏,每個用戶的賬號,可以自己設置)
'identifierNick':"楊小花",//用戶暱稱,選填 (這個填不填都沒什麼問題,但是我個人覺得,聊天嘛,還是得有一個網名)
'accountType':12345,//賬號類型,必填 (這個可以在後臺管理看到,但是騰訊的文檔上是沒有這個的!!!但是這個必須填,不填不報錯)
'userSig':xxxxxxx //鑑權 Token,identifier 不爲空時,必填 我覺得這個也是必填的,這個需要在一開始就獲取。
}
//事件回調對象 監聽事件
var listeners = {
"onConnNotify": onConnNotify//監聽連接狀態回調變化事件,必填
,"jsonpCallback": jsonpCallback//IE9(含)以下瀏覽器用到的 jsonp 回調函數,
,"onMsgNotify": onMsgNotify//監聽新消息(私聊,普通羣(非直播聊天室)消息,全員推送消息)事件,必填
,"onBigGroupMsgNotify": onBigGroupMsgNotify//監聽新消息(直播聊天室)事件,直播場景下必填
,"onGroupSystemNotifys": onGroupSystemNotifys//監聽(多終端同步)羣系統消息事件,如果不需要監聽,可不填
,"onGroupInfoChangeNotify": onGroupInfoChangeNotify//監聽羣資料變化事件,選填
,"onFriendSystemNotifys": onFriendSystemNotifys//監聽好友系統通知事件,選填
,"onProfileSystemNotifys": onProfileSystemNotifys//監聽資料系統(自己或好友)通知事件,選填
,"onKickedEventCall" : onKickedEventCall//被其他登錄實例踢下線
,"onC2cEventNotifys": onC2cEventNotifys//監聽 C2C 系統消息通道
};
//1v1單聊的話,一般只需要 'onConnNotify' 和 'onMsgNotify'就行了。
//監聽連接狀態回調變化事件
var onConnNotify = function (resp) {
var info;
switch (resp.ErrorCode) {//鏈接狀態碼
case webim.CONNECTION_STATUS.ON:
webim.Log.warn('建立連接成功: ' + resp.ErrorInfo);
break;
case webim.CONNECTION_STATUS.OFF:
info = '連接已斷開,無法收到新消息,請檢查下您的網絡是否正常: ' + resp.ErrorInfo;
alert(info);
webim.Log.warn(info);
break;
case webim.CONNECTION_STATUS.RECONNECT:
info = '連接狀態恢復正常: ' + resp.ErrorInfo;
alert(info);
webim.Log.warn(info);
break;
default:
webim.Log.error('未知連接狀態: =' + resp.ErrorInfo); //錯誤信息
break;
}
};
//監聽新消息事件 注:其中參數 newMsgList 爲 webim.Msg 數組,即 [webim.Msg]。
//newMsgList 爲新消息數組,結構爲[Msg]
function onMsgNotify(newMsgList) {
//console.warn(newMsgList);
var sess, newMsg;
//獲取所有聊天會話
var sessMap = webim.MsgStore.sessMap();
for (var j in newMsgList) {//遍歷新消息
newMsg = newMsgList[j];
if (newMsg.getSession().id() == selToID) {//爲當前聊天對象的消息
selSess = newMsg.getSession();
//在聊天窗體中新增一條消息
//console.warn(newMsg);
addMsg(newMsg);
}
}
//消息已讀上報,以及設置會話自動已讀標記
webim.setAutoRead(selSess, true, true);
for (var i in sessMap) {
sess = sessMap[i];
if (selToID != sess.id()) {//更新其他聊天對象的未讀消息數
updateSessDiv(sess.type(), sess.id(), sess.unread());
}
}
}
//
webim.login(loginInfo, listeners, options, function (resp) {
loginInfo.identifierNick = resp.identifierNick; //設置當前用戶暱稱
console.log("登錄成功");
that.setData({
loginInfo: loginInfo,
});
}, function (err) {
console.log("登錄失敗------------------", err.ErrorInfo)
})