華爲 HMS Core Push 3.0+ 集成小結

       Push 推送拉活一直對應用起着重要做用;目前國內 Android 推送平臺並未徹底達成一致,和尚應需求嘗試接入 華爲廠商 Push 並簡單記錄接入過程當中遇到的各種問題;

推送集成

1. 環境搭建

      集成廠商 Push 首先須要配置平臺環境,官網介紹足夠清晰,其中須要注意的是生成簽名證書指紋,官網採用 Windows 環境下生成配置 SHA256Mac 環境下亦是如此;java

  1. 生成打包須要的 key 文件;android

  2. 【終端】-> keytool -list -v -keystore 便可;web

  1. 將獲取的 SHA256 配置在相應位置便可;json

2. 獲取 Token

      Push Token 在每臺設備每一個應用都是惟一存在的,但也並不是一直不變,在以下狀況下可能會變動,因此和尚建議每次使用最新的 Token 進行處理;微信

      在 EMUI10.0 及以上版本的華爲設備上,getToken 接口直接獲取 Token,低於該版本時經過 onNewToken 獲取 Token,注意 getToken 方法中傳遞的 Context 必須爲 Activityapp

private void getToken() {
    new Thread() {
        @Override
        public void run() {
            try {
                String appId = AGConnectServicesConfig.fromContext(FloatWindowActivity.this).getString("client/app_id");
                pushtoken = HmsInstanceId.getInstance(FloatWindowActivity.this).getToken(appId, "HCM");
                if (!TextUtils.isEmpty(pushtoken)) {
                    Log.i(TAG, "get token:" + pushtoken);
                    showLog(pushtoken);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }.start();
}

@Override
public void onNewToken(String s) {
    super.onNewToken(s);
    Log.i(TAG, "receive token:" + s);
}

3. 透傳類消息推送

      集成過推送的朋友都瞭解,推送分爲 通知類消息透傳類消息透傳類消息 雖到達率沒有 通知類消息 高,但使用更加靈活,和尚簡單嘗試一下;ide

      華爲透傳類消息經過繼承的 HmsMessageService 接收,在 onMessageReceived 方法中進行內容的解析,在後臺發送時能夠設置固定的 key-value 方式也能夠設置自定義參數,和尚採用更通用的自定義消息內容方式,組織一個 json 串進行解析;測試

      須要注意的是,透傳類消息經過 onMessageReceived 接收到內容以後並不會展現 Notification,須要咱們自行處理;和尚在Android 8.0 適配小博客中有簡單介紹,此處不作贅述;ui

public class HWPushService extends HmsMessageService {
    private static final String TAG = "HWPushService";

    @Override
    public void onNewToken(String s) {
        super.onNewToken(s);
        if (!Empty.check(s)) {
            SpSetting.setHWToken(s);
        }
    }

    @Override
    public void onMessageReceived(RemoteMessage message) {
        if (message.getData().length() > 0) {
            if (message.getData() != null) {
                // 解析 json 並彈出 Notification 或其餘
                PushManager.handlePushMessage(getApplicationContext(), message.getData());
            }
        }
    }
}

4. 通知類消息推送

      通知類消息 再集成 SDK 後能夠直接使用,到達率較高,能夠設置打開首頁或其餘操做,但使用上並無那麼靈活;通知類消息 發送以後會自動打開 Notification,且送達的時機咱們沒法獲取,其點擊事件咱們也沒法靈活操做;this

      和尚嘗試屢次後,發現能夠設置通知動做爲打開應用,app 頁面爲自定義頁面,咱們能夠經過打開新的頁面來操做點擊事件;

  1. 添加 DeepLink 打開頁面 Activity

public class HWNotifyActivity extends BaseActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Intent intent = getIntent();
        if (null != intent) {
            String dataStr = intent.getDataString();
            Log.e("===DeepLink===", dataStr);
            int indexStart = dataStr.indexOf("{");
            int indexEnd = dataStr.lastIndexOf("}")+1;
            String paramsStr = dataStr.substring(indexStart, indexEnd);
            // 解析 json 並處理業務邏輯
        }
    }
}
  1. AndroidManifest 中註冊 HWNotifyActivity,並自由設置 host/path/scheme 參數;

<activity android:name=".HWNotifyActivity">
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <data
            android:host="com.ace.ace_demo02"
            android:path="/deeplink"
            android:scheme="pushscheme" />

    </intent-filter>
</activity>
  1. 按照 host/path/scheme 配置的參數發送打開 app 頁面路徑;

5. 通知類消息點擊

      和尚在測試 通知類消息 解析時採用兩種方式:

  1. 根據 intent.getData().getQueryParameter("params") 方式獲取每一個拼接參數;此方法是根據 & 進行區分,但若是和尚測試數據中包含 & 時,沒法徹底解析;

// 測試數據
pushscheme://com.ace.ace_demo02/deeplink?name=和尚&age=12

pushscheme://com.ace.ace_demo02/deeplink?name=和尚&age=12&url=http://www.baidu.com?name=和尚&age=12
Log.e("===DeepLink===""==name=="+intent.getData().getQueryParameter("name"));
Log.e("===DeepLink===""==age=="+intent.getData().getQueryParameter("age"));
Log.e("===DeepLink===""==url=="+intent.getData().getQueryParameter("url"));

  1. params 設置爲一個 json 格式體,只解析當前一個參數,獲取 json 以後根據業務邏輯進行處理;這樣就能夠實現和 透傳類消息 相同的點擊事件類;
// 測試數據
pushscheme://com.ace.ace_demo02/deeplink?params={
  "id""01",
  "name""和尚",
  "age""123",
  "url""http://www.baidu.com?name=和尚&age=12"
}
int indexStart = dataStr.indexOf("{");
int indexEnd = dataStr.lastIndexOf("}")+1;
String paramsStr = dataStr.substring(indexStart, indexEnd);
JSONObject json_test = getJsonItemInnerConfig(this, paramsStr);
Log.e("===DeepLink===""==c=name=="+json_test.optString("name"));
Log.e("===DeepLink===""==c=age=="+json_test.optString("age"));
Log.e("===DeepLink===""==c=url=="+json_test.optString("url"));


      和尚剛接入華爲 HMS Core Push,接入方法簡單而實用,其餘高級的方式和尚暫未涉及,有待進一步研究,若有錯誤請多多指導!

來源: 阿策小和尚

本文分享自微信公衆號 - 阿策小和尚(gh_8297e718c166)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索