在談消息推送樣式之前,先來說說消息推送。
什么是消息推送?
簡而言之,就是你的app主動向用戶推送消息。在競爭日益激烈的應用市場,靈活運用消息推送,對用戶增長、促活和留存有很大的促進作用。
消息推送在不同推送類型中有不同的價值體現。
產品功能類推送
-
系統消息通知:社交屬性的app中的關注、贊評轉互動消息推送;購物app中物流信息通知等……
-
資訊活動通知:新聞媒體app的時效性訊息推送、游戲和知識等app的節假日活動、福利促銷信息推送等……
用戶運營類推送
-
沉默用戶喚醒:用主動觸及用戶的消息推送方式喚醒沉默用戶。
-
提高用戶活躍:結合福利活動等信息的推送,提高用戶的活躍。
消息推送預期效果的實現,需要推送內容、推送樣式以及時間節奏的完美結合。今天我們將詳解華為推送服務所提供的8種消息推送樣式及其實現方法,為你的應用用戶增長和活躍助力。
華為推送服務(Push Kit)是華為提供的消息推送平台,建立了從雲端到終端的消息推送通道。通過集成推送服務可以實時推送消息到用戶終端,構築良好的用戶關系,提升用戶的感知度和活躍度。
Push Kit當前支持多種文本樣式,Inbox樣式,按鈕樣式以及自定義圖標等樣式。你可定義極具個性化的消息來吸引用戶。本文通過簡單的代碼和效果展示,幫助你快速了解並上手華為Push消息。
消息樣式介紹
首先,借助官方開發文檔給出的示例,介紹通知欄消息的結構。
從上圖可以看出,通知欄消息從上到下依次包含消息小圖標、應用名稱、消息摘要、消息到達時間、標題、內容等部分。這其中,除了應用名稱,其他要素共同構成了通知欄消息自定義樣式。
作為各種樣式的對比,首先給大家展示最基本的通知欄消息樣式:
{ "validate_only": false, "message": { "android": { "notification": { "body": "簡要描述消息的內容,自由發揮啦", "click_action": { "type": 3 }, "title": "這里是消息標題" } }, "token": ["xxx"] } }
說明:一條通知欄消息,至少需要包含以上字段,否則無法發送。
下面,分別給大家講解各個樣式自定義的方式。
1)自定義消息小圖標
Push Kit提供了兩種設置通知欄消息小圖標的方法:
通過服務端API發送下行消息攜帶“icon”字段,圖標文件必須存放在應用的/res/raw路徑下,例如“res/raw/ic_launcher”,對應應用本地的“/res/raw/ic_launcher.xxx”
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
文件。
{
"android"
: {
"notification"
: {
"body"
:
"沒錯,消息小圖標可以自定義哦"
,
"click_action"
: {
"type"
: 3
},
"icon"
:
"/raw/custom_notification_icon"
,
"title"
:
"快看左上角小圖標"
}
},
"token"
: [
"xxx"
]
}
|
通過應用的“AndroidManifest.xml”文件添加meta-data元數據來實現,參考代碼如下:
<meta-data android:name="com.huawei.messaging.default_notification_icon" android:resource="@drawable/ic_push_notification" />
其中,meta-data元數據“name”不可改變,“resource”指定的資源圖標由您指定,需要在應用的“res/drawable”目錄下。
分析:對比兩種方法,方法1更加靈活,只需要提前把小圖標預置在客戶端,服務端就可以根據需要使用不同的小圖標。
2)自定義消息摘要
消息摘要展示在應用名右側,用於簡要描述消息的內容。通過服務端API中的“notify_summary”字段進行設置。
{ "validate_only": false, "message": { "android": { "notification": { "body": "簡要描述消息的內容,自由發揮啦", "click_action": { "type": 3 }, "notify_summary": "這里是摘要部分……", "title": "這里是消息標題", } }, "token": ["xxx"] } }
3)自定義消息到達時間(僅用於展示)
華為Push服務器一旦接收到開發者的消息推送請求,就會立即處理並發送給用戶。因此,消息實際到達用戶手機的時間是無法自定義的。但是,服務端API提供了用於通知欄消息展示、排序的自定義時間字段“when”。開發者一旦指定此參數,用戶通知欄的消息將根據此時間進行展示和排序。
上圖的測試中,兩條消息都是在10點左右發送並收到的,且上方消息發送時間早於下方消息。如果沒有設置“when”字段,圖片消息應該展示在下面。但是由於下方消息發送時使用“when”字段指定展示時間為"2021-04-29T01:26:23.045123456Z"。因此,實際在用戶手機上排序展示時,下方消息展示了“when”字段設置的時間。
{ "validate_only": false, "message": { "android": { "notification": { "body": "簡要描述消息的內容,自由發揮啦", "click_action": { "type": 3 }, "title": "這里是消息標題", "when": "2021-04-29T01:26:23.045123456Z" } }, "token": ["xxx"] } }
說明:此參數使用UTC時間,且必須小於當前時間。
4)自定義消息按鈕
通知欄消息支持添加多個按鈕,點擊按鈕可以觸發相應的動作。
{ "validate_only": false, "message": { "android": { "notification": { "body": "推送消息底部可添加多個按鈕,點擊按鈕可以出發相應的動作", "buttons": [{ "action_type": 0, "name": "了解更多" }, { "action_type": 3, "name": "任性忽視" }], "click_action": { "type": 3 }, "title": "震驚!這個推送樣式你必須了解" } }, "token": ["xxx"] } }
說明:按鈕動作類型:0:打開應用首頁,1:打開應用自定義頁面,2:打開指定的網頁,3:清除通知,4:華為分享功能;
“name”字段的值如果為英文,通知消息展示時按鈕名字會以全大寫字母展示。
上述消息,改變的主要是局部樣式,不涉及消息的title和body字段。這些樣式可以隨意搭配使用,相互之間不影響。
下面介紹的3種樣式,由於涉及title和body字段,因此相互之間存在一些影響,調用服務端API時不建議同時使用。
5)大文本樣式
早期版本推送服務,默認樣式下僅支持單行文本,單行文本支持的字數太少,會有表達不全的缺陷。大文本樣式支持標題單行,內容文字多行(當前EMUI 9系統限制最多顯示12行中文或者14行英文,EMUI 10&11系統限制最多顯示11行中文或者13行英文)。大文本展開后效果如下:
{ "validate_only": false, "message": { "android": { "notification": { "big_body": "大文本樣式支持標題單行,內容文字多行。當前EMUI 9系統限制最多顯示12行中文或者14行英文,EMUI 10&11系統限制最多顯示11行中文或者13行英文。", "big_title": "這里是大文本消息標題", "body": "簡要描述消息的內容,自由發揮啦", "click_action": { "type": 3 }, "style":1, "title": "這里是消息標題" } }, "token": ["xxx"] } }
說明
EMUI 9:大文本展開之前顯示的標題與內容取自“title”與“body”字段,非“big_title”與“big_body”字段的內容。
EMUI 10:大文本展開之前顯示的標題取自“title”字段,內容取自“big_body”字段。
6)Inbox樣式
此樣式也可以展示多行文本,但是不同於大文本樣式,Inbox樣式將每行內容都當作獨立的單行文本去展示。文本內容最多可展示5行,每行內容展示不了時后邊自動添加“...”。
{ "validate_only": false, "message": { "android": { "notification": { "body": "簡要描述消息的內容,自由發揮啦", "click_action": { "type": 3 }, "inbox_content": ["1.首先你需要找到一頭大象","2.好吃好喝把大象騙到冰箱旁","3.打開冰箱門","4.把大象塞進冰箱","5.關上冰箱門"], "style": 3, "title": "這里是消息標題" } }, "token": ["xxx"] } }
總結:
7)消息本地化展示
通知消息本地化又可以理解為國際化多語言展示,指的是通知消息可以根據手機本地語言變化展示對應語言的標題和內容,從而覆蓋本消息中普通的標題和內容。
Push Kit提供了兩種消息本地化展示的方法:
完全通過服務端提供的REST API接口實現;
{ "validate_only": false, "message": { "android": { "notification": { "body": "bbb", "body_loc_args": ["Jack"], "body_loc_key": "body_key", "click_action": { "type": 3 }, "multi_lang_key": { "title_key": { "en": "New Friend Request From %s", "zh": "來自%s的好友請求" }, "body_key": { "en": "My name is %s.", "zh": "我叫%s。" } }, "title": "ttt", "title_loc_args": ["Shanghai"], "title_loc_key": "title_key" } }, "token": ["xxx"] } }
說明:
1、“title_loc_key”、“body_loc_key”字段分別對應“multi_lang_key”中相關字段的名稱;
2、“title_loc_args”、“body_loc_args”字段的值都是一個可變的字符串數組,用於填充對應字段的值中的占位符%s;
3、“multi_lang_key”字段當前最多支持配置三種語言。
服務端REST API與應用本地的字符串資源文件“strings.xml”配合實現。
{ "validate_only": false, "message": { "android": { "notification": { "title": "ttt", "body": "bbb", "body_loc_args": ["Jack", "Shanghai"], "body_loc_key": "body_key", "click_action": { "type": 3 }, "title_loc_key": "title_key" } }, "token": ["xxx"] } }
在Android資源文件“/res/values/strings.xml”中定義字符串資源。
支持占位符,%后面是占位符的位置,從1開始,$后面是填充數據的類型。
支持多語言,比如“/res/values-en/strings.xml”進行英語本地化適配。
<string name="title_key">New Friend Request</string> <string name="body_key">My name is %1$s, I am from %2$s.</string>
在App中添加代碼,動態獲取可變字符串,並對資源節點進行字符串格式化,填充內容到占位符中。
public class DemoHmsMessageService extends HmsMessageService { @Override public void onMessageReceived(RemoteMessage message) { String[] bodyArrays = message.getNotification().getBodyLocalizationArgs(); // 獲取內容並進行格式化 String key = getResources().getString(R.string.body_key); String body = String.format(key, bodyArrays[0], bodyArrays[1]); Log.i(TAG, body); } }
分析:對比2種方法,方法1使用靈活,不需要改造客戶端代碼。但是方法2可以同時支持更多的語言,適用於全球化程度更高的應用。
>>訪問華為開發者聯盟官網,了解更多相關內容
>>獲取開發指導文檔
原文鏈接:https://developer.huawei.com/...
原作者:胡椒