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