推播服務接入指導(HarmonyOS篇)

2023-06-15 15:00:24

訊息推播作為App運營日常使用的使用者促活和召回手段,是與使用者建立持續互動和連線的良好方式。推播服務(Push Kit)是華為提供的訊息推播平臺,建立了從雲端到終端的訊息推播通道,本文旨在介紹HarmonyOS(Java)版本的功能及接入指導。

HarmonyOS(Java)版本主要功能為根據token推播通知欄和透傳訊息。HarmonyOS Java SDK為您的HarmonyOS應用開發提供推播訊息相關的介面,適用於手機和平板。

根據Push Token推播訊息

您可以輸入目標使用者的Push Token來推播訊息,一次最多可填1000個Push Token。

透傳訊息

透傳訊息是由使用者端應用負責處理的訊息。終端裝置收到Push雲端傳送的資料或指令後不直接展示,而是將資料傳遞給應用,由應用解析內容,並觸發相關動作(如跳轉網頁、應用內頁面等等)。您可以自定義訊息樣式,從而更高效靈活地推播訊息。

透傳訊息的到達率受Android系統和應用是否駐留在後臺影響,推播服務不保證透傳訊息的高到達率。

透傳訊息的常用場景:VoIP呼叫、語音播報、好友互動通知等。

開發準備

具體開發準備請參考官網

應用開發

獲取Push Token

Token是推播令牌,每個裝置上的每個應用的Token都是唯一存在的,使用者端呼叫getToken方法向Push伺服器端請求應用的Token,您可以根據Push伺服器端返回的Token嚮應用推播訊息。當getToken方法返回為空時,可通過onNewToken方法獲取Token值。

建議將Push Token上報到您自己的應用伺服器,並定時更新Token列表。您可以呼叫下行訊息API,根據這些Token批次推播訊息。

  1. 建立一個新的執行緒,並呼叫getToken方法獲取Push Token(建議在應用啟動後的首個Ability中呼叫getToken方法)。
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();
    }
}
  1. 在您的service(已繼承HmsMessageService)中,覆寫onNewToken方法,當Token發生變化時以onNewToken方法返回。
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嚮應用推播訊息:

  1. 您的伺服器呼叫華為帳號伺服器的介面(https://oauth-login.cloud.huawei.com/oauth2/v3/token)請求憑證Token。請求範例如下:
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"
}
  1. 您的伺服器端呼叫API推播訊息,請求範例如下。

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和開啟應用自定義頁面。

開啟App首頁

• 您可以通過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"]
    }
}

開啟應用自定義頁面

  1. 使用者端應用先建立自定義頁面(以「MyActionAbility」為例),在您專案的「entry/src/main」目錄下的「config.json」檔案中新增該Ability的skills欄位。其中entities的值為「entity.system.default」不可改變,actions的值由您自定義(以「com.test.myaction」為例)。
{
    "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"]    
        } 
    ]
}
  1. 您可以通過AppGallery Connect推播訊息,設定點選通知動作為開啟應用、App頁面為自定義action頁面(action請輸入上一步中定義的actions的值)。

您也可以通過伺服器端API推播訊息。訊息體中攜帶click_actionaction欄位,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中的資料傳遞至使用者端應用。

  1. 推播訊息時攜帶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"]
    }
}
  1. 在使用者端應用開發點選訊息跳轉的頁面獲取data欄位的功能,此處以點選訊息跳轉到應用首頁(MainAbilitySlice)獲取data欄位為例。
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 聯盟官網

獲取HMS Core 開發指導檔案

關注我們,第一時間瞭解 HMS Core 最新技術資訊~