融雲即時通信SDK集成 -- 華爲推送的點擊跳轉處理
1.背景:
最近公司新上的app要加上即時通信的功能, 本身快速實現一個固然是不可能的了(項目deadline也頂不住哇).就從各家成熟的SDK廠商選來選去的, 各有各的好也各有各的不足.最後點兵點將,選了融雲家的SDK(老闆說了算hhhh). 他家的官網和文檔地址: 官網:https://www.rongcloud.cn/ 文檔:https://docs.rongcloud.cn/v4 這個任務固然仍是落在個人頭上. 基礎的IM聊天, 羣組聊天等功能集成在另外一篇博客中已經講過, 這裏就先不說了. 以前的一篇文章已經講過, 這篇文章重點講下華爲推送過來的通知欄點擊事件, 這小小的一件事, 可耗費了很多的精力.html
2. 融雲家SDK接入廠商推送指南
這個他家講的挺清楚了, 都近似手把手的教了, 那我也就不在這浪費鍵盤壽命了(偷個懶hhhhh).給他家官方文檔往這兒一貼好了: https://docs.rongcloud.cn/v4/views/im/ui/guide/private/notify/push/mi.html. 你們注意一下他家華爲廠商推送的文檔分2.x和4.x哈, 對應的是他家舊版/新版SDK中接入的廠商的新/舊版本推送包.我這裏以前是踩過坑的, 推薦你們仍是用他家的4.x的sdk包集成, 裏邊集成的是華爲新版本的推送包. 由於華爲已經在逐漸棄用舊版本的推送包了, 因此不想之後麻煩再迭代的話, 仍是直接上新版本比較好, 由於如今已經有接入舊版本包的app在某些低版本華爲Rom上收不到推送了, 仍是謹慎一點比較好.java
3. 華爲推送通知點擊跳轉自定義
這裏咱們所指的跳轉是, 點擊通知欄到達的華爲推送通知後, 調起咱們的app, 跳到相應的Activity的. 由於咱們作的是即時通信App, 因此點擊別人發來的消息推送通知後, 固然是跳到和該用戶聊天的會話頁面, 但就是這樣一個小業務, 實現起來還真有點麻煩. 因此這裏也算是給你們踩踩坑啦.android
首先是點擊跳轉的邏輯, 經過和融雲技術支持聯繫以及查看他們sdk的代碼, 得知他們的推送都是走了一個叫PushMessageReceiver的類, 開發者能夠註冊並繼承該類, 重寫onNotificationMessageClicked()方法, 顯而易見這就是對通知消息的監聽. 可這也是第一個坑, 華爲由於平臺的限制, 推送通知的點擊事件根本不走這裏. 準確的說是華爲和Oppo都由於各自平臺的限制, 不走這裏. 因此當我興致勃勃重寫了這個方法準備一次經過的時候, 點擊後直接走到了會話列表界面, 而非會話界面.json
這是由於華爲平臺點擊跳轉是須要配一個intent, 在融雲的後臺, 如圖所示: app
這裏的intent即爲通知欄點擊跳轉後的隱式啓動相應activity的那個intent.ide
獲取某Activity相應intent的代碼, 可把intent給打到log中:ui
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("wonderfullpush://com.wonderfull.android.push/notification?action=your parameter")); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.setAction(Intent.ACTION_VIEW); String intnetUri = intent.toUri(Intent.URI_INTENT_SCHEME); Log.d("hwpush", "intnetUri=" + intnetUri);
生成的intent大概是這樣的格式:url
intent://com.wonderfull.android.push/notification?action=$action#Intent;scheme=wonderfullpush;action=android.intent.action.VIEW;launchFlags=0x10000000;end
不過這塊還有坑, 還不能直接把裝會話界面的activity的intent直接寫在這裏, 由於這個會話界面去的到底是哪一個對話者的界面, 相應userId的參數是傳不到的. 在這裏我嘗試獲取過intent裏邊的數據, 是空的..net
和融雲的技術支持團隊確認後, 找到了解決方案. 只有intent走到入口類, 才能拿的到通知裏攜帶的數據, 我app的閃屏頁, 也就是SplashActivity, 在融雲後臺把自定義點擊跳轉intent配成SplashActivity的. 而後在這裏把intent的數據拿到, 再一次調用融雲的接口跳轉到相應的會話界面就OK了.code
等拿到這個intent的後, 又是來了一點點小麻煩. 根據融雲的文檔, 我在入口Activity(閃屏頁, SplashActivity)這裏接收到了intent, 從intent裏邊取相應的數據:
這個intent中給的數據包含了轉義符:
{"rc":"{\"conversationType\":\"1\",\"targetId\":\"userid8\",\"sourceType\":\"0\",\"fromUserId\":\"userid8\",\"objectName\":\"RC:TxtMsg\",\"id\":\"BLCG-G8TC-U7E6-KV7P\",\"tId\":\"doctorid3\"}"}
String jsonStr = "{\"rc\":\"{\\\"conversationType\\\":\\\"1\\\",\\\"targetId\\\":\\\"userid8\\\",\\\"sourceType\\\":\\\"0\\\",\\\"fromUserId\\\":\\\"userid8\\\",\\\"objectName\\\":\\\"RC:TxtMsg\\\",\\\"id\\\":\\\"BLCG-G8TC-U7E6-KV7P\\\",\\\"tId\\\":\\\"doctorid3\\\"}\"}"; String fixStr1 = jsonStr.replace("\\", ""); String fixStr2 = fixStr1.replace("\"rc\":\"", "\"rc\":" ); String result = fixStr2.replace("\"}\"", "\"}"); Log.d(TAG, "result jsonStr: "+ result); JSONObject jsonObject; try { jsonObject = new JSONObject(result); String options = jsonObject.getString("rc"); JsonObject object = (JsonObject) new JsonParser().parse(options); String targetId = object.getAsJsonObject().get("targetId").getAsString(); Log.d(TAG, "analyse json targetId: " + targetId); } catch (JSONException e) { e.printStackTrace(); }
我選擇了自行處理字符串, 拿到了相應的targetId, 從個人閃屏頁跳轉到相應的會話界面去. 這樣需求就搞定了.