使用極光推送實現分組傳送和服務端整合

ldear發表於2017-08-21

推送功能在手機應用開發中越來越重要,幾乎成為所有App必備的功能,由於Android本身沒有訊息推送機制,通常採用的是基於XMPP協議的推送,但這種開發很麻煩,因此在市場上應運而生了提供訊息推送服務的諸多產品,例如:百度雲、個推、極光等。

  極光推送正是一個整合了android推送、iOS推送的統一推送服務平臺。下面講解一下如何使用極光實現訊息推送應用,並重點講解一下如何實現向分組傳送訊息及推送服務端和自身應用整合,具體實現過程如下:

目錄:

一、註冊應用

二、環境搭建

三、Android開發,實現指定人群推送訊息

四、開發訊息推送服務端

  1、環境搭建

  2、服務端實現步驟

  3、服務端程式碼實現

一、註冊應用

1.進入官網

   首先進入官網首頁https://www.jpush.cn/,註冊賬號

2.註冊應用

  登入到使用者平臺,點選建立應用如圖所示:

 

  包名:建立應用專案的基礎包,單擊建立,產生應用資訊如圖所示:

  產生AppKey和API主密碼,每個客戶端應用使用唯一一個AppKey

二、環境搭建

1.SDK下載

   官網資源地址: https://www.jpush.cn/downloads/sdk/android/  下載 JPUSH Android – SDK。

2.匯入SDK開發包

  •   複製 libs/jpush-sdk-release1.x.y.jar 到工程 libs/ 目錄下
  •   複製 libs/armeabi/libjpush.so 到工程 libs/armeabi 目錄下

3.配置AndroidManifest.xml

    詳細請參照官網http://docs.jpush.io/guideline/android_guide/#sdk文件中說明進行配置

4.測試是否成功

   整合完成後,JPush  提供的推送服務是預設就已經開啟,這時客戶端就可以接收到來自服務的訊息了,可通過登入到JPush使用者平臺,傳送通知測試整合是否成功

   如圖所示:

  如終端收到訊息說明整合成功

三、Android端開發,實現向指定人群推送訊息

   整合成功之後,服務端傳送訊息會被所有的安裝應用的客戶端所接收,我們再繼續看看如何在應用中向指定的人群進行訊息推送?

要指定向某一個特定的人,或者某一群特定的人,則相對複雜。因為對於 JPush 來說,某一個人就是一個註冊ID,這個註冊ID與開發者App沒有任何關係,或者說對開發者App是沒有意義的。

  如果要對開發者App有意義的某個特定的使用者推送訊息,則需要:把 JPush 註冊使用者與開發者App 使用者繫結起來。我們可以使用別名與標籤的功能

1.設定別名(alias)

  為安裝了應用程式的使用者,取個別名來標識。以後給該使用者 Push 訊息時,就可以用此別名來指定。每個使用者只能指定一個別名。同一個應用中,儘可能為每個客戶端使用者標識唯一名稱,以便服務端能通過該名稱來唯一確定使用者。

  呼叫JPushInterface方法:

public static void setAlias(Context context, String alias,  TagAliasCallback callback)

 引數說明:

  • Alias 設定別名
    • 實現TagAliasCallback的元件物件, 該元件提實現 gotResult 方法。採用回撥機制返回執行結果,對應的引數
    • responseCode狀態碼:0為成功
    • Alias別名稱
    • Tags標籤名,沒有為null
    • "" (空字串)表示取消之前的設定。
    • 每次呼叫設定有效的別名,覆蓋之前的設定。
    • 有效的別名組成:字母(區分大小寫)、數字、下劃線、漢字。
    • 限制:alias 命名長度限制為 40 位元組。(判斷長度需採用UTF-8編碼)
  • callback

  如下所示:

new TagAliasCallback() {                

                @Override
                public void gotResult(int responseCode, String alias, Set<String> tags) {
                switch (code) {
                    case 0:
                        logs = "Set tag and alias success";
                        Log.i(TAG, logs);
                        break;
                        
                    case 6002:
                        logs = "Failed to set alias and tags due to timeout. Try again after 60s.";
                        Log.i(TAG, logs);
                        break;
                    default:
                        logs = "Failed with errorCode = " + code;
                        Log.e(TAG, logs);
                    }                
}
}

2.設定標籤(tag)

   標籤實質就是將應用客戶根據應用的需要按類別進行分組,服務端可以組為單位來批量下發 Push 訊息,這樣組內客戶端所有使用者都可以收到該訊息。一個使用者可以打多個標籤,標籤沒有唯一性要求。

  呼叫JPushInterface方法:

public static void setTags(Context context, Set<String> tags,TagAliasCallback callback)

 引數說明:

  • Tags 為使用者設定組,一個使用者可設定多個組
    • 空陣列或列表表示取消之前的設定。
    • 每次呼叫至少設定一個 tag,覆蓋之前的設定,不是新增。
    • 有效的標籤組成:字母(區分大小寫)、數字、下劃線、漢字。
    • 限制:每個 tag 命名長度限制為 40 位元組,最多支援設定 100 個 tag,但總長度不得超過1K位元組。(判斷長度需採用UTF-8編碼)
  • Callback 同上

3.同時設定組和標籤

  也可呼叫JPushInterface的setAliasAndTags方法同時設定別名和標籤,方法如下:

 public static void setAliasAndTags(Context context, String alias,  Set<String> tags, TagAliasCallback callback)

  案例實現:

  下面程式碼實現為登入的學生設定別名和標籤,別名為其學號,每個使用者有兩個標籤分別是所屬班級和所屬專業,user是使用者登入成功後的資訊

if(user!=null){

         // TODO 
Set<String> tags=new HashSet<String>();
if(user.getClassName()!=null&&!user.getClassName().equals("")){
                tags.add(user.getClassName());//記錄學生所屬班級
}
if(user.getMajorName()!=null&&!user.getMajorName().equals("")){
     tags.add(user.getMajorName());//記錄學生所屬專業
}
//將學生設定到班級和專業組,並設定別名為學生的學號
JPushInterface.setAliasAndTags(getApplicationContext(), user.getUserNo(),tags, new TagAliasCallback() {                
                @Override
                public void gotResult(int responseCode, String alias, Set<String> tags) {
                    // TODO 
                    if(responseCode==0){
                        Log.i("tags", tags.toString());
                    }
                }
            });
        }

  這樣服務端可以以專業和班級為單位實現批量傳送訊息,也可以按學號向指定學生髮訊息

四、開發訊息推送服務端

環境搭建

1.下載服務端SDK

  下載地址: http://docs.jpush.cn/download/attachments/2228302/jpush-client-3.2.3.zip?version=2&modificationDate=1415166491000

2.在專案中加入jar包

 

 

服務端實現步驟

1.建立JPushClient

JPushClient jpushClient = new JPushClient(masterSecret, appKey, 3);

 引數說明:

     masterSecret:註冊應用的主密碼,即API 主密碼

     appKey:註冊應用的應用Key

     maxRetryTime:最大的嘗試次數,設為3表示:跟伺服器進行建立連線若失敗會嘗試再進行兩次嘗試

2. 構建一個PushPayload物件(推送物件)

  確定推送訊息的目標,包括推送的平臺(Android、ios)、訊息內容和目標(所有人、別名、標籤),構建簡單的推送物件:向所有平臺,所有人,推送內容為 content 的通知。

 public static PushPayload buildPushObject_all_all_alert(String content) {

        return PushPayload.alertAll(content); 

  構建推送物件:所有平臺,推送目標是別名為alias,通知內容為 content。 

 public static PushPayload buildPushObject_all_alias_alert(String alias,String content) {

        return PushPayload.newBuilder()
         .setPlatform(Platform.all())//所有平臺
         .setAudience(Audience.alias(alias))//向選定的人推送
         .setNotification(Notification.alert(content))//訊息內容
         .build();}

  構建推送物件:向android平臺,向目標標籤tag,通知標題title,內容為 content。

 public static PushPayload buildPushObject_android_tag_alertWithTitle (String alias,String title,String content) {

    return PushPayload.newBuilder().setPlatform(Platform.android())
                .setAudience(Audience.tag(tag))//向指定的組推送
                .setNotification(Notification.android(message, title, null)).build();        
}

3.推送訊息

PushResult result=jpushClient.sendPush(payload);

  應用客戶推送訊息

    引數:payload 即第二步建立的推送物件

    返回值:PushResult 表示服務端推送結果

  包含下列資料:

       msg_id:返回推送訊息的id

服務端程式碼實現

1.編寫MessagePush元件封裝訊息推送方法

public class MessagePush {

    private static final String appKey = "d1c241706d82996e1fcdc2b2";
    private static final String masterSecret = "7ee1df1a631aee5a6a5a1129";
    private JPushClient jpushClient ;
    private String title;
    private String content;
public MessagePush(String message) {
         this.message = message;    
         jpushClient = new JPushClient(masterSecret, appKey,3);
     }
     public MessagePush(String message,String title) {
this(message);        
         this.title=title;    
     }
/**
      * 向所有人傳送訊息
      * @return 訊息id
      */
public long sendPushAll(){
        PushPayload payload=buildPushObject_all_all_alert();
        long msgId=0;
        try {
            PushResult result=jpushClient.sendPush(payload);
            msgId=result.msg_id;
        } catch (APIConnectionException e) {
            // TODO Auto-generated catch block
                LOG.error("Connection error. Should retry later. ", e);
        } catch (APIRequestException e) {
            LOG.info("HTTP Status: " + e.getStatus());
            msgId=e.getMsgId();
        }
        return msgId;
    }
/**
     * 向指定別名的客戶端傳送訊息
     * @param alias 所有別名資訊集合,這裡表示傳送所有學生編號
     * @return 訊息id
     */
    public long sendPushAlias(Set<String> alias){
    PushPayload payloadAlias=buildPushObject_android_alias_alertWithTitle(alias);
    long msgId=0;
        try {
            PushResult result=jpushClient.sendPush(payloadAlias);
            msgId=result.msg_id;
            
        } catch (APIConnectionException e) {
            LOG.error("Connection error. Should retry later. ", e);
        } catch (APIRequestException e) {
            LOG.info("HTTP Status: " + e.getStatus());
            LOG.info("Error Code: " + e.getErrorCode());
            LOG.info("Error Message: " + e.getErrorMessage());
            LOG.info("Msg ID: " + e.getMsgId());
            msgId=e.getMsgId();
        }
        return msgId;
    }
    /**
     * 向指定組傳送訊息
     * @param tag 組名稱
* @return 訊息id     
*/
public  long sendPushTag(String tag) {
        PushPayload payloadtag = buildPushObject_android_tag_alertWithTitle(tag);
        long msgId=0;
        try {
            PushResult result = jpushClient.sendPush(payloadtag);
            msgId=result.msg_id;
            LOG.info("Got result - " + result);
        } catch (APIConnectionException e) {
            LOG.error("Connection error. Should retry later. ", e);
            
        } catch (APIRequestException e) {
            LOG.info("HTTP Status: " + e.getStatus());
            LOG.info("Error Code: " + e.getErrorCode());
            LOG.info("Error Message: " + e.getErrorMessage());
            LOG.info("Msg ID: " + e.getMsgId());
            msgId=e.getMsgId();
        }
        return msgId;
    }


/**
* 下列封裝了三種獲得訊息推送物件(PushPayload)的方法
*  buildPushObject_android_alias_alertWithTitle、
*  buildPushObject_android_tag_alertWithTitle、
*  buildPushObject_all_all_alert
*/
public  PushPayload buildPushObject_android_alias_alertWithTitle(Set<String> alias) {
        return PushPayload.newBuilder().setPlatform(Platform.android())
                .setAudience(Audience.alias(alias))        .setNotification(Notification.android(message,title,null)).build();
}

public  PushPayload buildPushObject_android_tag_alertWithTitle(String tag){
    return PushPayload.newBuilder().setPlatform(Platform.android())
                .setAudience(Audience.tag(tag))
                .setNotification(Notification.android(message, title, null)).build();}
    
public  PushPayload buildPushObject_all_all_alert() {
        return PushPayload.alertAll(message);
    }

2.JSP頁面

    主要是設計表單將資料提交給MessagePushServlet,這裡頁面程式碼就不附加了

3.編寫Servlet

public class MessagePushServlet extends HttpServlet {

public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
        int ret=0;
        request.setCharacterEncoding("utf-8");
        response.setCharacterEncoding("utf-8");
        String title=request.getParameter("title");
        String msg=request.getParameter("msg");
        String major=request.getParameter("majorName");
        String stuClass=request.getParameter("className");
        String alias=request.getParameter("selStuNos");
        MessagePush push=new MessagePush(msg,title);
        long msgId=0;
        if(alias!=null&&!alias.equals("")){
            String[] aliasArr=alias.split(",");
            Set<String> aliasSet=new HashSet<String>();
            for(String item:aliasArr){
                aliasSet.add(item);
            }
            msgId=push.sendPushAlias(aliasSet);
        }else if(stuClass!=null&&!stuClass.equals("")){
            msgId=push.sendPushTag(stuClass);
        }else if(major!=null&&!major.equals("")){
            msgId=push.sendPushTag(major);
        } else{
            msgId=push.sendPushAll();            
        }
        request.getRequestDispatcher("/push.jsp").forward(request, response);            
        }    
    }

相關文章