簡單集成華爲PUSH

最近需要使用到華爲push,就研究了一下。但是上網搜索了,都說,華爲push是一個大坑。我暫且不說遇到的坑,只是說,最基礎的集成。我是用的IDE是Android Studio,這裏只講解有關於Android Studio的集成方式,Eclipse大神請繞步。

首先要註冊一個賬號,進入華爲開發者聯盟官網, 點擊管理中心。

然後進入管理中心頁面,我們在選擇push服務

我們進入到了push頁面,我們就可以做一些操作了。首先創建一個應用。

點擊申請push服務,我們可以看到,創建應用時需要寫一些信息。

按照自己的項目進行選擇創建。需要注意的一點是,我們發現他需要的SHA256證書指紋可以有多個,是因爲。你的項目有可能會有多個指紋證書,都可以寫在上面。這個SHA256證書指紋不能填寫DeBug模式下的指紋。需要的是release模式下的指紋證書。所以,我們需要先進行apk打包。這裏我就不多講述了。

獲取SHA256指紋證書我說一下吧。

首先打開cmd命令窗口。找到我們的keystore文件。也就是jks文件,輸入命令keytool -list -v -keystore 你的jks文件名.jks 

如果輸入成功按下回車,會讓你輸入密碼,但是輸入密碼時是無狀態的,就輸入生成jks文件的密碼就行。然後你就能得到你的SHA256證書指紋了。

完成以上纔是完成了第一步,在平臺創建應用。

下面再看華爲文檔。不得不說,如果一步一步按文檔集成還是很靠譜的,就是有時候,你不知道它想表達些什麼,可能我理解能力有限,嘿嘿。我們先下載文檔提供的SDK。SDK入口隨處可見,在你的PUSH頁面,創建好的應用上方有幾個選項,我們選擇SDK下載。會發現,進入了消息推送服務文檔中心。我們就根據文中心,一步一步的集成華爲push。

先下載SDK,這裏是新版SDK,由於舊版的不在維護,我們就不做集成講解。

下載過後,你會得到一個HMSAgent_2.6.3.301文件夾,打開它

你會看到這麼幾個文件。點擊運行GetHMSAgent_cn.bat程序,根據提示一步一步集成

首先輸入包名,包名在你的AndroidManifest.xml文件中就能得到。appid是你在華爲push服務平臺上創建的應用的appid

cpid,我們可以不用填,那是在集成遊戲和支付時,纔會使用到的。

我們只需要集成push服務,其它的都選擇0就可以,按任意鍵結束後,打開copysrc文件夾。一直往裏點,我們會得到如下文件。

這就是我們所需要的PUSH服務SDK了。將其copy到我們的工程中去,由於位置不同,我們需要再我們的項目中,將這些文件中的導包路徑修改一下,是個體力活。

修改完成,確認無報錯的情況下,我們再看文檔。

我們還需要在我們的IDE裏面添加倉庫路徑,我使用的是Android Studio。Eclipse我暫時還沒有使用。

在項目的gradle裏面寫上如上路徑

在app.gradle裏填寫依賴

 dependencies {
    compile 'com.huawei.android.hms:push:{version}'         
  }        

說明:{version} 替換爲實際的版本號,如:compile 'com.huawei.android.hms:push:2.6.3.301'  

更多在往下看有接入準備開發準備開發指南。都有詳細的集成開發說明。

我們是做Android的,所以進入客戶端開發指南,服務端請移步服務端開發指南

首先會進行一個功能說明,我們往下看,會看到一個新舊版本的SDK對比。我說過,它的舊版的SDK已不在維護,我就不多做講解了。還能看到華爲PUSH支持的國家和地區。因爲它是華爲提供的push服務,在其它品牌的手機上無法使用。它只支持emui4.1以上的版本。其它的它不支持。再往下看就是正文了。

注:以下均爲華爲push推送服務客戶端開發指南文檔資料。

第一步,初始化Agent。

1.1 調用init接口

在application的onCreate方法中初始化HMSAgent。如果沒有自己的application類,請創建並在manifest文件中配置application節點的name屬性。

示例代碼如下:

public class MyApplication extends Application {
    @Override
    public void onCreate() {        
        super.onCreate();
        HMSAgent.init(this);
    }
}   

1.2 調用connect接口

建議在應用啓動時調用Connect。
示例代碼如下:

HMSAgent.connect(this, new ConnectHandler() {
    @Override
    public void onConnect(int rst) {
        showLog("HMS connect end:" + rst);
    }
});    

第二步 申請Push token

2.1 場景介紹

       通過調用getToken接口向服務端請求應用的唯一標識——Device Token,Push服務端根據這個token發送推送消息。每個設備的上每個應用的Token都是唯一存在。您可以在自定義廣播中的onToken方法接收返回的token字符串,並且將token上報到自己的應用服務器維護這些已申請的token列表,然後調用Push服務器的推送消息接口,根據token批量推送消息。

2.2受限說明

getToken接口只有在服務端開通了Push服務申請token纔會返回成功。目前僅中國區和部分海外地區支持開通push服務

目前華爲推送支持的地區有(支持的地區後期可能有所增加):
       中國大陸,泰國, 越南 ,中國香港 ,中國臺灣 ,柬埔寨 斯里蘭卡,印度,中國澳門,新加坡,馬來西亞,澳大利亞,新西蘭,菲律賓,印度尼西亞,孟加拉國。
        約旦,埃及,阿爾及利亞,馬裏,也門,乍得,塞內加爾,突尼斯,阿拉伯聯合酋長國,阿曼,巴基斯坦,巴林,卡塔爾,科威特,沙特阿拉伯,伊拉克。
        墨西哥,委內瑞拉,哥倫比亞,厄瓜多爾,危地馬拉,尼加拉瓜,薩爾瓦多,洪都拉斯,哥斯達黎加,巴拿馬,多米尼加共和國,牙買加,波多黎各,阿根廷,玻利維亞,巴拉圭,祕魯,烏拉圭,智利。
        南非,盧旺達,安哥拉,博茨瓦納,布隆迪,津巴布韋,肯尼亞,馬達加斯加,馬拉維,毛里求斯,坦桑尼亞,烏干達,贊比亞,尼日利亞,加納,喀麥隆,象牙海岸,剛果(金)。
        阿爾巴尼亞,奧地利,比利時,荷蘭,葡萄牙,挪威,愛爾蘭,意大利,法國,德國,西班牙,瑞典,英國,芬蘭,希臘,冰島,波蘭,羅馬尼亞,塞爾維亞,斯洛文尼亞,斯洛伐克,黑山,克羅地亞,保加利亞,列支敦士登,盧森堡,馬耳他,科索沃,拉脫維亞,丹麥,愛沙尼亞,立陶宛,波斯尼亞和黑塞哥維那,匈牙利,馬其頓,摩爾多瓦,捷克共和國,塞浦路斯。

注意:getToken接口在非中國區發貨設備或非華爲手機上首次調用時,會顯示華爲Push用戶協議條款界面(如下圖)。建議在Activity頁面裏再調用getToken接口。    

       中國區發貨的華爲設備不會顯示該協議條款界面。

2.3 業務流程

2.4 開發步驟

       申請token會觸發啓動Push服務,token申請成功後,結果會通過廣播的方式返回token給應用。調用getToken方法發起請求,返回申請token的PendingResult對象,根據對象可以獲取接口調用是否成功,但是不直接返回token 結果。

       接口詳細定義請參見getToken,申請token的示例代碼如下:

/**
 * 獲取token
 */
private void getToken() {
    showLog("get token: begin");
    HMSAgent.Push.getToken(new GetTokenHandler() {
        @Override
        public void onResult(int rtnCode, TokenResult tokenResult) {
            showLog("get token: end" + rtnCode);
        }
    }); 
}    

 調用getToken接口後通過廣播接收token值
       下面的示例代碼實現如何處理onToken接口來獲取push token。CP需要將token妥善的保存起來。如果CP自己實現了調用華爲PUSH服務器端接口發送推送消息,那麼可以推送消息到指定的Token用戶。如果有涉及到在客戶端和服務器之前傳輸Token,請確保Token的安全。

public class HUAWEIPushRevicer extends PushReceiver {
    
    @Override
    public void onToken(Context context, String token, Bundle extras) {
               
    }
}   

3 註銷 token

3.1 場景介紹

       應用調用註銷TOKEN接口成功之後,客戶端就不會再接收到PUSH消息。

3.2 受限說明

       建議APP集成時暫時不要依賴deleteToken接口;如果應用要實現註銷TOKEN後不接收PUSH消息,需要自行上報失效TOKEN到應用自己的服務器,並且在推送消息時判斷是失效TOKEN就不進行推送。

注意:該接口只在華爲手機並且EMUI版本號不低於5.1的版本上才起作用,即只在EMUI5.1以及更高版本的華爲手機上調用該接口後纔不會收到PUSH消息。
在非華爲手機上則必須滿足HMS版本不低於2.5.0。    

3.3 開發步驟

       調用註銷token接口,實現註銷token的示例代碼如下:

/**
 * 刪除token | delete push token
 */
private void deleteToken(){
    showLog("deleteToken:begin");
    HMSAgent.Push.deleteToken(token, new DeleteTokenHandler() {
        @Override
        public void onResult(int rst) {
            showLog("deleteToken:end code=" + rst);
        }
    });
}

4 獲取push連接狀態

4.1 場景介紹

       查看Push通道是否已連接,結果會通過自定義廣播裏的onPushState方法返回。

4.2 受限說明

       此接口在之後的版本中會逐漸廢棄,請業務謹慎使用。

4.3 開發步驟

4.3.1 調用查詢Push連接狀態接口

      實現查詢PUSH連接狀態的示例代碼如下:

 /**
  * 獲取push狀態 | Get Push State
  */
  private void getPushStatus() {
      showLog("getPushState:begin");
      HMSAgent.Push.getPushState(new GetPushStateHandler() {
          @Override
          public void onResult(int rst) {
              showLog("getPushState:end code=" + rst);
          }
      });
   }  

4.3.2 通過廣播接收Push連接狀態

      下面的代碼示例代碼實現如何處理onPushState接口。
       當push處於連接狀態的時候,才能正常接收push消息。

public class HuaweiPushRevicer extends PushReceiver {
    private static final String TAG = "HuaweiPushRevicer";

    public static final String ACTION_UPDATEUI = "action.updateUI";
    public static final String ACTION_TOKEN = "action.updateToken";



    private static List<IPushCallback> pushCallbacks = new ArrayList<IPushCallback>();
    private static final Object CALLBACK_LOCK = new Object();

    public interface IPushCallback {
        void onReceive(Intent intent);
    }

    public static void registerPushCallback(IPushCallback callback) {
        synchronized (CALLBACK_LOCK) {
            pushCallbacks.add(callback);
        }
    }

    public static void unRegisterPushCallback(IPushCallback callback) {
        synchronized (CALLBACK_LOCK) {
            pushCallbacks.remove(callback);
        }
    }

    @Override
    public void onToken(Context context, String tokenIn, Bundle extras) {
        String belongId = extras.getString("belongId");

        Intent intent = new Intent();
        intent.setAction(ACTION_TOKEN);
        intent.putExtra(ACTION_TOKEN, tokenIn);
        callBack(intent);

        intent = new Intent();
        intent.setAction(ACTION_UPDATEUI);
        intent.putExtra("log", "belongId is:" + belongId + " Token is:" + tokenIn);
        callBack(intent);
    }

    @Override
    public boolean onPushMsg(Context context, byte[] msg, Bundle bundle) {
        try {
            //CP可以自己解析消息內容,然後做相應的處理 | CP can parse message content on its own, and then do the appropriate processing
            String content = new String(msg, "UTF-8");
            Intent intent = new Intent();
            intent.setAction(ACTION_UPDATEUI);
            intent.putExtra("log", "Receive a push pass message with the message:" + content);
            callBack(intent);
        } catch (Exception e) {
            Intent intent = new Intent();
            intent.setAction(ACTION_UPDATEUI);
            intent.putExtra("log", "Receive push pass message, exception:" + e.getMessage());
            callBack(intent);
        }
        return false;
    }

    public void onEvent(Context context, Event event, Bundle extras) {
        Intent intent = new Intent();
        intent.setAction(ACTION_UPDATEUI);

        int notifyId = 0;
        if (Event.NOTIFICATION_OPENED.equals(event) || Event.NOTIFICATION_CLICK_BTN.equals(event)) {
            notifyId = extras.getInt(BOUND_KEY.pushNotifyId, 0);
            if (0 != notifyId) {
                NotificationManager manager = (NotificationManager) context
                        .getSystemService(Context.NOTIFICATION_SERVICE);
                manager.cancel(notifyId);
            }
        }

        String message = extras.getString(BOUND_KEY.pushMsgKey);
        intent.putExtra("log", "Received event,notifyId:" + notifyId + " msg:" + message);
        callBack(intent);
        super.onEvent(context, event, extras);
    }

    @Override
    public void onPushState(Context context, boolean pushState) {
        Intent intent = new Intent();
        intent.setAction(ACTION_UPDATEUI);
        intent.putExtra("log", "The Push connection status is:" + pushState);
        callBack(intent);
    }

    private static void callBack(Intent intent) {
        synchronized (CALLBACK_LOCK) {
            for (IPushCallback callback : pushCallbacks) {
                if (callback != null) {
                    callback.onReceive(intent);
                }
            }
        }
    }


}

集成如上,基本上就ok了。注意,你需要安裝release類型的apk才行,因爲你的keystore證書指紋是release類型的。

可以查看push連接狀態,根據返回的結果碼判斷是否成功集成。查看錯誤通用碼。返回0說明連接成功了,可以自己試着去平臺發送一條信息試一下。token是你的廣播的onToken方法返回的,需要稍等片刻才能看到,畢竟心急吃不了熱豆腐嘛,嘿嘿。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章