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

需求:app通知欄收到推送,點擊通知欄推送能夠進入到不一樣的詳情頁(與後臺接口聯調)

題記:上一篇文章在使用個推後臺發送json,有分析過MUI集成個推的流程。這一次主要是在實際開發過程當中,後臺接入個推SDK之後,兩端聯調工做。實際接入之後兩端聯調仍是有些不一樣的。javascript

Android

以前咱們說到,Android處理方式比較簡單,只須要後臺按照規定透傳模板的數據結構來便可。可是實際對接過程當中咱們發現,按照透傳模板消息過來,點擊通知欄打開app並不會走click監聽方法。根據論壇過來人的爬坑經驗,咱們找到一種替代方案,親測可用。原理以下:java

如何得到透傳數據?剛纔我說過標準格式不觸發‘click’事件,那怎麼得到透傳數據,並打開咱們指定的頁面呢?這裏須要使用到app的啓動參數plus.runtime.arguments。若是app是啓動狀態,無論前臺仍是後臺,均可以用新意圖事件來得到啓動參數,若是app是未啓動狀態,能夠在plusReady裏得到啓動參數。json

//獲取推送通知
        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方法中監聽到兩次消息。這個問題讓我百思不得其解,後來查了不少資料才發現蘋果有個app

content-available
的參數,默認是置爲1的,可是咱們這裏須要置爲0。有興趣能夠自行百度看看。

因此,app在前臺的時候咱們依舊走的是receive方法生成一個本地通知,在收到的json中,和後臺約定一個字段用來替換成你自定義標識的字段,這個操做的目的是區分本地消息和透傳消息。ui

//我這裏是根據約定的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消息,而不須要區分是否爲本地消息:spa

//點擊推送進來
        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);
    
複製代碼
相關文章
相關標籤/搜索