注意:
- 從HBuilderX 1.7.2起雾狈,uni-app支持UniPush旗们。
- 從HBuilderX 2.0.3 alpha起,5+App支持UniPush规婆。
- UniPush是DCloud推出的集成型統(tǒng)一推送服務(wù)耸峭,內(nèi)建了蘋(píng)果桩蓉、華為、小米劳闹、OPPO院究、魅族等手機(jī)廠商的系統(tǒng)級(jí)推送和個(gè)推等第三方推送。(vivo只對(duì)某些開(kāi)發(fā)者開(kāi)放)
架構(gòu)
推送消息類型
通常推送消息分以下兩種類型:
通知欄消息(推送通知)
UniPush推送服務(wù)定義好的推送樣式本涕、后續(xù)動(dòng)作的推送方式业汰,客戶端接收到后顯示在系統(tǒng)通知欄,用戶點(diǎn)擊通知欄消息啟動(dòng)APP(激活到前臺(tái))菩颖。透?jìng)飨ⅲㄍ扑]使用該方式)
即自定義消息样漆,UniPush推送服務(wù)只負(fù)責(zé)消息傳遞,不做任何處理晦闰,客戶端在接收到透?jìng)飨⒑笮枰约喝ヌ幚硐⒌恼故痉绞交蚝罄m(xù)動(dòng)作
UniPush推送服務(wù)對(duì)透?jìng)飨⒌臄?shù)據(jù)符合以下格式時(shí)做了特殊處理放祟,即符合該格式的透?jìng)飨?huì)自動(dòng)顯示到系統(tǒng)通知欄【需要確保app通知權(quán)限已打開(kāi)】
{"title": "xxx","content": "xxx","payload": "xxx"}
起步
在開(kāi)發(fā)者中心為應(yīng)用開(kāi)通UniPush
開(kāi)通之后在開(kāi)發(fā)者后臺(tái)可以直接推送消息,方便測(cè)試呻右」蛲祝【不能調(diào)試安裝,需云打包/自定義基座】
注:【由于沒(méi)有配置廠商通道所以此時(shí)我們的app只能在線接收消息声滥。但ios不用眉撵,既然提到就多說(shuō)一點(diǎn),配置ios推送服務(wù)必然要配置ios推送證書(shū),其實(shí)在制作iOS推送證書(shū)的時(shí)候可以直接制作一份發(fā)布環(huán)境的Push證書(shū)纽疟,因?yàn)樵撟C書(shū)發(fā)布和開(kāi)發(fā)環(huán)境都能用罐韩,何必做兩份呢。~抖機(jī)靈
蘋(píng)果推送不同于安卓污朽,他自有一套推送伴逸,配置好證書(shū),在線離線都能接收】
沒(méi)有配置廠商的只有最上面兩個(gè)輸入框膘壶,按要求填入對(duì)應(yīng)的信息然后推送,手機(jī)能收到推送就說(shuō)明基礎(chǔ)的配置完成了洲愤。
以上步驟可以向讓安裝了該軟件的設(shè)備(安卓在線) 群發(fā) 通知颓芭,他們或早或晚收到推送。
【沒(méi)有說(shuō)全部柬赐!推送服務(wù)并不可靠亡问,它會(huì)因?yàn)榫W(wǎng)絡(luò)、推送服務(wù)器肛宋、以及用戶設(shè)備州藕、等各種原因?qū)е缕┤?“為什么我收不到推送” 這種問(wèn)題。測(cè)試人員問(wèn)過(guò)我?guī)兹f(wàn)遍了酝陈,頭都痛床玻。它適用于推送一些活動(dòng)廣告,一些重要內(nèi)容沉帮,要求必達(dá)的信息不說(shuō)順豐锈死,東風(fēng)也不一定送的準(zhǔn)∧潞荆總之宗旨就是:收到了最好待牵,收不到算了】
群發(fā)可能并不滿足項(xiàng)目的需求,可能我們需要像并夕夕一樣喇勋,針對(duì)我買的 勞斯萊斯-幻影 單獨(dú)給我推送:尊敬的并夕夕高端用戶缨该;您全款購(gòu)買的 勞斯萊斯-幻影 已發(fā)貨,正在等待攬收川背。
它如何單獨(dú)推送到我的手機(jī)上贰拿,避免全世界都知道我的Rolls-Royce發(fā)貨提前去蹲點(diǎn)拆包的呢?
我們要與后端一起維護(hù)一個(gè)表,比如叫UserCID渗常。這個(gè)表包含我的基本賬戶信息壮不,以及CID。這個(gè)CID是客戶機(jī)ID的意思皱碘,是設(shè)備唯一標(biāo)識(shí)询一。我們要做的是一打開(kāi)app就去獲取CID,由于它不是天生就有,所以我們做一個(gè)定時(shí)器等到它為之。然后用戶登錄的時(shí)候健蕊,將這個(gè)唯一標(biāo)識(shí)伴隨我們的賬戶信息一起傳給服務(wù)器菱阵。服務(wù)器驗(yàn)證登錄成功的同時(shí)將它保存到UserCID.
// #ifdef APP-PLUS
getCID() {
var timer = setInterval(() => {
var info = plus.push.getClientInfo();
this.cid = info.clientid;
if (this.cid) {
clearInterval(timer);
console.log('獲取CID',this.cid)
}
}, 1000);
},
//#endif
當(dāng)需要給特定用用戶推送的時(shí)候,后臺(tái)通過(guò)UserCID查詢它的CID,然后推送的時(shí)候給推送服務(wù)器傳入該CID.(這是后端接入的時(shí)候所要做的)
然后到推送后臺(tái)推送消息势木,使用創(chuàng)建的cid.txt
里面寫(xiě)了幾個(gè)CID就將推送給幾個(gè)設(shè)備蛛倦,錯(cuò)的CID、失效的CID他也會(huì)算上啦桌,以實(shí)際到位為準(zhǔn)就好溯壶。
如果你測(cè)試的收到了,那你就算做對(duì)了甫男。
以上在線推送我們已經(jīng)做到了(安卓)且改,為了離線也能收到推送,我們需要配置安卓廠商通道板驳。
【推送是推送服務(wù)器向指定設(shè)備的指定app發(fā)送通知消息又跛,當(dāng)app在線,它知道是自己的郵件自己會(huì)接收<符合特定格式將展示在通知欄>笋庄。由于移動(dòng)設(shè)備的各種省電策略效扫、以及安全機(jī)制,會(huì)出現(xiàn)殺后臺(tái)的情況直砂,這樣在后臺(tái)的應(yīng)用說(shuō)不定某個(gè)時(shí)間就離線了菌仁,這時(shí)候郵件會(huì)保存在手機(jī)本地(類似學(xué)校門(mén)衛(wèi)),app什么時(shí)候醒了自己就去門(mén)衛(wèi)領(lǐng)郵件去了静暂。這時(shí)候可能就不夠及時(shí)济丘。為了離線也能將信息發(fā)送到用戶手機(jī)上,我們就需要借助手機(jī)系統(tǒng)洽蛀,讓他幫我們通知摹迷。(安卓出自谷歌,谷歌服務(wù)有推送郊供,國(guó)內(nèi)被墻峡碉,各廠商開(kāi)始在自己系統(tǒng)上集成推送服務(wù)。廠商通道)】
廠商通道申請(qǐng)以及配置流程
如果要更完善一些驮审,我們就要腦補(bǔ)一些情景鲫寄,比如我偶然一次忘了帶我的8848手機(jī)吉执,于是我借對(duì)面屌絲程序員的手機(jī)登錄并夕夕看看我的勞斯萊斯送到哪了。這時(shí)候它手機(jī)上的唯一標(biāo)識(shí)就也保存到了UserCID,并且關(guān)聯(lián)的是我的賬號(hào)地来。于是將來(lái)給我推送的時(shí)候戳玫,會(huì)給兩部手機(jī)推送,即便當(dāng)時(shí)借他手機(jī)看完物流就退出賬號(hào)了未斑。所以我們要在退出賬號(hào)的時(shí)候咕宿,把賬號(hào)和CID再給后臺(tái),讓后臺(tái)在UserCID中把該賬號(hào)名下的這個(gè)CID刪除蜡秽。
課外補(bǔ)充:
不論安卓府阀、IOS在app圖標(biāo)上都會(huì)顯示未讀消息角標(biāo)。提示的是未讀消息數(shù)量芽突。見(jiàn)過(guò)的手機(jī)不多肌似,本人自用小米、apple,初步判斷在安卓系統(tǒng)上角標(biāo)是由系統(tǒng)自己管理的诉瓦,當(dāng)用戶清理通知欄消息,或者將app激活到前臺(tái)力细,角標(biāo)會(huì)消失睬澡。下次有新的推送時(shí)會(huì)將角標(biāo)激活。
但是ios角標(biāo)是需要我們通過(guò)代碼管理的眠蚂,后臺(tái)可以知道未讀消息數(shù)量煞聪,前端通過(guò)接口獲取未讀消息數(shù)然后寫(xiě)到IOS角標(biāo)上。
setBadeg(newNum) {
//設(shè)置應(yīng)用圖標(biāo)的數(shù)量
plus.runtime.setBadgeNumber(newNum);
}
推送會(huì)增加未讀消息數(shù)逝慧,由此我們利用推送可以附帶參數(shù)的功能昔脯,讓后端在推送的時(shí)候直接將未讀消息數(shù)量告訴我們。這樣可以減少一點(diǎn)app的請(qǐng)求笛臣≡浦桑【注:推送附帶參數(shù)放在payload中】
//監(jiān)聽(tīng)接收透?jìng)飨⑹录?
plus.push.addEventListener('receive', (msg) => {
console.log('監(jiān)聽(tīng)接收透?jìng)飨⑹录?, msg);
uni.getSystemInfo({
success: (res) => {
console.log(res.platform);
if (res.platform == "ios") {
// console.log(msg.payload);
let num = parseInt(msg.payload.num);
this.setBadeg(num);
}
}
})
}, false);
當(dāng)用戶查看了消息,我們需要將角標(biāo)消息減一沈堡【渤拢【注:這是本地減一,并未從服務(wù)器獲取】
subBadeg() {
//導(dǎo)入ios UIApplication
var UIApplication = plus.ios.import("UIApplication");
var app = UIApplication.sharedApplication();
//獲取應(yīng)用圖標(biāo)的數(shù)量
var oldNum = app.applicationIconBadgeNumber();
var newNum = oldNum - 1;
//設(shè)置應(yīng)用圖標(biāo)的數(shù)量
plus.runtime.setBadgeNumber(newNum);
},
當(dāng)用戶點(diǎn)擊通知欄消息進(jìn)入app诞丽,我們也需要角標(biāo)減一鲸拥。
//監(jiān)聽(tīng)系統(tǒng)通知欄消息點(diǎn)擊事件
plus.push.addEventListener('click', (msg)=> {
console.log('監(jiān)聽(tīng)到消息點(diǎn)擊事件', msg);
uni.getSystemInfo({
success: (res) => {
// console.log(res.platform);
if (res.platform == "ios") {
this.subBadeg();
}
}
});
}, false);