騰訊IM的那些坑

項目中接入騰訊IM,在這裏記錄下,以便你們解決問題時少走彎路ios

 

1.首先講一下IM返回對象的問題:json

/**
     * 消息工廠方法
     */
    public static Message getMessage(TIMMessage message){
        switch (message.getElement(0).getType()){
            case Text:
            case Face:
                return new TextMessage(message);
            case Image:
                return new ImageMessage(message);
            case Sound:
                return new VoiceMessage(message);
            case Video:
                return new VideoMessage(message);
            case GroupTips:
                return new GroupTipMessage(message);
            case File:
                return new FileMessage(message);
            case Custom:
                return new CustomMessage(message);
            default:
                return null;
        }
    }

這就是消息的類型用工廠模式,分別轉成每一個類型框架

瞭解這些消息類型時咱們須要對消息進行解析,這裏就不贅述了(demo能夠參考下)ide

設置用戶名
TIMFriendshipManager.getInstance().setNickName(Thinksns.getMy().getUserName(), new TIMCallBack() {

設置用戶頭像
TIMFriendshipManager.getInstance().setFaceUrl(faceUrl, new TIMCallBack()

當設置用戶名和頭像還有等等信息時,返回來的TimMessage裏面是拿不到的。必須請求騰訊接口,拿到信息在對每項進行匹配,顯然這是不友好的。ui

下面上獲取用戶和羣的信息代碼(注:獲取任何人,不是好友也能夠)this

 public void getAllsForidentifier(final int id, final String uname) {
        //待獲取用戶資料的用戶列表
        List<String> users = new ArrayList<String>();
        users.add(id + "");
        //獲取用戶資料
        TIMFriendshipManager.getInstance().getUsersProfile(users, new TIMValueCallBack<List<TIMUserProfile>>() {
            @Override
            public void onError(int code, String desc) {
                //錯誤碼code和錯誤描述desc,可用於定位請求失敗緣由
                //錯誤碼code列表請參見錯誤碼錶
                Log.e("111", "getUsersProfile failed: " + code + " desc");
                ToastUtils.showToastOnce(ActivityUserInfo_2.this, "對方還未開通IM聊天功能");
                if (smallDialog != null) {
                    smallDialog.dismiss();
                }
            }

            @Override
            public void onSuccess(List<TIMUserProfile> result) {
                if (smallDialog != null) {
                    smallDialog.dismiss();
                }
                UnitSociax.chatToIMC2C(ActivityUserInfo_2.this, id, uname);
            }
        });
    }


  public void getMyGroupForidentifier(String id) {
        //建立待獲取信息的羣組Id列表
        ArrayList<String> groupListtt = new ArrayList<String>();
        //添加羣組
        String groupId = id;
        groupListtt.add(groupId);
        //建立回調
        TIMValueCallBack<List<TIMGroupDetailInfo>> cb = new TIMValueCallBack<List<TIMGroupDetailInfo>>() {
            @Override
            public void onError(int code, String desc) {
                //錯誤碼code和錯誤描述desc,可用於定位請求失敗緣由
                //錯誤碼code列表請參見錯誤碼錶
            }

            @Override
            public void onSuccess(List<TIMGroupDetailInfo> infoList) { //參數中返回羣組信息列表
                other_name = infoList.get(0).getGroupName();
                templateTitle.setTitleText(other_name);
            }
        };

2.關於離線推送的坑(我的看法,我的實踐後的)spa

接入離線推送怎麼也接不通,後來申請小米離線的key 和 密碼 接入小米成功,而後本項目奇蹟般的離線推送本身好了。code

小米華爲的代碼xml

 String vendor = Build.MANUFACTURER;
                if (vendor.toLowerCase(Locale.ENGLISH).contains("xiaomi")) {
                    //註冊小米推送服務
                    MiPushClient.registerPush(ActivityHome.this, "xxxxxxxxxx", "xxxxxxx");
                } else if (vendor.toLowerCase(Locale.ENGLISH).contains("huawei")) {
                    //請求華爲推送設備token
                    PushManager.requestToken(ActivityHome.this);
                }

和檢查離線推送是否開啓的代碼(默認是開啓的)對象

 //檢查是否開啓離線推送
        TIMManager.getInstance().getOfflinePushSettings(new TIMValueCallBack<TIMOfflinePushSettings>() {
            @Override
            public void onError(int i, String s) {
                Log.e("sss", "get offline push setting error " + s);
            }

            @Override
            public void onSuccess(TIMOfflinePushSettings timOfflinePushSettings) {
                Log.e("sss", "get offline push setting success "+ timOfflinePushSettings.isEnabled()+"" );
//                timOfflinePushSettings.isEnabled();
            }
        });

3.自定義消息能夠這麼作(還有其餘方法)

 public void sendGoos(String goods_id, String img, String title, String price) {
        //構造一條消息來發送自定義消息-商品
        TIMMessage msg = new TIMMessage();
        // xml協議的自定義消息
        String sampleXml = "{\"userAction\":1,\"img\":\"" + img + "\",\"title\":\"" + title + "\",\"goods_id\":\"" + goods_id + "\",\"price\":\"" + price + "\"}";
        //向TIMMessage中添加自定義內容
        TIMCustomElem elem = new TIMCustomElem();
        elem.setData(sampleXml.getBytes());      //自定義byte[]
        elem.setDesc("this is one custom message"); //自定義描述信息
        //將elem添加到消息
        if (msg.addElement(elem) != 0) {
            Log.d("", "addElement failed");
            return;
        }
        presenter.sendMessage(msg);
    }

他是用自定義byte[]發送的 值得注意的是 sampleXml  這個string字符串就是發送的消息json類型的到時候拿到直接進行解析

4.消息過濾

這裏多注意消息類型,正在輸入時類型爲TYPING,ios消息類型不對也會引發消息出現問題

總結:

遇到問題多看看錯誤碼,官方文檔,(客服其實解決不了啥問題,就知道發連接),通常遇到問題都是消息類型或者建立消息有問題

,demo中重要的邏輯暫時沒遇到過有問題,有一些小框架問題很多。

若是遇到推送和聊天列表的問題,可參考ConversationAdapter中怎麼排除。

 

 

by:磊磊tua

相關文章
相關標籤/搜索