使用極光推送實現分組傳送和服務端整合
推送功能在手機應用開發中越來越重要,幾乎成為所有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); } }
相關文章
- 極光推送-服務端端智慧人社訊息推送方式服務端
- 在ionic專案中使用極光推送實現推送 & 伺服器端程式碼伺服器
- Flutter應用整合極光推送Flutter
- Swift3.0整合極光推送Swift
- iOS 極光推送整合與開發iOS
- iOS —— 極光推送和極光IMiOS
- 在 Laravel 中使用 極光推送Laravel
- Android開發之極光推送的整合Android
- iOS_極光推送的UNNotificationServiceExtension實現富文字iOS
- Laravel 極光推送驅動,使用極光不再那麼麻煩!Laravel
- 極光推送總結
- 極光筆記|極光推送在APICloud平臺的使用教程筆記APICloud
- 快捷地整合極光推送(JPush)到 Laravel 專案中Laravel
- JPush極光推送Java伺服器端例項Java伺服器
- Spring Boot 整合 WebSocket 實現服務端推送訊息到客戶端Spring BootWeb服務端客戶端
- 極光推送-java工具類Java
- 極光推送—java快速接入Java
- 極光推送證書篇
- iOS極光推送封裝iOS封裝
- springboot2整合websocket,實現服務端推送訊息到客戶端Spring BootWeb服務端客戶端
- 極光推送 tag alias 設定
- TCP通訊客戶端和服務端簡單程式碼實現TCP客戶端服務端
- 利用tirpc庫實現簡單的客戶端和服務端RPC客戶端服務端
- 極光筆記 | 極光服務的信創改造實踐筆記
- windows socket簡單使用--實現客戶端連結服務端併傳送和接收資料Windows客戶端服務端
- 【CRC校驗方法】+【FPGA實現(傳送端)】FPGA
- 利用WebSocket和EventSource實現服務端推送Web服務端
- APP訊息推送 極光推送 示例程式碼APP
- iOS 極光推送遇到的問題iOS
- SprinBoot~實現使用非同步任務優化郵件傳送boot非同步優化
- iOS-極光推送開發小結iOS
- SpringBoot整合rabbitMq實現訊息延時傳送Spring BootMQ
- CXF建立webservice客戶端和服務端Web客戶端服務端
- 使用 Promise 實現任務佇列傳送請求,實現最大請求數目限制Promise佇列
- 多包名打包以及整合“極光推送”的坑點(區別於“多渠道打包”)
- 極光筆記丨iOS 15推送新特性筆記iOS
- Amazing!!CSS 也能實現極光?CSS
- WebSocket實現服務端推送訊息和聊天會話Web服務端會話