訊息推送作為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批量推送訊息,
- 創建一個新的執行緒,并呼叫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();
}
}
- 在您的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向應用推送訊息:
- 您的服務器呼叫華為帳號服務器的介面(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"
}
- 您的服務端呼叫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"]
}
}
打開應用自定義頁面
- 客戶端應用先創建自定義頁面(以“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"]
}
]
}
- 您可以通過AppGallery Connect推送訊息,設定點擊通知動作為打開應用、App頁面為自定義action頁面(action請輸入上一步中定義的actions的值),
您也可以通過服務端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中的資料傳遞至客戶端應用,
- 推送訊息時攜帶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"]
}
}
- 在客戶端應用開發點擊訊息跳轉的頁面獲取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 最新技術資訊~
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/555308.html
標籤:Android
下一篇:返回列表