題記:上一篇文章在使用個推後臺發送json,有分析過MUI集成個推的流程。這一次主要是在實際開發過程當中,後臺接入個推SDK之後,兩端聯調工做。實際接入之後兩端聯調仍是有些不一樣的。javascript
以前咱們說到,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在後臺的時候,走的是APS通道。在消息中心點開之後,打開APP會在click方法中監聽到兩次消息。這個問題讓我百思不得其解,後來查了不少資料才發現蘋果有個app
因此,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);
複製代碼