從HBuilderX 1.7.2起,uni-app支持UniPush。
從HBuilderX 2.0.3 alpha起,5+App支持UniPush。
注意
- uniPush的客戶端jsapi不是uni.push,而是plus.push,詳見https://www.html5plus.org/doc/zh_cn/push.html。
- uniPush推送功能需提交雲端打包后才能生效,如需真機運行生效請使用自定義基座
概述
UniPush是DCloud推出的集成型統一推送服務,內建了蘋果、華為、小米、OPPO、魅族等手機廠商的系統級推送和個推等第三方推送。
國內Android的Push是一個混亂的世界,因為google的push服務器被牆,所以一些國內的安卓手機廠商各自做了自己的推送,比如華為小米魅族等,但還有很多國產手機廠商沒有提供官方推送方案。三方獨立公司如個推,則提供了獨立的push方案。
在沒有unipush以前,如果只使用三方push,會在很多國產手機上因為節電設置而無法保活push進程,導致無法推送。比如小米手機對三方推送封殺的比較厲害,App退出后很難成功發送push。
而如果每個安卓手機的官方push都集成一遍,這么多平台,工作量會非常巨大,管理維護也很麻煩。
uniPush解決了這個難題,開發者只需要開發一次。系統會自動在不同手機上選擇最可靠的推送通道發送push消息,保障送達率。
UniPush即降低了開發成本、又提高了push送達率,並且免費,是當前推送的最佳解決方案。有個unipush,開發者不應該再使用其他push方案了,其他方案都達不到unipush的效果。
UniPush推送服務由“個推”專為DCloud訂制提供技術支持,因此在服務端的集成與“個推·消息推送”完全一致。對於之前使用個推的開發者,可以平滑的遷移到uniPush方案上。
注意:UniPush推送服務必須重新向DCloud申請開通賬戶。
整體架構

推送消息類型
通常推送消息分以下兩種類型:
-
通知欄消息(推送通知)
UniPush推送服務定義好的推送樣式、后續動作的推送方式,客戶端接收到后顯示在系統通知欄,用戶點擊通知欄消息啟動APP(激活到前台)。 -
透傳消息
即自定義消息,UniPush推送服務只負責消息傳遞,不做任何處理,客戶端在接收到透傳消息后需要自己去處理消息的展示方式或后續動作。
UniPush推送服務對透傳消息的數據符合以下格式時做了特殊處理,將透傳消息顯示到系統通知欄復制代碼{"title": "xxx","content": "xxx","payload": "xxx"}
第一步:開通UniPush推送服務
UniPush僅支持uni-app類型項目,其它類型項目暫不支持
點此查看如何開通UniPush推送服務
注意:開通UniPush后,需在后台配置“廠商推送設置”,否則可能在服務端下發推送消息界面中不會顯示第三方廠商推送內容(如intent)
獲取廠商推送設置信息請參考:廠商推送應用創建配置流程
第二步:服務端下發推送消息
使用廠商推送下發推送消息必須設置intent,並且intent須符合格式,否則用戶點擊推送消息會導致無法啟動APP。intent數據格式如下:
復制代碼intent:#Intent;action=android.intent.action.oppopush;launchFlags=0x14000000;component=io.dcloud.HBuilder/io.dcloud.PandoraEntry;S.UP-OL-SU=true;S.title=測試標題;S.content=測試內容;S.payload=test;end
其中io.dcloud.HBuilder為APP包名,需要替換為自己APP的包名;
S.title=的值為推送消息標題,對應5+ API中PushMessage對象的title屬性值;
S.content=的值為推送消息內容,對應5+ API中PushMessage對象的content屬性值;
S.payload=的值為推送消息的數據,對應5+ API中PushMessage對象的payload屬性值;
launchFlags=0x14000000字段,解決接收多條通知后點擊可能無法觸發click事件的問題
通過開發者中心后台下發推送消息
登錄DCloud開發者中心,在“我創建的應用”列表中選擇應用,左側選擇“Uni Push”,打開消息推送頁面。
使用廠商通道必須使用“透傳消息”類型下發推送消息
通過服務端接口下發推送消息
服務端集成時首先需要獲取AppId、AppKey、MasterSecret參數,登錄DCloud開發者中心,在“Uni Push”下的“應用配置”頁面中獲取,如下圖所示:
參考“個推·消息推送”的服務端快速集成文檔http://docs.getui.com/
通過服務端接口下發推送消息使用廠商通道必須通過“透傳消息”類型下發推送消息
以下是php語言創建消息示例代碼:
復制代碼 $payload = '{"title":"測試標題","content":"測試內容","payload":"test"}'; $intent = 'intent:#Intent;action=android.intent.action.oppopush;launchFlags=0x14000000;component=io.dcloud.HBuilder/io.dcloud.PandoraEntry;S.UP-OL-SU=true;S.title=測試標題;S.content=測試內容;S.payload=test;end'; $template = new IGtTransmissionTemplate();//使用透傳消息模板 $template->set_appId(APPID);//應用appid $template->set_appkey(APPKEY);//應用appkey $template->set_transmissionType(2);//透傳消息類型 $template->set_transmissionContent($payload);//消息內容 $notify = new IGtNotify(); $notify->set_title('測試標題'); $notify->set_content('測試內容'); $notify->set_intent($intent); $notify->set_type(NotifyInfo_type::_intent); $template->set3rdNotifyInfo($notify);
- 多廠商推送透傳消息帶通知使用文檔(c#)
- 多廠商推送透傳消息帶通知使用文檔(java)
- 多廠商推送透傳消息帶通知使用文檔(php)
- 多廠商推送透傳消息帶通知使用文檔(python)
- 多廠商推送透傳消息帶通知使用文檔(restful)
第三步:客戶端處理推送消息
UniPush推送服務已經封裝好iOS&Android平台的原生集成工作,開發者只需要調用JS代碼處理推送消息的業務邏輯:
- 使用條件編譯直接調用5+ Push接口,參考5+ APP推送開發指南
- uni的客戶端jsapi仍然是plus.push,之前使用plus.push開發的代碼仍然可以使用。
- uni-app應用中使用UniPush推送服務參考https://ask.dcloud.net.cn/article/35726
注意事項
推送通道選擇邏輯
-
Android平台
APP在線(個推推送通道可用)
推送通知和透傳消息都使用個推的推送通道下發推送消息。
APP離線(個推推送通道不可用)
推送通知,使用個推離線推送通道,離線消息會存儲在消息離線庫,離線時間內APP在線后下發推送消息。
透傳消息,如果符合廠商推送的廠商手機(配置了手機廠商推送參數並且在對應廠商的手機上),則使用廠商推送通道下發推送消息;否則使用個推的離線推送通道,離線消息會存儲在消息離線庫,離線時間內APP在線后下發推送消息。 -
iOS平台
推送通知,不支持。
透傳消息,設置APN參數則通過蘋果的APNS通道下發推送消息,沒有設置APN參數則使用個推的推送通道下發。
華為廠商通道
在華為手機上必須安裝“華為移動服務”才能使用華為的廠商推送通道,首先確保手機上已經安裝“華為移動服務”應用。
如果在華為手機應用退出后無法接收到推送消息,可嘗試以下操作:
- 更新“華為移動服務”到最新版本;
- 進入手機“設置”,在[應用和通知]->[應用管理]->[華為移動服務]->[存儲]頁面選擇“刪除數據”。
重新啟動應用,退出后再此下發推送消息。
其它廠商通道
如果應用在線可以接收到推送消息,離線時使用廠商通道無法接收到推送消息,可參考多廠商推送接入流程及注意事項文檔(Android)
最后也可以咨詢個推客服,企業QQ:3007288187,或者在ask中@getui_johny
