推送功能在手機應用開發中越來越重要,幾乎成為所有App必備的功能,由於Android本身沒有消息推送機制,通常采用的是基於XMPP協議的推送,但這種開發很麻煩,因此在市場上應運而生了提供消息推送服務的諸多產品,例如:百度雲、個推、極光等。
極光推送正是一個整合了Android推送、iOS推送的統一推送服務平台。下面講解一下如何使用極光實現消息推送應用,並重點講解一下如何實現向分組發送消息及推送服務端和自身應用集成,具體實現過程如下:
目錄:
一、注冊應用
二、環境搭建
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
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); } }
出處: http://www.cnblogs.com/jerehedu/
本文版權歸煙台傑瑞教育科技有限公司和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。