項目中接入騰訊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