需求:app通知欄收到推送,點(diǎn)擊通知欄推送可以進(jìn)入到不同的詳情頁(使用個(gè)推后臺(tái)調(diào)試數(shù)據(jù))
1则奥、監(jiān)聽方法分析:
-
receive方法:
當(dāng)APP在前臺(tái)的時(shí)候考润,可以監(jiān)聽接收透?jìng)飨ⅲ珹PP不在前臺(tái)的時(shí)候無法監(jiān)聽
plus.push.addEventListener("receive", function (msg) {
}
-
click方法:
1逞度、iOS APP處于后臺(tái)额划,透?jìng)飨?huì)變成通知提醒,此時(shí)點(diǎn)擊通知觸發(fā)
2档泽、點(diǎn)擊本地設(shè)置的推送到通知欄的通知
plus.push.addEventListener("click", function (msg) {
}
2俊戳、技術(shù)分析:
通知欄通知:
- iOS
在個(gè)推中,iOS 只有透?jìng)饕痔ィ瑳]有通知燥滑。當(dāng)APP不在前臺(tái)時(shí),透?jìng)髦辉谕ㄖ獧谔嵝寻⑻樱c(diǎn)擊走click方法處理業(yè)務(wù)铭拧;- Android
APP透?jìng)飨⒍疾粫?huì)出現(xiàn)在通知欄,有兩種處理方式:
1恃锉、個(gè)推發(fā)送通知(但是點(diǎn)擊通知只能打開APP搀菩、打開鏈接、下載應(yīng)用)
2破托、收到透?jìng)飨⒑蠓景希镜厣赏ㄖ酵ㄖ獧冢▋H限于APP處于前臺(tái),receive方法中處理)
透?jìng)飨ⅲ?/h4>
- APP處于前臺(tái)才可接收到土砂,APP處于后臺(tái)無法接收州既。且接收透?jìng)飨r(shí),不可以直接做跳轉(zhuǎn)頁面等業(yè)務(wù)處理萝映,業(yè)務(wù)處理跳轉(zhuǎn)等需在點(diǎn)擊通知欄后進(jìn)行相應(yīng)處理吴叶。
3、工欲善其事必先利其器序臂,先看官方常見問題:
4蚌卤、邏輯處理:
iOS
-
APP處于前臺(tái):
服務(wù)器端推送透?jìng)飨⒑螅苯釉趓eceive方法監(jiān)聽到:
但是這不是我們要的奥秆。我們需要的是用戶收到消息后在通知欄出現(xiàn)造寝,而不是直接在receive方法中做業(yè)務(wù)處理。那么我們可以看下上面官方常見問題第三點(diǎn)吭练,我們需要在消息中心創(chuàng)建一個(gè)本地消息:
plus.push.createMessage( str, "LocalMSG", options );
通過點(diǎn)擊通知中心的這個(gè)本地消息,進(jìn)入app實(shí)現(xiàn)click方法監(jiān)聽處理業(yè)務(wù)析显。
那么問題來了鲫咽,經(jīng)過測(cè)試我們發(fā)現(xiàn),在創(chuàng)建本地消息的時(shí)候(receive方法中)谷异,APP一定是處于前臺(tái)的分尸,那么創(chuàng)建了本地通知以后,我們的receive方法一定會(huì)監(jiān)聽到歹嘹,這樣不就進(jìn)入到一個(gè)死循環(huán)了么箩绍?
receive監(jiān)聽 -> 創(chuàng)建本地通知 -> receive再監(jiān)聽到本地通知 -> 再創(chuàng)建本地通知。尺上。材蛛。
子子孫孫無窮盡也圆到。
那么我們可以根據(jù)參考常見問題的第三點(diǎn):用戶在創(chuàng)建IOS本地消息是可以在“payload”節(jié)點(diǎn)添加特殊標(biāo)記對(duì)消息進(jìn)行區(qū)分。
這玩意是在創(chuàng)建消息的時(shí)候卑吭,官方模板自帶的一個(gè)參數(shù)芽淡。在個(gè)推后臺(tái)iOS透?jìng)鞯臅r(shí)候,有一個(gè):
這個(gè)其實(shí)只是就是把payload參數(shù)的值變成你的透?jìng)飨son豆赏,那么本地創(chuàng)建通知的時(shí)候這個(gè)值是什么呢挣菲?我們看上面創(chuàng)建本地通知的時(shí)候,第二個(gè)參數(shù)LocalMSG掷邦,這個(gè)就是我們自定義在本地推送的時(shí)候的payload參數(shù)的值白胀。所以,在receive方法中抚岗,我們根據(jù)payload參數(shù)的值是不是我們?cè)O(shè)定的LocalMSG就可以判斷監(jiān)聽到的推送是不是本地創(chuàng)建的了或杠。
-
APP處于后臺(tái):
當(dāng)APP處于后臺(tái),receive方法監(jiān)聽不到消息苟跪,此時(shí)消息走消息中心推送廷痘,點(diǎn)擊后進(jìn)入APP內(nèi),走click方法處理業(yè)務(wù)件已,滿足需求笋额。
Android
根據(jù)常見問題第二點(diǎn),我們知道在處理Android消息的時(shí)候篷扩,需要使用標(biāo)準(zhǔn)格式的透?jìng)鱦son:
{title:"通知標(biāo)題",content:"通知內(nèi)容",payload:"通知去干嘛這里可以自定義"}
這樣兄猩,透?jìng)飨⒕筒粫?huì)走receive方法,而是像我們需求那樣實(shí)現(xiàn)所有通知進(jìn)入通知中心鉴未,點(diǎn)擊通知中心走click方法處理枢冤。如果不按照此格式來,消息不會(huì)走消息中心铜秆,而是直接走監(jiān)聽的receive方法(APP在前臺(tái)時(shí)淹真,不在前臺(tái)時(shí),透?jìng)飨⑸踔帘O(jiān)聽不到)连茧。
需要注意的一點(diǎn)是:
Android透?jìng)鞲袷絳"title":"通知1","content":"通知內(nèi)容","payload":"{"type":"notify","payload":"通知去干嘛這里可以自定義"}"}如果想要傳輸自定義json核蘸,賦值給payload,但是里面的json必須是轉(zhuǎn)義過后的啸驯,且任何和官方規(guī)定格式在同一層的字段都是無效的客扎,例如:
{"id":"123","title":"通知1","content":"通知內(nèi)容","payload":"{type:\"notify\",ids:\"456\"}"}
這里面第一個(gè)id:"123"
在實(shí)際接收到的時(shí)候并不會(huì)存在。
5罚斗、總結(jié)
其實(shí)扯了一大堆徙鱼,簡(jiǎn)而言之就是一句話:
Android推送的時(shí)候要注意后臺(tái)返回的json滿足官方格式即可,iOS推送要注意當(dāng)APP在前臺(tái)的時(shí)候针姿,在receive方法監(jiān)聽的時(shí)候判斷是否是本地通知袱吆。
下面是我的部分關(guān)鍵代碼厌衙,alart()是測(cè)試階段為了看到效果加的:
//獲取推送通知
plus.push.addEventListener("receive", function (msg) {
alert("接收到的透?jìng)魍扑?" + JSON.stringify(msg));
if (plus.os.name == "iOS") {
switch (msg.payload) {
case "LocalMSG":
alert("本地創(chuàng)建消息的 " + JSON.stringify(msg));
break;
default:
//測(cè)試本地推送
createLocalPushMsg(msg);
break;
}
}
}, false);
//點(diǎn)擊推送進(jìn)來
plus.push.addEventListener("click", function (msg) {
// 判斷是從本地創(chuàng)建還是離線推送的消息
alert("點(diǎn)擊處理消息 " + JSON.stringify(msg));
}, false);
//創(chuàng)建本地消息
function createLocalPushMsg(msg) {
var options = {cover: false};
plus.push.createMessage(msg.content, "LocalMSG", options);
if (plus.os.name == "iOS") {
outLine('*如果無法創(chuàng)建消息,請(qǐng)到"設(shè)置"->"通知"中配置應(yīng)用在通知中心顯示!');
}
}