个推推送模板详解
背景
作為專業(yè)的消息推送服務(wù)商,個(gè)推為開發(fā)者提供了不同種類的推送模板,以實(shí)現(xiàn)相應(yīng)的推送功能。推送模板可以單用,也可以組合使用。為幫助APP開發(fā)者更快速地找到適合的推送模板,實(shí)現(xiàn)所想要的推送效果,我們寫下這篇教學(xué)普及貼,希望可以幫到大家。
?
推送樣式
個(gè)推提供了不同的推送樣式,比如系統(tǒng)樣式、展開式通知樣式。
ps. setLogo的圖片需要在客戶端開發(fā)時(shí)嵌入(main-res),否則無法展示;
pps. setLogo 和 setLogoUrl 可以二選一。如果二者都設(shè)置了,則 setLogoUrl 優(yōu)先級比setLogo高,但是小米、華為等有些機(jī)型并不支持該功能,因此,開發(fā)者要慎選;
?ppps. small logo圖片沒有可以修改的服務(wù)端接口,展示客戶端內(nèi)置的圖片,默認(rèn)值是push_small.png,很多手機(jī)(比如小米)改過其展示效果,這部分的小圖標(biāo)不一定能顯示出來;
?
系統(tǒng)樣式,展開式通知樣式具體代碼如下:
?????? //系統(tǒng)樣式
???? public static AbstractNotifyStyle getStyle0() {
??????? Style0 style = new Style0();
??????? style.setTitle("這是你想要的標(biāo)題");
??????? style.setText("這是你想要的內(nèi)容");
??????? style.setLogo("push.png");//配置通知欄圖標(biāo),需要在客戶端開發(fā)時(shí)嵌入
??????? style.setLogoUrl("");//配置通知欄網(wǎng)絡(luò)圖標(biāo)
??????? style.setRing(true); //設(shè)置通知是否響鈴
??????? style.setVibrate(true); //設(shè)置通知是否震動(dòng)
??????? style.setClearable(true); //設(shè)置通知是否可清除
??????? //Android 8.0 以上支持的
??????? style.setChannel("通知渠道id");
??????? style.setChannelName("通知渠道名稱");
??????? style.setChannelLevel(3);
??????? return style;
??? }
???
??? //展開式通知樣式
???? public static AbstractNotifyStyle getStyle6() {
??????? Style6 style = new Style6();
??????? style.setTitle("這是你想要的標(biāo)題");
??????? style.setText("這是你想要的內(nèi)容");
??????? style.setLogo("push.png"); //配置通知欄圖標(biāo),需要在客戶端開發(fā)時(shí)嵌入
??????? style.setLogoUrl(""); //配置通知欄網(wǎng)絡(luò)圖標(biāo)
??????? // 兩種方式選一種
??????? style.setBigStyle1("bigImageUrl"); //設(shè)置大圖+文本樣式
????????????? //style.setBigStyle2("bigText"); //設(shè)置長文本+文本樣式
??????? style.setRing(true);
??????? style.setVibrate(true);
??????? style.setClearable(true);
??????? style.setChannel("通知渠道id");
??????? style.setChannelName("通知渠道名稱");
??????? style.setChannelLevel(3);
??????? return style;
??? }
效果圖
?以小米8手機(jī) Android 9版本為例,推送效果如下(為了脫敏,直接用個(gè)推demo自帶的圖標(biāo))
?
上述代碼中提到了安卓8.0系統(tǒng)中開始支持的通知渠道,具體的字段含義解釋如下。
setChannel表示通知渠道id,是渠道的唯一標(biāo)識,其默認(rèn)值為“Default”? ;setChannelName表示通知渠道名稱,用戶可在手機(jī)“設(shè)置”中查看,其默認(rèn)值也為“Default”。 ?setChannelName長度建議設(shè)置在40Byte以內(nèi),超出會(huì)被安卓8.0系統(tǒng)自動(dòng)縮減。? setChannelLevel表示設(shè)置通知渠道的重要性,其默認(rèn)值為3。具體操作過程中值有五種可供選擇:0、1、2、3、4;設(shè)置之后不能修改,展示形式如下:
0:無聲音,無震動(dòng),不顯示。
1:無聲音,無震動(dòng),鎖屏不顯示,通知欄中內(nèi)容被折疊顯示,導(dǎo)航欄無logo。
?2:無聲音,無震動(dòng),鎖屏和通知欄都予以顯示,通知不喚醒屏幕。
?3:有聲音,有震動(dòng),鎖屏和通知欄中都予以顯示,通知喚醒屏幕。
?4:有聲音,有震動(dòng),亮屏下通知懸浮展示,鎖屏通知以默認(rèn)形式展示且喚醒屏幕。
ppps. channel設(shè)置完后,就不能再對channelLevel進(jìn)行修改,只能新建一個(gè)新的channel。這是安卓原生的限制;
?
?
推送模板
到此,大家應(yīng)該已經(jīng)了解了想要推送的展示效果,但是需要什么樣的模板來實(shí)現(xiàn)具體的通知效果呢?各位請繼續(xù)往下看。
?
通知 & 啟動(dòng)應(yīng)用
采用下述代碼用戶可以在通知欄看到一條含圖標(biāo)、標(biāo)題等的通知,當(dāng)他點(diǎn)擊后可以激活應(yīng)用,到達(dá)應(yīng)用首頁。
??????? NotificationTemplate template = new NotificationTemplate();
??????? template.setAppId(APPID);
??????? template.setAppkey(APPKEY);
??????? template.setStyle(getStyle0()); //設(shè)置展示樣式,具體見推送樣式部分
?
通知 &啟動(dòng)應(yīng)用 & 透傳
這種方式在前一種的基礎(chǔ)上,加了透傳(這部分內(nèi)容用戶是看不到的)。通過透傳可以達(dá)到不同的效果,比如更新用戶信息。
??????? NotificationTemplate template = new NotificationTemplate();
??????? template.setAppId(APPID);
??????? template.setAppkey(APPKEY);
??????? template.setStyle(getStyle0());
??????? template.setTransmissionType(1); // 透傳消息設(shè)置;1:立即啟動(dòng)APP;2:客戶端收到消息后需要自行處理
??????? template.setTransmissionContent("透傳內(nèi)容");
???????
?
通知 & 打開網(wǎng)頁
下述代碼用戶可以在通知欄看到一條含圖標(biāo)、標(biāo)題等的通知。當(dāng)他點(diǎn)擊通知、啟動(dòng)手機(jī)瀏覽器,便可以打開該通知所設(shè)置好的頁面。
??????? LinkTemplate template = new LinkTemplate();
??????? template.setAppId(APPID);
??????? template.setAppkey(APPKEY);
??????? template.setStyle(getStyle0());
??????? template.setUrl("http://www.baidu.com");? //設(shè)置打開的網(wǎng)址地址
?
通知 & 啟動(dòng)應(yīng)用打開intent
這是我們最常見的方方式:點(diǎn)擊通知,打開APP內(nèi)指定的頁面。
??????? StartActivityTemplate template = new StartActivityTemplate();
??????? template.setAppId(APPID);
??????? template.setAppkey(APPKEY);
??????? template.setStyle(getStyle0());
??????? String intent = "intent:#Intent;component=com.yourpackage/.NewsActivity;end";//這部分寫法不清楚的,可以咨詢安卓客戶端的童鞋
??????? template.setIntent(intent); //最大長度限制為1000,很重要
?
透傳
如果大家有一些個(gè)性化需求,比如想要自己定義所要實(shí)現(xiàn)的展示效果,那么可以用純透傳的方式。
??????? TransmissionTemplate template = new TransmissionTemplate();
??????? template.setAppId(APPID);
??????? template.setAppkey(APPKEY);
??????? template.setTransmissionType(2);// // 透傳消息設(shè)置;1:立即啟動(dòng)APP;2:客戶端收到消息后需要自行處理,如果設(shè)置為1,對用戶使用不友好,不推薦使用
??????? template.setTransmissionContent("透傳內(nèi)容");
?
消息撤回
這個(gè)功能很實(shí)用,當(dāng)App運(yùn)營者不小心發(fā)送了不當(dāng)?shù)南?#xff0c;可以立馬撤回。
??????? RevokeTemplate template = new RevokeTemplate();
??????? template.setAppId(APPID);
??????? template.setAppkey(APPKEY);
??????? template.setOldTaskId(taskId); //指定需要撤回消息對應(yīng)的taskId
??????? template.setForce(false); //客戶端沒有找到對應(yīng)的taskid,是否把對應(yīng)appid下所有的通知都撤回
?
消息覆蓋
比如足球比賽實(shí)時(shí)比分播報(bào),用戶只想知道最新比分,我們就可以選擇“消息覆蓋”方式的推送模板。
前面代碼中提到的StartActivityTemplate 、LinkTemplate 、 NotificationTemplate 都有一個(gè)方法:setNotifyid(Integer notifyid)。在消息推送的時(shí)候設(shè)置notifyid,當(dāng)有覆蓋需求時(shí),使用相同的notifyid發(fā)一條新的消息,客戶端sdk會(huì)根據(jù)notifyid對應(yīng)的前一條消息進(jìn)行覆蓋。
?
iOS推送
你可能發(fā)現(xiàn)了前面所講的都是基于安卓推送的操作, iOS的操作相對會(huì)比較特殊。邏輯是當(dāng)APP在線時(shí),個(gè)推消息推送會(huì)直接把透傳內(nèi)容發(fā)送到手機(jī)上,需要客戶端解析后予以展示;當(dāng)APP離線時(shí),推送會(huì)采用APNs通道,由iPhone的系統(tǒng)通道通知并展示消息。iOS推送可以采用TransmissionTemplate模板,根據(jù)setAPNInfo(Payload apn)法來設(shè)置具體參數(shù)。
具體參數(shù)基本上按照iOS官網(wǎng)的字段來進(jìn)行命名,應(yīng)該會(huì)比較容易上手。這里附上iOS官網(wǎng)文檔鏈接。
個(gè)推iOS推送參考代碼如下:
private static APNPayload getAPNPayload() {
??????? APNPayload payload = new APNPayload();
??????? //在已有數(shù)字基礎(chǔ)上加1顯示,設(shè)置為-1時(shí),在已有數(shù)字上減1顯示,設(shè)置為數(shù)字時(shí),顯示指定數(shù)字
??????? payload.setAutoBadge("+1");
??????? payload.setContentAvailable(1);
??????? //ios 12.0 以上可以使用 Dictionary 類型的 sound
??????? payload.setSound("default");
??????? payload.setCategory("$由客戶端定義種類");
??????? payload.addCustomMsg("由客戶自定義消息key", "由客戶自定義消息value");
??????? payload.setAlertMsg(getDictionaryAlertMsg());? //字典模式
??????? //設(shè)置語音播報(bào)類型,int類型,0.不可用 1.播放body 2.播放自定義文本
??????? payload.setVoicePlayType(2);
??????? //設(shè)置語音播報(bào)內(nèi)容,String類型,非必須參數(shù),用戶自定義播放內(nèi)容,僅在voicePlayMessage=2時(shí)生效
??????? //注:當(dāng)"定義類型"=2, "定義內(nèi)容"為空時(shí)則忽略不播放
??????? payload.setVoicePlayMessage("定義內(nèi)容");
??????? //添加多媒體資源,可以是圖片、音頻、視頻,最多可以添加3條多媒體
??????? payload.addMultiMedia(new MultiMedia().setResType(MultiMedia.MediaType.pic)
? ??????????????.setResUrl("資源文件地址")
??????????????? .setOnlyWifi(true));//設(shè)置是否在WIFI下才展示多媒體消息,如果設(shè)置true但未使用WIFI時(shí)會(huì)展示成普通通知
??????? return payload;
??? }
?private static APNPayload.DictionaryAlertMsg getDictionaryAlertMsg() {
??????? APNPayload.DictionaryAlertMsg alertMsg = new APNPayload.DictionaryAlertMsg();
??????? alertMsg.setBody("body1");
??????? alertMsg.setActionLocKey("顯示關(guān)閉和查看兩個(gè)按鈕的消息");
??????? alertMsg.setLocKey("loc-key1");
??????? alertMsg.addLocArg("loc-ary1");
??????? alertMsg.setLaunchImage("調(diào)用已經(jīng)在應(yīng)用程序中綁定的圖形文件名");
??????? alertMsg.setTitle("通知標(biāo)題");
??????? alertMsg.setTitleLocKey("自定義通知標(biāo)題");
??????? alertMsg.addTitleLocArg("自定義通知標(biāo)題組");
??????? return alertMsg;
??? }
??? /**
???? * 需要使用iOS語音傳輸,請使用VoIPPayload代替APNPayload
???? * 需要相關(guān)證書才可以使用此功能
? ???*/
??? private static VoIPPayload getVoIPPayload() {
??????? VoIPPayload payload = new VoIPPayload();
??????? JSONObject jo = new JSONObject();
??????? jo.put("key1", "value1");
??????? payload.setVoIPPayload(jo.toString());
??????? return payload;
??? }
?
總結(jié)
個(gè)推推送模板提供了系統(tǒng)樣式和展開通知樣式,但是開發(fā)者請務(wù)必要注意:Android和iOS的代碼推送方式是不同的。推送iOS消息,只能用TransmissionTemplate透傳模板;推送Android消息,可以使用TransmissionTemplate透傳模板和NotificationTemplate、LinkTemplate、StartActivityTemplate、RevokeTemplate通知類模板。為提供更優(yōu)質(zhì)的推送服務(wù),個(gè)推持續(xù)優(yōu)化產(chǎn)品功能,豐富推送模板,同時(shí)將于近期推出基于Restful的v2接口,以更加符合開發(fā)者的使用習(xí)慣,敬請期待。
?
?
總結(jié)