主頁 > 移動端開發 > 推送服務接入指導(HarmonyOS篇)

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

2023-06-16 08:29:18 移動端開發

訊息推送作為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_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中的資料傳遞至客戶端應用,

  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 最新技術資訊~

轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/555308.html

標籤:Android

上一篇:Kotlin協程-那些理不清亂不明的關系

下一篇:返回列表

標籤雲
其他(161088) Python(38230) JavaScript(25498) Java(18240) C(15237) 區塊鏈(8271) C#(7972) AI(7469) 爪哇(7425) MySQL(7254) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5875) 数组(5741) R(5409) Linux(5347) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4598) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2435) ASP.NET(2404) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) .NET技术(1984) 功能(1967) HtmlCss(1967) Web開發(1951) C++(1940) python-3.x(1918) 弹簧靴(1913) xml(1889) PostgreSQL(1881) .NETCore(1863) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【從零開始擼一個App】Dagger2

    Dagger2是一個IOC框架,一般用于Android平臺,第一次接觸的朋友,一定會被搞得暈頭轉向。它延續了Java平臺Spring框架代碼碎片化,注解滿天飛的傳統。嘗試將各處代碼片段串聯起來,理清思緒,真不是件容易的事。更不用說還有各版本細微的差別。 與Spring不同的是,Spring是通過反射 ......

    uj5u.com 2020-09-10 06:57:59 more
  • Flutter Weekly Issue 66

    新聞 Flutter 季度調研結果分享 教程 Flutter+FaaS一體化任務編排的思考與設計 詳解Dart中如何通過注解生成代碼 GitHub 用對了嗎?Flutter 團隊分享如何管理大型開源專案 插件 flutter-bubble-tab-indicator A Flutter librar ......

    uj5u.com 2020-09-10 06:58:52 more
  • Proguard 常用規則

    介紹 Proguard 入口,如何查看輸出,如何使用 keep 設定入口以及使用實體,如何配置壓縮,混淆,校驗等規則。

    ......

    uj5u.com 2020-09-10 06:59:00 more
  • Android 開發技術周報 Issue#292

    新聞 Android即將獲得類AirDrop功能:可向附近設備快速分享檔案 谷歌為安卓檔案管理應用引入可安全隱藏資料的Safe Folder功能 Android TV新主界面將顯示電影、電視節目和應用推薦內容 泄露的Android檔案暗示了傳說中的谷歌Pixel 5a與折疊屏新機 谷歌發布Andro ......

    uj5u.com 2020-09-10 07:00:37 more
  • AutoFitTextureView Error inflating class

    報錯: Binary XML file line #0: Binary XML file line #0: Error inflating class xxx.AutoFitTextureView 解決: <com.example.testy2.AutoFitTextureView android: ......

    uj5u.com 2020-09-10 07:00:41 more
  • 根據Uri,Cursor沒有獲取到對應的屬性

    Android: 背景:呼叫攝像頭,拍攝視頻,指定保存的地址,但是回傳的Cursor檔案,只有名稱和大小的屬性,沒有其他諸如時長,連ID屬性都沒有 使用 cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DURATIO ......

    uj5u.com 2020-09-10 07:00:44 more
  • Android連載29-持久化技術

    一、持久化技術 我們平時所使用的APP產生的資料,在記憶體中都是瞬時的,會隨著斷電、關機等丟失資料,因此android系統采用了持久化技術,用于存盤這些“瞬時”資料 持久化技術包括:檔案存盤、SharedPreference存盤以及資料庫存盤,還有更復雜的SD卡記憶體儲。 二、檔案存盤 最基本存盤方式, ......

    uj5u.com 2020-09-10 07:00:47 more
  • Android Camera2Video整合到自己專案里

    背景: Android專案里呼叫攝像頭拍攝視頻,原本使用的 MediaStore.ACTION_VIDEO_CAPTURE, 后來因專案需要,改成了camera2 1.Camera2Video 官方demo有點問題,下載后,不能直接整合到專案 問題1.多次拍攝視頻崩潰 問題2.雙擊record按鈕, ......

    uj5u.com 2020-09-10 07:00:50 more
  • Android 開發技術周報 Issue#293

    新聞 谷歌為Android TV開發者提供多種新功能 Android 11將自動填表功能整合到鍵盤輸入建議中 谷歌宣布Android Auto即將支持更多的導航和數字停車應用 谷歌Pixel 5只有XL版本 搭載驍龍765G且將比Pixel 4更便宜 [圖]Wear OS將迎來重磅更新:應用啟動時間 ......

    uj5u.com 2020-09-10 07:01:38 more
  • 海豚星空掃碼投屏 Android 接收端 SDK 集成 六步驟

    掃碼投屏,開放網路,獨占設備,不需要額外下載軟體,微信掃碼,發現設備。支持標準DLNA協議,支持倍速播放。視頻,音頻,圖片投屏。好點意思。還支持自定義基于 DLNA 擴展的操作動作。好像要收費,沒體驗。 這里簡單記錄一下集成程序。 一 跟目錄的build.gradle添加私有mevan倉庫 mave ......

    uj5u.com 2020-09-10 07:01:43 more
最新发布
  • 推送服務接入指導(HarmonyOS篇)

    訊息推送作為App運營日常使用的用戶促活和召回手段,是與用戶建立持續互動和連接的良好方式。[推送服務](https://developer.huawei.com/consumer/cn/hms/huawei-pushkit?ha_source=hms1)(Push Kit)是華為提供的訊息推送平臺, ......

    uj5u.com 2023-06-16 08:29:18 more
  • Kotlin協程-那些理不清亂不明的關系

    > Kotlin的協程自推出以來,受到了越來越多Android開發者的追捧。另一方面由于它龐大的API,也將相當一部分開發者拒之門外。本篇試圖從協程的幾個重要概念入手,在復雜API中還原出它本來的面目,以全新的角度帶讀者走進Kotlin協程世界。 ### 什么是協程 在很多有關協程的文章中,描述協程 ......

    uj5u.com 2023-06-16 08:29:14 more
  • 社交直播語聊場景解決方案(一)商業化探索

    在過去幾年的直播行業創業風口期中,直播的用戶關注度瘋狂增長,但用戶質量卻參差不齊。隨著用戶新鮮感一過,流失率變得相當嚴重,各大平臺都在竭盡全力防御。然而,留住“湊熱鬧”的非直播受眾用戶并不是最關鍵的問題,而是要找到適合真實直播受眾用戶的商業化道路,才能保證行業的穩定繁榮。因此,我們需要探索有效的商業... ......

    uj5u.com 2023-06-16 08:29:10 more
  • Android RIL&IMS原始碼分析

    # 一、需求 1、了解IMS相關知識體系 2、RILD 與 RILJ、IMS回呼訊息的機制 # 二、相關概念 ## 2.1 IMS IMS全稱是IP Multimedia Subsystem,中文意義為IP多媒體子系統。IMS是一種基于IP基礎結構,能夠融合資料、話音和移動等網路技術的系統。 **I ......

    uj5u.com 2023-06-16 08:28:52 more
  • 還在為618電商推送方案煩惱?我們幫你做好了!

    618是每年重要的電商大促活動,熱度高流量大,是電商App吸引新用戶,提高用戶轉化率(購買率)的最好時機。對電商App運營來說,訊息推送是不可忽略的流量來源之一,適當的訊息推送可以召回用戶,提高用戶復購率。如何利用訊息推送功能在618電商節幫助App獲取流量并提高轉化率是運營需要關注的問題。 在回答 ......

    uj5u.com 2023-06-15 08:45:16 more
  • 還在為618電商推送方案煩惱?我們幫你做好了!

    618是每年重要的電商大促活動,熱度高流量大,是電商App吸引新用戶,提高用戶轉化率(購買率)的最好時機。對電商App運營來說,訊息推送是不可忽略的流量來源之一,適當的訊息推送可以召回用戶,提高用戶復購率。如何利用訊息推送功能在618電商節幫助App獲取流量并提高轉化率是運營需要關注的問題。 在回答 ......

    uj5u.com 2023-06-15 08:43:32 more
  • 沉思篇-剖析Jetpack的ViewModel

    > ViewModel做為架構組件的三元老之一,是實作MVVM的有力武器。 ### ViewModel的設計目標 ViewModel的基本功能就是管理UI的資料。其實,從職責上來說,這又是對Activity和Fragment的一次功能拆分。以前存盤在它們內部的資料,需要它們自己處理創建,更新,存盤, ......

    uj5u.com 2023-06-14 10:17:31 more
  • 插件化工程R檔案瘦身技術方案 | 京東云技術團隊

    隨著業務的發展及版本迭代,客戶端工程中不斷增加新的業務邏輯、引入新的資源,隨之而來的問題就是安裝包體積變大,前期各個業務模塊通過無用資源刪減、大圖壓碩訓轉上云、AB實驗業務邏輯下線或其他手段在降低包體積上取得了一定的成果。 ......

    uj5u.com 2023-06-14 10:17:13 more
  • 沉思篇-剖析Jetpack的ViewModel

    > ViewModel做為架構組件的三元老之一,是實作MVVM的有力武器。 ### ViewModel的設計目標 ViewModel的基本功能就是管理UI的資料。其實,從職責上來說,這又是對Activity和Fragment的一次功能拆分。以前存盤在它們內部的資料,需要它們自己處理創建,更新,存盤, ......

    uj5u.com 2023-06-14 10:16:47 more
  • 插件化工程R檔案瘦身技術方案 | 京東云技術團隊

    隨著業務的發展及版本迭代,客戶端工程中不斷增加新的業務邏輯、引入新的資源,隨之而來的問題就是安裝包體積變大,前期各個業務模塊通過無用資源刪減、大圖壓碩訓轉上云、AB實驗業務邏輯下線或其他手段在降低包體積上取得了一定的成果。 ......

    uj5u.com 2023-06-14 10:16:29 more