前言距離上次極光征文不知不覺已經過了將近一年的時間,先感謝上次的征文比賽,通過 《我和 Android 推送的時間簡史》 這篇文章獲獎,這次又厚著臉皮再次參與,因為項目一直很忙,只得利用周末時間準備 demo 素材和寫文章,不好之處,多多見諒。 上一篇文章主要講述了 我跟 極光推送 的關系,以及簡單的描述了其集成和使用,作為三個項目都在使用極光推送的我,對其了解也是相當多的,當然坑也踩了不少,不得不再次感謝大俠(極光技術人員)對我的幫助,雖然這一年沒有繼續(xù)接觸推送的業(yè)務,但是當我遇到困惑依然有問必答,服務態(tài)度不容置疑! 在準備參加征文時就在想應該從哪個角度來寫呢,正好之前跟前同事一起寫了一個開源項目 WeaponApp, 現(xiàn)在已經有 800+ 的 star 了。 里面涉及的技術我就不一一闡述了,感興趣的話可以自行看一下,里面有一個模塊由我單獨負責- IM模塊,因為已經集成了極光推送,考慮到成本和使用,最終選擇了極光IM,畢竟是以極光推送的大規(guī)模、高并發(fā)、穩(wěn)定的推送為技術基礎,并繼承這些特性。那這篇文章就以我集成的經歷和使用做個介紹,快速的實現(xiàn)具有 IM 功能的 APP。 展示這里只對 IM 模塊功能做簡單的演示,感興趣可以點擊 鏈接 進行下載,如下 gif 圖: 基本的聊天功能已經實現(xiàn),其中包括: 登錄、注冊、強踢和退登 個人信息查看和修改 查找好友并進行聊天 群聊 個人中心展示 刪除會話和清空聊天記錄
后續(xù)會根據需要添加新的功能。 集成因為前項已經集成了極光推送服務,很多東西已經不需要重復操作,只需要將 JMessage 相關的組件集成到項目中即可,詳情的步驟可直接參考官網。 1. 導入jmessage jar 包2. 在 AndroidManifest 中添加相應的事件 沒了。。由此可以看出,由推送到 IM 過渡是多么流暢! 使用其實在使用的過程,無非是根據自己的業(yè)務需求,到 官網 查找 API 來實現(xiàn)自己想要的功能,那我就根據目前項目中有的功能進行介紹。 注冊、登錄和退登這其實是用戶的信息管理,極光 IM 統(tǒng)一用 UserInfo 進行管理,內部包含了用戶的大部分信息: protected String userName; protected String nickname = ""; protected String avatarMediaID; protected String birthday = ""; protected String signature = ""; protected String gender = ""; protected String region = ""; protected String address = ""; protected String appkey = null; protected String notename = null; protected String noteText = null; protected Map<String, String> extras = new ConcurrentHashMap();
1. 注冊 一開始打算自己寫用戶服務器,事實上卻是由另一位開發(fā)者完成了,但是考慮到 IM 的集成,用戶數(shù)據的遷移和轉存過程繁瑣,就干脆直接用極光的用戶接口,其實內部的數(shù)據也確實很詳細,還支持自定義字段,完全滿足日常需求。
JMessageClient.register(userName, password, new JMessageCallBack() { public void onSuccess() { registerSuccess(userName); public void onFailed(int status, String desc) {
注冊需要用戶名和密碼,注冊成功后通過 setResult 的方法,將賬戶和密碼傳回登錄頁面。 2. 登錄 JMessageClient.login(userName, password, new JMessageCallBack() { public void onSuccess() { public void onFailed(int status, String desc) {
同注冊一樣,登錄也需要用戶名和密碼進行登錄,如果格式有誤會直接觸發(fā) onFailed 回調,彈出相應的提示。成功后本地便會保存一個 UserInfo 對象儲存用戶的信息。 3. 退登 極光支持主動退出賬號的功能,即:
直接清除本地保存的用戶信息,同樣他支持多端同時在線: 如果不打開開關,另一臺設備登錄,會用 EventBus 發(fā)送 LoginStateChangeEvent ,告知開發(fā)者改賬號已在另一臺設備登錄,并且會攜帶三種狀態(tài): case user_password_change: forcedExit("賬號在另一臺設備登錄");
根據自己的需要進行處理。 信息查看和修改1. 個人 自己的用戶信息其實是保存在本地的數(shù)據庫中,通過調用: mUserInfo = JMessageClient.getMyInfo();
獲取用戶信息,之前提過 UserInfo 里面包含了用戶的所有數(shù)據。與之對應的: JMessageClient.updateMyInfo(UserInfo.Field.gender, mUserInfo, new JMessageCallBack() { public void onSuccess() { public void onFailed(int status, String desc) {
這個就是修改自己信息的方法,通過傳入 UserInfo.Field 來區(qū)分修改屬性值。 2. 他人 如果需要查看好友的信息,可通過 userName 進行請求查詢: JMessageClient.getUserInfo(userName, new GetUserInfoCallback() { public void gotResult(int status, String desc, UserInfo userInfo) { getViewModel().setUserInfo(userInfo); getViewModel().setError(desc);
具體的結果如下: 如果是個人信息,直接可以修改和退登,如果是他人只能查看并與其進行聊天。 聊天終于到了核心的聊天功能,其實實現(xiàn)起來并不復雜,極光 IM 已經給了豐富的 API 和使用說明,足夠完成基本的需求。 1. 發(fā)消息 發(fā)消息,前提是需要構建 Message 對象,以基礎文本為例: final Message message = mConversation.createSendTextMessage(sendContent); message.setOnSendCompleteCallback(new BasicCallback() { public void gotResult(int status, String desc) { MobclickAgent.onEvent(getContext().getApplicationContext(), "send_message", sendContent); getView().scrollToPosition(items.size() - 1); Toast.makeText(getContext(), desc, Toast.LENGTH_SHORT).show(); JMessageClient.sendMessage(message);
最終通過 JmessageClient.sendMessage(message) 將消息發(fā)送出去。 2. 接收消息 他這里比較簡單粗暴,直接使用 EventBus 進行消息接收的回調。 他 jar 里集成了 EventBus,項目中也有了 EventBus,這一點還是蠻坑的。換想一下,這里也是為了方便接收,不然會有很多相互應用,各種耦合,不過使用過 EventBus 的小伙伴,應該知道,如果維護不好 EventBus 會導致邏輯非常的混亂,維護和拓展異常困難。
public void onEventMainThread(MessageEvent event) { Message message = event.getMessage(); switch (message.getContentType()) { String userName = ((UserInfo) message.getTargetInfo()).getUserName(); if (TextUtils.equals(userName, mUserName)) { getViewModel().receiveMessage(message); LogUtils.i("office", message.getFromType());
根據 contentType 區(qū)分消息實體的類型,并做相應的處理。 在需要接收消息的地方進行事件的注冊和取消注冊。 JMessageClient.registerEventReceiver(this, 200); JMessageClient.unRegisterEventReceiver(this);
3. 單聊 這里引入一個 Conversation 概念,當你與他人聊天必然會建立會話,那會話的消息和聊天的對象都會存在這個會話中,那單聊則通過傳入 userName 進行聯(lián)系,由此可見 userName 的唯一性和重要性。 因為剛進去需要獲取歷史信息,所以通過 conversion 獲取所有的消息,并展示在界面上。 mConversation = Conversation.createSingleConversation(userName); JMessageClient.getUserInfo(userName, this); if (mConversation == null) { msgCount = mConversation.getAllMessage().size(); List<Message> messagesFromNewest = mConversation.getMessagesFromNewest(curCount, LIM_COUNT); curCount = messagesFromNewest.size(); Collections.reverse(messagesFromNewest); for (Message message : messagesFromNewest) { MessageDirect direct = message.getDirect(); if (direct == MessageDirect.send) { addReceiverMessage(message);
4. 群聊 群聊與單聊有點類似,不過建立會話的前提參數(shù)不是 userName , 而是 groupId 群的唯一標識 ID。 mConversation = Conversation.createGroupConversation(groupId); if (mConversation == null) { List<Message> messagesFromNewest = mConversation.getMessagesFromNewest(curCount, LIM_COUNT); curCount = messagesFromNewest.size(); Collections.reverse(messagesFromNewest); for (Message message : messagesFromNewest) { MessageDirect direct = message.getDirect(); if (direct == MessageDirect.send) { addReceiverMessage(message);
具體的代碼很相似,只是創(chuàng)建的過程不一樣,不再贅述。 總結前段時間王欣、字節(jié)跳動等都推出社交軟件,不過在微信平臺被封殺,這點還是蠻狠的,不過另一方面反映出社交 聊天在各個行業(yè)應用的廣泛,無論是金融、教育、銷售等軟件都需要一個 IM 作為用戶與用戶、用戶和平臺之間的溝通橋梁,因此作為開發(fā)者,還是要多多學習一下 IM 相關的知識。當然自己能獨立完成最好,如果沒有經歷或者暫時能力不夠,又或者公司急切需要集成 IM 功能,建議你可以考慮極光 IM 服務,其推送服務做得還是蠻不錯的,而且還在不斷的維護迭代中,有時間不妨嘗試一波吧! WeaponAppAPK下載 本文為極光征文參賽文章
|