Uni-App之推送[UniPush]

注意:
  1. 從HBuilderX 1.7.2起雾狈,uni-app支持UniPush旗们。
  2. 從HBuilderX 2.0.3 alpha起,5+App支持UniPush规婆。
  3. 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.png

推送消息類型

通常推送消息分以下兩種類型:

  • 通知欄消息(推送通知)
    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ū),在線離線都能接收】


窩窩頭.img

沒(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í)候所要做的)

前端要驗(yàn)證是否完成自己的職責(zé)缩功,可以獲取到自己的CID,然后新建一個(gè)txt,將自己的CID復(fù)雜進(jìn)去晴及,切不要多打空格什么的,多個(gè)CID用回車分隔嫡锌,總之不要做一些畫(huà)蛇添足的東西虑稼,否則可能解析失敗。

然后到推送后臺(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);

設(shè)置角標(biāo)的方式多種多樣,從服務(wù)器獲取未讀也好僧免,本地計(jì)算也好刑赶,憑具體情況以及個(gè)人喜好。

>以上內(nèi)容僅為個(gè)人見(jiàn)解懂衩,有誤歡迎指出撞叨。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末金踪,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子谒所,更是在濱河造成了極大的恐慌热康,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,695評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件劣领,死亡現(xiàn)場(chǎng)離奇詭異姐军,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)尖淘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)奕锌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人村生,你說(shuō)我怎么就攤上這事惊暴。” “怎么了趁桃?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,130評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵辽话,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我卫病,道長(zhǎng)油啤,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,648評(píng)論 1 297
  • 正文 為了忘掉前任蟀苛,我火速辦了婚禮益咬,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘帜平。我一直安慰自己幽告,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,655評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布裆甩。 她就那樣靜靜地躺著冗锁,像睡著了一般。 火紅的嫁衣襯著肌膚如雪嗤栓。 梳的紋絲不亂的頭發(fā)上蒿讥,一...
    開(kāi)封第一講書(shū)人閱讀 52,268評(píng)論 1 309
  • 那天,我揣著相機(jī)與錄音抛腕,去河邊找鬼芋绸。 笑死,一個(gè)胖子當(dāng)著我的面吹牛担敌,可吹牛的內(nèi)容都是我干的摔敛。 我是一名探鬼主播,決...
    沈念sama閱讀 40,835評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼全封,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼马昙!你這毒婦竟也來(lái)了桃犬?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,740評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤行楞,失蹤者是張志新(化名)和其女友劉穎攒暇,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體子房,經(jīng)...
    沈念sama閱讀 46,286評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡形用,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,375評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了证杭。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片田度。...
    茶點(diǎn)故事閱讀 40,505評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖解愤,靈堂內(nèi)的尸體忽然破棺而出镇饺,到底是詐尸還是另有隱情,我是刑警寧澤送讲,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布奸笤,位于F島的核電站,受9級(jí)特大地震影響哼鬓,放射性物質(zhì)發(fā)生泄漏揭保。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,873評(píng)論 3 333
  • 文/蒙蒙 一魄宏、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧存筏,春花似錦宠互、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,357評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至善茎,卻和暖如春券册,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背垂涯。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,466評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工烁焙, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人耕赘。 一個(gè)月前我還...
    沈念sama閱讀 48,921評(píng)論 3 376
  • 正文 我出身青樓骄蝇,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親操骡。 傳聞我的和親對(duì)象是個(gè)殘疾皇子九火,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,515評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • 由于谷歌服務(wù)在國(guó)內(nèi)不能用赚窃,Android 的推送真是一大痛點(diǎn),但也推動(dòng)了國(guó)內(nèi)一批做第三方服務(wù)的廠商岔激。第三方推送...
    U卡技術(shù)閱讀 6,646評(píng)論 1 10
  • 點(diǎn)擊查看原文 Web SDK 開(kāi)發(fā)手冊(cè) SDK 概述 網(wǎng)易云信 SDK 為 Web 應(yīng)用提供一個(gè)完善的 IM 系統(tǒng)...
    layjoy閱讀 13,785評(píng)論 0 15
  • 前言 本文是一篇轉(zhuǎn)載文章勒极,在這一篇實(shí)用的文章里,你可以按照上面的步驟實(shí)現(xiàn)不借助第三方和服務(wù)器端虑鼎,自己給自己的設(shè)備發(fā)...
    進(jìn)無(wú)盡閱讀 1,674評(píng)論 6 6
  • 推送 推送簡(jiǎn)直就是一種輕量級(jí)的騷擾方式 自從有了推送辱匿,各個(gè)公司基本上都在使用推送,這確實(shí)是一個(gè)比較好的提醒方式震叙,A...
    eclipse_xu閱讀 7,998評(píng)論 9 116
  • 寫(xiě)在前面:應(yīng)用場(chǎng)景很重要 如果你的公司有這樣一個(gè)硬性的需求:用戶將APP退出到后臺(tái)的時(shí)候掀鹅,當(dāng)該用戶收到推送的時(shí)候,...
    CoderZb閱讀 5,488評(píng)論 14 13