訊息推播作為App運營日常使用的使用者促活和召回手段,是與使用者建立持續互動和連線的良好方式。推播服務(Push Kit)是華為提供的訊息推播平臺,建立了從雲端到終端的訊息推播通道,本文旨在介紹HarmonyOS(Java)版本的功能及接入指導。
HarmonyOS(Java)版本主要功能為根據token推播通知欄和透傳訊息。HarmonyOS Java SDK為您的HarmonyOS應用開發提供推播訊息相關的介面,適用於手機和平板。
您可以輸入目標使用者的Push Token來推播訊息,一次最多可填1000個Push Token。
透傳訊息是由使用者端應用負責處理的訊息。終端裝置收到Push雲端傳送的資料或指令後不直接展示,而是將資料傳遞給應用,由應用解析內容,並觸發相關動作(如跳轉網頁、應用內頁面等等)。您可以自定義訊息樣式,從而更高效靈活地推播訊息。
透傳訊息的到達率受Android系統和應用是否駐留在後臺影響,推播服務不保證透傳訊息的高到達率。
透傳訊息的常用場景:VoIP呼叫、語音播報、好友互動通知等。
具體開發準備請參考官網。
Token是推播令牌,每個裝置上的每個應用的Token都是唯一存在的,使用者端呼叫getToken方法向Push伺服器端請求應用的Token,您可以根據Push伺服器端返回的Token嚮應用推播訊息。當getToken方法返回為空時,可通過onNewToken方法獲取Token值。
建議將Push Token上報到您自己的應用伺服器,並定時更新Token列表。您可以呼叫下行訊息API,根據這些Token批次推播訊息。
public class TokenAbilitySlice extends AbilitySlice {
private static final HiLogLabel LABEL_LOG = new HiLogLabel(HiLog.LOG_APP, 0xD001234,
"TokenAbilitySlice");
private void getToken() {
// 建立新執行緒
new Thread("getToken") {
@Override
public void run() {
try {
// 從agconnect-services.json檔案中讀取client/app_id
String appId = "your APP_ID";
// 輸入token標識"HCM"
String tokenScope = "HCM";
// 獲取Push Token
String token = HmsInstanceId.getInstance(getAbility().getAbilityPackage(), TokenAbilitySlice.this).getToken(appId, tokenScope);
} catch (ApiException e) {
// 獲取Push Token失敗時,列印錯誤碼
HiLog.error(LABEL_LOG, "get token failed, the error code is %{public}d", e.getStatusCode());
}
}
}.start();
}
}
public class DemoHmsMessageServiceAbility extends HmsMessageService {
private static final HiLogLabel LABEL_LOG = new HiLogLabel(HiLog.LOG_APP, 0xD001234, "DemoHmsMessageServiceAbility");
@Override
// 獲取Token
public void onNewToken(String token) {
HiLog.info(LABEL_LOG, "onNewToken called, token:%{public}s", token);
}
@Override
// 獲取Token失敗,列印錯誤碼
public void onTokenError(Exception exception) {
HiLog.error(LABEL_LOG, "get onNewtoken error, error code is %{public}d", ((ZBaseException)exception).getErrorCode());
}
}
在您的service(已繼承HmsMessageService)中,覆寫onMessageReceived方法,只要您傳送透傳訊息至終端裝置,都會獲得透傳訊息的內容。
public class DemoHmsMessageServiceAbility extends HmsMessageService {
private static final HiLogLabel LABEL_LOG = new HiLogLabel(HiLog.LOG_APP, 0xD001234,
"DemoHmsMessageServiceAbility");
@Override
public void onMessageReceived(ZRemoteMessage message) {
// 列印訊息的內容欄位
HiLog.info(LABEL_LOG, "get token, %{public}s", message.getToken());
HiLog.info(LABEL_LOG, "get data, %{public}s", message.getData());
ZRemoteMessage.Notification notification = message.getNotification();
if (notification != null) {
HiLog.info(LABEL_LOG, "get title, %{public}s", notification.getTitle());
HiLog.info(LABEL_LOG, "get body, %{public}s", notification.getBody());
}
}
}
• 您可以登入AppGallery Connect網站傳送訊息,詳情請參見HarmonyOS應用推播訊息。
• 您可以使用伺服器端API嚮應用推播訊息:
POST /oauth2/v3/token HTTP/1.1
Host: oauth-login.cloud.huawei.com
Content-Type: application/x-www-form-urlencoded
grant_type=client_credentials&client_id=<使用者端ID>&client_secret=<使用者端金鑰>
響應範例如下:
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Cache-Control: no-store
{
"access_token": "<返回的Access Token>",
"expires_in": 3600,
"token_type": "Bearer"
}
HTTPS POST URL:
POST https://push-api.cloud.huawei.com/v1/clientid/messages:send
請求訊息頭範例:
Content-Type: application/json; charset=UTF-8
Authorization: Bearer CF3Xl2XV6jMK************************DgAPuzvNm3WccUIaDg==
請求訊息體(通知欄訊息)範例:
{
"validate_only": false,
"message": {
"android": {
"notification": {
"title": "test title",
"body": "test body",
"click_action": {
"type": 3
}
}
},
"token": ["pushtoken1"]
}
}
您可以自定義點選通知欄訊息的動作,例如:開啟應用首頁、開啟網頁URL和開啟應用自定義頁面。
• 您可以通過AppGallery Connect推播訊息,設定點選通知動作為開啟應用、App頁面為首頁。
• 您可以通過伺服器端API推播訊息:
訊息體中攜帶click_action欄位,type取值為3表示點選訊息後開啟應用首頁。
{
"validate_only": false,
"message": {
"android": {
"notification": {
"title": "test title",
"body": "test body",
"click_action": {
"type": 3
}
}
},
"token": ["pushtoken1"]
}
}
• 您可以通過AppGallery Connect推播訊息,設定點選通知動作為開啟網頁。
• 您可以通過伺服器端API推播訊息:
訊息體中攜帶click_action欄位,type取值為2表示點選訊息後開啟網頁。
{
"validate_only": false,
"message": {
"android": {
"notification": {
"title": "test title",
"body": "test body",
"click_action": {
"type": 2,
"url":"https://www.huawei.com"
}
}
},
"token": ["pushtoken1"]
}
}
{
"orientation": "unspecified",
"name": "com.test.java.MyActionAbility",
"icon": "$media:icon",
"description": "$string:myactionability_description",
"label": "$string:entry_MyActionAbility",
"type": "page",
"launchType": "standard",
"skills": [
{
"entities": ["entity.system.default"],
"actions": ["com.test.myaction"]
}
]
}
您也可以通過伺服器端API推播訊息。訊息體中攜帶click_action和action欄位,type取值為1表示點選訊息後開啟應用自定義頁面,action取值為上一步中定義的actions的值。
{
"validate_only": false,
"message": {
"android": {
"notification": {
"title": "test title",
"body": "test body",
"click_action": {
"type": 1,
"action":"com.test.myaction"
}
}
},
"token": ["pushtoken1"]
}
}
您推播訊息時可攜帶data欄位,當用戶點選訊息時通過下述方法將data中的資料傳遞至使用者端應用。
• 通過AppGallery Connect推播訊息且設定自定義鍵值對。
• 通過伺服器端API推播訊息,訊息體中攜帶data欄位。
{
"validate_only": false,
"message": {
"android": {
"notification": {
"title": "test title",
"body": "test body",
"click_action": {
"type": 1,
"action":"com.test.myaction"
}
},
"data": "{'key_data':'value_data'}"
},
"token": ["pushtoken1"]
}
}
public class MainAbilitySlice extends AbilitySlice {
private static final HiLogLabel LABEL_LOG = new HiLogLabel(HiLog.LOG_APP, 0xD001234, "myDemo");
@Override
public void onStart(Intent intent) {
HiLog.info(LABEL_LOG, "MainAbilitySlice get started...");
super.onStart(intent);
super.setUIContent(ResourceTable.Layout_ability_main);
// 呼叫解析方法
parseIntent(intent);
}
private void parseIntent(Intent intent){
if (intent == null){return;}
IntentParams intentParams = intent.getParams();
if (intentParams == null) {return;}
// 獲取data欄位中的鍵值對
String key = "key_data";
Object obj = intentParams.getParam(key);
try{
// 列印data欄位中的鍵值對
HiLog.info(LABEL_LOG, "my key: %{public}s, my value: %{public}s", key, obj);
}catch (Exception e){
HiLog.info(LABEL_LOG, "catch exception : " + e.getMessage());
}
}
}
瞭解更多詳情>>
關注我們,第一時間瞭解 HMS Core 最新技術資訊~