需求: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);
複製程式碼