1. 程式人生 > >使用騰訊雲IM遇到的問題

使用騰訊雲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個問題。在此記錄下,也希望對需要的人有所幫助。同時如有說得不對,或者是我使用不當的地方請在評論中指點一下,謝謝!