1. 程式人生 > >android接入華為推送

android接入華為推送

最近公司產品想要提高使用者體驗,便讓我研究一下華為推送的問題。其實推送最重要的就是程序保活的這個問題,這是一個比較棘手的問題。現在比較普遍的做法是整合多個廠商的推送,例如小米,華為,魅族推送等,再加一個另外的第三方推送(個推,極光,信鴿)。今天主要講的是華為推動接入的一些步驟和問題,而接入的版本是hms 2.5.2.300。

1、註冊成為華為開發者

2、新增應用以及點亮HMS權益

建立應用:

這裡寫圖片描述

然後申請push權益服務

這裡寫圖片描述

3、整合SDK

android studio整合的方法是Gradle+maven
1、開啟專案的build.gradle–>allprojects–>repositories配置maven倉庫
這裡寫圖片描述

2、新增專案依賴,在子專案的build.gradle–>dependencies
這裡寫圖片描述
其中2.5.2.300是版本號,以後有更新的版本出來,就直接在這裡改就好了
然後sync一下,這樣子就已經整合完畢了,是不是很方便呢ヽ( ̄▽ ̄)ノ

4、配置manifest

(1)新增許可權
這裡寫圖片描述

(2)新增APPID
這裡寫圖片描述

(3)新增一些特定的activity(跳轉所需的透明頁面)和provider(讀取升級檔案)
這裡寫圖片描述

(4)新增兩個receiver,用來接收廣播資訊
這裡寫圖片描述

(5)新增混淆
proguard-rules.pro檔案新增
-keep class com.huawei.hms.**

{*;}

(6)配置簽名
因為hms平臺上的應用要簽名的SHA256指紋,在android studio上就可以獲取,只需要在Terminal上輸入keytool -list -v -keystore 簽名地址 ,再輸入金鑰的密碼就OK了
這裡寫圖片描述

通過以上的步驟,準備工作就已經差不多了,剩下就是連線華為移動服務了

客戶端開發

1、連線華為移動服務

在Activity的onCreate方法裡面新增,同時實現ConnectionCallbacks, OnConnectionFailedListener兩個介面

//建立華為移動服務client例項用以使用華為push服務
//需要指定api為HuaweiId.PUSH_API
//連接回調以及連線失敗監聽 client = new HuaweiApiClient.Builder(this) .addApi(HuaweiPush.PUSH_API) .addConnectionCallbacks(this) .addOnConnectionFailedListener(this) .build(); //建議在oncreate的時候連線華為移動服務 //業務可以根據自己業務的形態來確定client的連線和斷開的時機,但是確保connect和disconnect必須成對出現 client.connect();
@Override
public void onConnected() {
    //華為移動服務client連線成功,在這邊處理業務自己的事件
    Log.i(TAG, "HuaweiApiClient 連線成功");
}

@Override
public void onConnectionSuspended(int arg0) {
    //HuaweiApiClient斷開連線的時候,業務可以處理自己的事件
    Log.i(TAG, "HuaweiApiClient 連線斷開");
    client.connect();
}

@Override
public void onConnectionFailed(ConnectionResult arg0) {
    Log.i(TAG, "HuaweiApiClient連線失敗,錯誤碼:" + arg0.getErrorCode());
}

@Override
protected void onDestroy() {
    super.onDestroy();
    //建議在onDestroy的時候停止連線華為移動服務
    //業務可以根據自己業務的形態來確定client的連線和斷開的時機,但是確保connect和disconnect必須成對出現
    client.disconnect();
}

2、獲取token

當連線成功之後,就要去獲取token。華為官方提供了兩種方法獲取token,分別是同步和非同步獲取,但是我們通常習慣性都是用非同步的方法獲取

/**
 * 使用非同步介面來獲取pushtoken
 * 結果通過廣播的方式傳送給應用,不通過標準介面的pendingResul返回
 * CP可以自行處理獲取到token
 * 同步獲取token和非同步獲取token的方法CP只要根據自身需要選取一種方式即可
 */
private void getTokenAsyn() {
    if(!client.isConnected()) {
        Log.i(TAG, "獲取token失敗,原因:HuaweiApiClient未連線");
        return;
    }
    PendingResult<TokenResult> tokenResult = HuaweiPush.HuaweiPushApi.getToken(client);
    tokenResult.setResultCallback(new ResultCallback<TokenResult>() {
        @Override
        public void onResult(TokenResult result) {
            //這邊的結果只表明介面呼叫成功,是否能收到響應結果只在廣播中接收,廣播這塊後面會有講到
        }   
    });
}

3、自定義廣播,獲取token,push連線狀態

/**
 * 應用需要建立一個子類繼承com.huawei.hms.support.api.push.PushReceiver,
 * 實現onToken,onPushState ,onPushMsg,onEvent,這幾個抽象方法,用來接收token返回,push連線狀態,透傳訊息和通知欄點選事件處理。
 * onToken 呼叫getToken方法後,獲取服務端返回的token結果,返回token以及belongId
 * onPushState 呼叫getPushState方法後,獲取push連線狀態的查詢結果
 * onPushMsg 推送訊息下來時會自動回撥onPushMsg方法實現應用透傳訊息處理。本介面必須被實現。 在開發者網站上傳送push訊息分為通知和透傳訊息
 *           通知為直接在通知欄收到通知,通過點選可以開啟網頁,應用 或者富媒體,不會收到onPushMsg訊息
 *           透傳訊息不會展示在通知欄,應用會收到onPushMsg
 * onEvent 該方法會在設定標籤、點選開啟通知欄訊息、點選通知欄上的按鈕之後被呼叫。由業務決定是否呼叫該函式。
 */
public class HuaweiPushRevicer extends PushReceiver {

    public static final String TAG = "HuaweiPushRevicer";

    @Override
    public void onToken(Context context, String token, Bundle extras) {
        String belongId = extras.getString("belongId");
        Log.i(TAG, "belongId為:" + belongId);
        Log.i(TAG, "Token為:" + token);

        System.out.println("Token為:" + token);
    }

    @Override
    public boolean onPushMsg(Context context, byte[] msg, Bundle bundle) {
        try {
            //CP可以自己解析訊息內容,然後做相應的處理
            String content = new String(msg, "UTF-8");
            Log.i(TAG, "收到PUSH透傳訊息,訊息內容為:" + content);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }

    public void onEvent(Context context, Event event, Bundle extras) {
        Intent intent = new Intent();
        intent.setAction(ACTION_UPDATEUI);
        intent.putExtra("type", 3);
        intent.putExtra("pushMsg", "收到通知欄訊息點選事件");
        context.sendBroadcast(intent);

        if (Event.NOTIFICATION_OPENED.equals(event) || Event.NOTIFICATION_CLICK_BTN.equals(event)) {
            int notifyId = extras.getInt(BOUND_KEY.pushNotifyId, 0);
            Log.i(TAG, "收到通知欄訊息點選事件,notifyId:" + notifyId);
            Toast.makeText(context,"通知欄點選事件",Toast.LENGTH_LONG).show();
            if (0 != notifyId) {
                NotificationManager manager = (NotificationManager) context
                        .getSystemService(Context.NOTIFICATION_SERVICE);
                manager.cancel(notifyId);
            }
        }

        String message = extras.getString(BOUND_KEY.pushMsgKey);
        super.onEvent(context, event, extras);
    }

    @Override
    public void onPushState(Context context, boolean pushState) {
        Log.i("TAG", "Push連線狀態為:" + pushState);

    }
}

最後,還要安裝華為移動服務,就可以使用了。
這裡寫圖片描述

效果演示

這裡寫圖片描述

這裡寫圖片描述

補充

1、有的時候經常錯誤碼是6003,這個是比較普遍的錯誤,通常都是沒有配置sha256簽名,或者說安裝的app沒有安裝對應的簽名
2、不能獲取token,要把應用和華為移動服務的自啟動許可權開啟;而在非華為手機上,例如我測試的這臺,有可能是有廣播限制,就是因為有酷狗app,所以廣播被限制了,解除安裝了就好。
3、如果還有問題的話,可以自己去拉取一下log,方法為:
第一步: adb shell setprop log.tag.hwpush VERBOSE
第二步: adb logcat –v time > D:\hwpush.log
抓日誌前,先關閉應用,到抓日誌的時候,在命令列輸入以上兩句,然後點選應用,一直到點選申請devicetoken之後過幾秒,關閉命令列,那麼在D盤上就可以看到一個hwpush.log的檔案,檢視關鍵字“pushlog”進行分析。