MUI接入個推推送與後臺聯調

mobile墨白發表於2018-10-16

需求:app通知欄收到推送,點選通知欄推送可以進入到不同的詳情頁(與後臺介面聯調)

題記:上一篇文章在使用個推後臺傳送json,有分析過MUI整合個推的流程。這一次主要是在實際開發過程中,後臺接入個推SDK以後,兩端聯調工作。實際接入以後兩端聯調還是有些不同的。

Android

之前我們說到,Android處理方式比較簡單,只需要後臺按照規定透傳模板的資料結構來即可。但是實際對接過程中我們發現,按照透傳模板訊息過來,點選通知欄開啟app並不會走click監聽方法。根據論壇過來人的爬坑經驗,我們找到一種替代方案,親測可用。原理如下:

如何獲得透傳資料?剛才我說過標準格式不觸發‘click’事件,那怎麼獲得透傳資料,並開啟我們指定的頁面呢?這裡需要使用到app的啟動引數plus.runtime.arguments。如果app是啟動狀態,不管前臺還是後臺,都可以用新意圖事件來獲得啟動引數,如果app是未啟動狀態,可以在plusReady裡獲得啟動引數。

        //獲取推送通知
        plus.push.addEventListener("receive", function (msg) {
            if (plus.os.name == "iOS") {
                XXX
            } else {//Android的在receive方法處理,不走click
                json = msg.payload;
                alert("Android json: " + JSON.stringify(json));
                alert("type : " + JSON.parse(json).type);
                openNewWindow(json);
            }
        }, false); 
        
        //獲取通知欄(app未啟動)點選、第三方程式啟動本app
        function openWebviewFromOthers() {
            var args = plus.runtime.arguments;
            if (args) {
                openNewWindow(args);
            }
        }

        function pushGetRun(msg) {
            alert("pushGetRun " + JSON.stringify(msg))
            //用引數開啟指定頁面
            openNewWindow(msg)
        }
    
複製程式碼

在頁面建立的時候呼叫 openWebviewFromOthers(),此時我們可以完成了Android的推送流程。在receive方法中可以處理接收訊息體。

iOS

上一篇文章中,針對iOS分析比較詳細了。在實際聯調中,還是有些小細節需要注意下。就比如我踩到的一個大坑就是,iOS在後臺的時候,走的是APS通道。在訊息中心點開以後,開啟APP會在click方法中監聽到兩次訊息。這個問題讓我百思不得其解,後來查了很多資料才發現蘋果有個

content-available
的引數,預設是置為1的,但是我們這裡需要置為0。有興趣可以自行百度看看。

所以,app在前臺的時候我們依舊走的是receive方法生成一個本地通知,在收到的json中,和後臺約定一個欄位用來替換成你自定義標識的欄位,這個操作的目的是區分本地訊息和透傳訊息。

         //我這裡是根據約定的msgType欄位判斷
         plus.push.addEventListener("receive", function (msg) {
            if (plus.os.name == "iOS") {
                alert("獲取本地推送: " + JSON.stringify(msg));
                if (JSON.parse(msg.content).msgType != "LocalMSG") {
                    //本地推送
                    createLocalPushMsg(msg);
                }
            } else {//Android的在receive方法處理,不走click
              XXX
            }
        }, false);
    
    
        //建立本地訊息
        function createLocalPushMsg(msg) {
            var options = {cover: false};
            var msgJson = JSON.parse(msg.content);
            /**
             * 把msgType欄位替換,該訊息即為本地生成的訊息,
             * 不會在receive方法中重複收到
             */
            msgJson.msgType = "LocalMSG";
            plus.push.createMessage(msg.payload.content, JSON.stringify(msgJson), options);
        }
複製程式碼

然後在click方法中,我們可以統一處理接收到的iOS訊息,而不需要區分是否為本地訊息:

        //點選推送進來
        plus.push.addEventListener("click", function (msg) {
            // alert(JSON.stringify(msg));
            if (plus.os.name == "iOS") {
                json = msg.payload;
                json = isJSON(json) ? JSON.parse(json) : json;
                alert("iOS : " + JSON.stringify(json));
                alert("iOS type欄位: " + json.type);
            }
            openNewWindow(json);
        }, false);
    
複製程式碼

相關文章