融雲即時通信SDK集成 -- 華爲推送的點擊跳轉處理

融雲即時通信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, 在融雲的後臺, 如圖所示:
image 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大概是這樣的格式:spa

intent://com.wonderfull.android.push/notification?action=$action#Intent;scheme=wonderfullpush;action=android.intent.action.VIEW;launchFlags=0x10000000;end

不過這塊還有坑, 還不能直接把裝會話界面的activity的intent直接寫在這裏, 由於這個會話界面去的到底是哪一個對話者的界面, 相應userId的參數是傳不到的. 在這裏我嘗試獲取過intent裏邊的數據, 是空的. code

和融雲的技術支持團隊確認後, 找到了解決方案. 只有intent走到入口類, 才能拿的到通知裏攜帶的數據, 我app的閃屏頁, 也就是SplashActivity, 在融雲後臺把自定義點擊跳轉intent配成SplashActivity的. 而後在這裏把intent的數據拿到, 再一次調用融雲的接口跳轉到相應的會話界面就OK了.htm

等拿到這個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, 從個人閃屏頁跳轉到相應的會話界面去. 這樣需求就搞定了.

相關文章
相關標籤/搜索