使用騰訊雲IM遇到的問題
過年前來記錄一下個人在使用騰訊雲通訊中遇到的問題,本文只說移動端的問題,由於本人是android開發的,所以以下出現騰訊API以android的為主,但ios也是對應方法名。
1、 官網中的SDK API文件不是最新的,類、方法不全,請下載sdk解壓后里面的文件,ios和android都一樣。
2、 初始化
在登入前,請將文件中的初始化部分的事件監聽給加上
目的就是為了登入後可以立即獲得新訊息,以防訊息漏接,最重要的千萬別忘了在登入前進行sdk初始化,TIMManager.getInstance().init(context);缺少這一句,程式就會崩潰。
事件監聽中需要注意的是訊息監聽器public void addMessageListener(TIMMessageListener listener);我看他的內部是放了一個訊息監聽器陣列的,就是你add多少個都會進行回撥,如果你有多種回撥處理,但同一個時刻只要一種回撥處理,那麼在add之前,請將之前的監聽器移除掉,方法public void removeMessageListener(TIMMessageListener listener);
3、 public void getMessage(int count, TIMMessage lastMsg,TIMValueCallBack<List<TIMMessage>> callback)獲取歷史訊息不全。
原因
(1)一次獲取的訊息數最多20條,即使引數count你傳大於20的值,他返回的最多也只有20條。
(2)預設情況ImSDK會進行訊息的儲存,在本地有快取後就會讀取本地快取,官方說法是通過“ImSDK 的 getMessage 介面可以獲取漫遊訊息,如果本地訊息全部都是連續的,則不會通過網路獲取,如果本地訊息不連續,會通過網路獲取斷層訊息”。且騰訊雲IM提供的漫遊記錄預設儲存7天,所以在這個時間有接收過的訊息會有快取以後也可以讀取得到,但如果是之前未登入的,那麼就會獲取不到訊息了。
(3)這個方法本地有快取則取快取且非同步的,所以有時是離線訊息還沒同步下來。解決方法,可以設定同步離線訊息回撥public void setRefreshListener(TIMRefreshListener listener),getMessage改為在onRefresh()方法中呼叫 。
4、 onRefresh()多次呼叫
此方法不僅在登入後會呼叫,在掉線後重新連上線後也會呼叫。可以在
TIMManager.getInstance().setConnectionListener(newTIMConnListener() { @Override public void onConnected() {//連線建立 Log.e(tag, "connected"); } @Override public void onDisconnected(int code, Stringdesc) {//連線斷開 //介面返回了錯誤碼code和錯誤描述desc,可用於定位連線斷開原因 //錯誤碼code含義請參見錯誤碼錶 Log.e(tag, "disconnected"); } });
在這兩個方法中做標記,來區分當前是否斷線,和onRefresh()是否為重新連上線後而呼叫的,同時也可以利用該標記用來獲取掉線期間的歷史訊息。
5、 最後一條訊息重複
在獲取歷史訊息時,有時最新的那一條訊息也會在新訊息通知onNewMessages收到,個人處理方式是登入後的第一條新訊息和歷史訊息中的最新一條的id進行比較,以此來判斷是否重複。
6、 部分訊息的getSenderProfile()返回值為null
這部分的訊息是由該手機機發出的訊息。這是個坑。
ios傳送訊息
[conversationsendMessage:msg succ:^(){
NSLog(@"SendMsg Succ");
}fail:^(intcode, NSString * err) {
NSLog(@"SendMsgFailed:%d->%@", code, err);
}];
並沒有把傳送出去的訊息返回。所以只能拿自己構建的訊息去顯示。
Android傳送訊息
conversation.sendMessage(msg,new TIMValueCallBack<TIMMessage>() {//傳送訊息回撥
@Override
public void onError(int code, String desc){//傳送訊息失敗
//錯誤碼code和錯誤描述desc,可用於定位請求失敗原因
//錯誤碼code含義請參見錯誤碼錶
Log.d(tag, "send message failed.code: " + code + " errmsg: " + desc);
}
@Override
public void onSuccess(TIMMessage msg) {//傳送訊息成功
Log.e(tag, "SendMsg ok");
}
});
雖然有返回TIMMessage,但其實就是將你給他的原原本本的還給你。
所以自己發出去的訊息getSenderProfile()是為null的。
個人處理方法是如果TIMMessage.isSelf()為true就直接顯示自己的資訊,不去getSenderProfile()。
所以在登入成功後呼叫public void getSelfProfile(TIMValueCallBack<TIMUserProfile>cb),將自己的個人資訊儲存下來。
個人覺得登入成功後不將自己的資訊返回是個坑,因為getSelfProfile又是一個非同步請求。
因為我並沒有使用全部功能像什麼離線推送,群組管理都沒有用,只是利用它來實現簡單的即時聊天功能而已,所以目前就這6個問題。在此記錄下,也希望對需要的人有所幫助。同時如有說得不對,或者是我使用不當的地方請在評論中指點一下,謝謝!