MUI使用個推推送流程分析

需求:app通知欄收到推送,點擊通知欄推送能夠進入到不一樣的詳情頁(使用個推後臺調試數據)

一、監聽方法分析:

  • receive方法:
    當APP在前臺的時候,能夠監聽接收透傳消息,APP不在前臺的時候沒法監聽
plus.push.addEventListener("receive", function (msg) {
 }
複製代碼
  • click方法:
    一、iOS APP處於後臺,透傳消息會變成通知提醒,此時點擊通知觸發
    二、點擊本地設置的推送到通知欄的通知
plus.push.addEventListener("click", function (msg) {
}
複製代碼

二、技術分析:

通知欄通知:

  • iOS
    在個推中,iOS 只有透傳,沒有通知。當APP不在前臺時,透傳只在通知欄提醒,點擊走click方法處理業務;
  • Android
    APP透傳消息都不會出如今通知欄,有兩種處理方式:
    一、個推發送通知(可是點擊通知只能打開APP、打開連接、下載應用)
    二、收到透傳消息後,本地生成通知到通知欄(僅限於APP處於前臺,receive方法中處理)

透傳消息:

  • APP處於前臺纔可接收到,APP處於後臺沒法接收。且接收透傳消息時,不能夠直接作跳轉頁面等業務處理,業務處理跳轉等需在點擊通知欄後進行相應處理。

三、工欲善其事必先利其器,先看官方常見問題:

image.png

四、邏輯處理:

iOS

  • APP處於前臺:

服務器端推送透傳消息後,直接在receive方法監聽到:javascript


iOS APP處於前臺.png

可是這不是咱們要的。咱們須要的是用戶收到消息後在通知欄出現,而不是直接在receive方法中作業務處理。那麼咱們能夠看下上面官方常見問題第三點,咱們須要在消息中心建立一個本地消息:css

plus.push.createMessage( str, "LocalMSG", options );
複製代碼

經過點擊通知中心的這個本地消息,進入app實現click方法監聽處理業務。
那麼問題來了,通過測試咱們發現,在建立本地消息的時候(receive方法中),APP必定是處於前臺的,那麼建立了本地通知之後,咱們的receive方法必定會監聽到,這樣不就進入到一個死循環了麼?java

receive監聽 -> 建立本地通知 -> receive再監聽到本地通知 -> 再建立本地通知。。。json

子子孫孫無窮盡也。服務器

那麼咱們能夠根據參考常見問題的第三點:用戶在建立IOS本地消息是能夠在「payload」節點添加特殊標記對消息進行區分。
這玩意是在建立消息的時候,官方模板自帶的一個參數。在個推後臺iOS透傳的時候,有一個:app

image.png


這個其實只是就是把payload參數的值變成你的透傳消息json,那麼本地建立通知的時候這個值是什麼呢?咱們看上面建立本地通知的時候,第二個參數LocalMSG,這個就是咱們自定義在本地推送的時候的payload參數的值。因此,在receive方法中,咱們根據payload參數的值是否是咱們設定的LocalMSG就能夠判斷監聽到的推送是否是本地建立的了。測試

  • APP處於後臺:

當APP處於後臺,receive方法監聽不到消息,此時消息走消息中心推送,點擊後進入APP內,走click方法處理業務,知足需求。ui


iOS APP處於後臺.png

Android

根據常見問題第二點,咱們知道在處理Android消息的時候,須要使用標準格式的透傳json:spa

{title:"通知標題",content:"通知內容",payload:"通知去幹嗎這裏能夠自定義"}
複製代碼

這樣,透傳消息就不會走receive方法,而是像咱們需求那樣實現全部通知進入通知中心,點擊通知中心走click方法處理。若是不按照此格式來,消息不會走消息中心,而是直接走監聽的receive方法(APP在前臺時,不在前臺時,透傳消息甚至監聽不到)。調試

Android APP消息流程梳理.png
須要注意的一點是:

Android透傳格式{"title":"通知1","content":"通知內容","payload":"{"type":"notify","payload":"通知去幹嗎這裏能夠自定義"}"}若是想要傳輸自定義json,賦值給payload,可是裏面的json必須是轉義事後的,且任何和官方規定格式在同一層的字段都是無效的,例如:
{"id":"123","title":"通知1","content":"通知內容","payload":"{type:\"notify\",ids:\"456\"}"}
這裏面第一個id:"123"在實際接收到的時候並不會存在。

五、總結

其實扯了一大堆,簡而言之就是一句話:

Android推送的時候要注意後臺返回的json知足官方格式便可,iOS推送要注意當APP在前臺的時候,在receive方法監聽的時候判斷是不是本地通知。

下面是個人部分關鍵代碼,alart()是測試階段爲了看到效果加的:

//獲取推送通知
        plus.push.addEventListener("receive", function (msg) {
            alert("接收到的透傳推送 " + JSON.stringify(msg));
            if (plus.os.name == "iOS") {
                switch (msg.payload) {
                    case "LocalMSG":
                        alert("本地建立消息的 " + JSON.stringify(msg));
                        break;
                    default:
                        //測試本地推送
                        createLocalPushMsg(msg);
                        break;
                }
            }
        }, false);
複製代碼
//點擊推送進來
        plus.push.addEventListener("click", function (msg) {
            // 判斷是從本地建立仍是離線推送的消息
            alert("點擊處理消息 " + JSON.stringify(msg));
        }, false);
複製代碼
//建立本地消息
        function createLocalPushMsg(msg) {
            var options = {cover: false};
            plus.push.createMessage(msg.content, "LocalMSG", options);
            if (plus.os.name == "iOS") {
                outLine('*若是沒法建立消息,請到"設置"->"通知"中配置應用在通知中心顯示!');
            }
        }
複製代碼
本文參考的官方文檔附上
相關文章
相關標籤/搜索