前言:
害害害~我又來了阿~最近看到甲方需求中說要在APP中推送給用戶的待辦任務做消息提醒,提醒到手機通知欄那種,雖然之前也做過,但是也只是對別人代碼做修改,並未去疏通整個流程,而且此前項目是用的MUI,與uni開發有着明顯區別,做完了來記錄一下吧。
業務需求:推送消息至手機通知欄,點擊后打開APP或打開APP進入到指定頁面;
業務實現:使用uniapp推送服務uniPush完成消息推送。暫只包含安卓通知,ios設備后續補充。
操作環境:HbuilderX + 逍遙安卓模擬器
一、配置
使用HbuilderX的情況下可以直接在配置文件中App模塊作為入手點。
模塊配置頁
【在配置文件中的App模塊配置勾選Push消息推送—uniPush】點擊配置跳轉到Dcloud配置頁面完成相關配置后可以進行推送業務測試、操作。
推送配置頁
由於我在此已經完成了配置,所以以上是已完成的配置信息。包名自取,主要是簽名的獲取,如果使用自有證書就需要自己去查詢自己證書的簽名后填寫到對應位置即可。
推送管理頁
經過配置並且申請成功后,基礎的配置就暫時完成了,自動進入到了配置完成后的推送管理界面。
二、測試
配置完成后,接下來可以嘗試發送一條簡單的通知測試一下配置是否正確。
推送預覽
在什么配置都不做調整的情況下,直接預覽,如果你這時的環境是安卓模擬器+運行到HbuilderX標准基座,估計會出現以下狀況:
推送對象為全部用戶沒問題,你在模擬器上接受到了推送信息,嗯,很滿意。
但是你發現你的業務需求都是把內容推送給指定用戶,而不是全部用戶都要收到這個消息。然后你切換到選擇CID用戶等其他目標用戶時,就應該是無法接收到通知的了,會提示CID不存在或不屬於此應用。
預覽前發送框
為什么嘞?以下是官方解釋,大體就是說你用的是標准基座導致了一些配置都匹配不上,所以找不到CID。
怎么解決?不用標准基座唄,制作自定義基座會吧?打一個自定義基座的包就好了。打包時的包名記得改成與此前配置推送時的包名一致。
打好自定義基座后,運行—選擇:運行到自定義基座—運行到安卓模擬器。這時候再去重復上面的測試步驟,應該就可以發送到全部用於與CID用戶了。其他用戶暫未測試,后期補充。
CID的獲取請查看下方的應用部分文檔內容。
說了這么多,上面其實都是我們自己在測試Push的可行性,我們還得帶入到項目中。
三、應用
配置完成,測試通順之后,就可以帶入業務了。
其實前端只需要給后端提供相應的應用信息即可。后端會在某個時候去觸發消息推送,前端對收到的推送的消息做一點處理即可完成簡單的一個消息推送流程了。
查看生成的應用信息
接收到的推送消息會出現在設備的通知欄,點擊后會直接啟動APP並且執行對應的數據處理方法。
推送示例
獲取當前設備下的CID。CID在APP安裝后首次運行我們就可以獲取到,文檔上說是直接綁定在設備的存儲上的,不會因為后面的賬號切換或者卸載重裝APP操作而發生變化,特定情況除外。
//在入口文件APP.vue做如下配置: onLaunch: function() { this.handlePush(); this.getCid(); },
// 獲取CID getCid(){ // #ifdef APP-PLUS var t1_time = 0; var t1 = setInterval(function(){ var cid = plus.push.getClientInfo().clientid; console.log( cid!=undefined, cid!="undefined", cid) if(cid != null || cid != "null"){ uni.setStorageSync('cid',cid); clearInterval(t1); return } },130); // #endif },
// 監聽通知信息 handlePush() { // #ifdef APP-PLUS const _handlePush = function(message) { // 獲取自定義信息 let payload = message.payload; uni.switchTab({url:`${payload.path}`}) } // 事件處理 plus.push.addEventListener('click', _handlePush) plus.push.addEventListener('receive', _handlePush) // #endif },
以上是部分的基本處理方法,開發者可根據需求自行強化、補充。
如果遇到問題可以先去查看官方文檔,問題基本都有解決的方法。
如有錯誤遺漏歡迎補充。
后記:此前被問到使用unipush的擴展問題,比如在華為的系統中,關閉通知權限后通知會被殺死而無法顯示通知嗎?這是個好問題,留給大家去思考吧【狗頭】。