需求:app通知欄收到推送,點(diǎn)擊通知欄推送可以進(jìn)入到不同的詳情頁(yè)(與后臺(tái)接口聯(lián)調(diào))
題記:上一篇文章在使用個(gè)推后臺(tái)發(fā)送json,有分析過(guò)MUI集成個(gè)推的流程。這一次主要是在實(shí)際開(kāi)發(fā)過(guò)程中,后臺(tái)接入個(gè)推SDK以后,兩端聯(lián)調(diào)工作。實(shí)際接入以后兩端聯(lián)調(diào)還是有些不同的。
Android
之前我們說(shuō)到,Android處理方式比較簡(jiǎn)單,只需要后臺(tái)按照規(guī)定透?jìng)髂0宓臄?shù)據(jù)結(jié)構(gòu)來(lái)即可。但是實(shí)際對(duì)接過(guò)程中我們發(fā)現(xiàn),按照透?jìng)髂0逑⑦^(guò)來(lái),點(diǎn)擊通知欄打開(kāi)app并不會(huì)走click監(jiān)聽(tīng)方法。根據(jù)論壇過(guò)來(lái)人的爬坑經(jīng)驗(yàn),我們找到一種替代方案,親測(cè)可用。原理如下:
如何獲得透?jìng)鲾?shù)據(jù)?剛才我說(shuō)過(guò)標(biāo)準(zhǔn)格式不觸發(fā)‘click’事件,那怎么獲得透?jìng)鲾?shù)據(jù),并打開(kāi)我們指定的頁(yè)面呢?這里需要使用到app的啟動(dòng)參數(shù)plus.runtime.arguments。如果app是啟動(dòng)狀態(tài),不管前臺(tái)還是后臺(tái),都可以用新意圖事件來(lái)獲得啟動(dòng)參數(shù),如果app是未啟動(dòng)狀態(tài),可以在plusReady里獲得啟動(dòng)參數(shù)。
//獲取推送通知
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未啟動(dòng))點(diǎn)擊、第三方程序啟動(dòng)本app
function openWebviewFromOthers() {
var args = plus.runtime.arguments;
if (args) {
openNewWindow(args);
}
}
function pushGetRun(msg) {
alert("pushGetRun " + JSON.stringify(msg))
//用參數(shù)打開(kāi)指定頁(yè)面
openNewWindow(msg)
}
在頁(yè)面創(chuàng)建的時(shí)候調(diào)用 openWebviewFromOthers(),此時(shí)我們可以完成了Android的推送流程。在receive方法中可以處理接收消息體。
iOS
上一篇文章中,針對(duì)iOS分析比較詳細(xì)了。在實(shí)際聯(lián)調(diào)中,還是有些小細(xì)節(jié)需要注意下。就比如我踩到的一個(gè)大坑就是,iOS在后臺(tái)的時(shí)候,走的是APS通道。在消息中心點(diǎn)開(kāi)以后,打開(kāi)APP會(huì)在click方法中監(jiān)聽(tīng)到兩次消息。這個(gè)問(wèn)題讓我百思不得其解,后來(lái)查了很多資料才發(fā)現(xiàn)蘋(píng)果有個(gè)content-available的參數(shù),默認(rèn)是置為1的,但是我們這里需要置為0。有興趣可以自行百度看看。
所以,app在前臺(tái)的時(shí)候我們依舊走的是receive方法生成一個(gè)本地通知,在收到的json中,和后臺(tái)約定一個(gè)字段用來(lái)替換成你自定義標(biāo)識(shí)的字段,這個(gè)操作的目的是區(qū)分本地消息和透?jìng)飨ⅰ?/p>
//我這里是根據(jù)約定的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);
//創(chuàng)建本地消息
function createLocalPushMsg(msg) {
var options = {cover: false};
var msgJson = JSON.parse(msg.content);
/**
* 把msgType字段替換,該消息即為本地生成的消息,
* 不會(huì)在receive方法中重復(fù)收到
*/
msgJson.msgType = "LocalMSG";
plus.push.createMessage(msg.payload.content, JSON.stringify(msgJson), options);
}
然后在click方法中,我們可以統(tǒng)一處理接收到的iOS消息,而不需要區(qū)分是否為本地消息:
//點(diǎn)擊推送進(jìn)來(lái)
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);