關於極光推送Jpush的demo

来源:http://www.cnblogs.com/chenfei-java/archive/2017/06/02/6935342.html
-Advertisement-
Play Games

關於極光推送Jpush 推送是手機app必不可少的一樣功能,這次由於公司項目需要研究了一下。由於推送一般寫於服務端,所以對於不會Android的javaweb程式員要寫出一個完整的demo是一件很頭痛的事情。所以我就在這裡從頭到尾寫一個例子以示參考。由於我也不懂Android 只是由於項目需要百度了 ...


關於極光推送Jpush

  推送是手機app必不可少的一樣功能,這次由於公司項目需要研究了一下。由於推送一般寫於服務端,所以對於不會Android的javaweb程式員要寫出一個完整的demo是一件很頭痛的事情。所以我就在這裡從頭到尾寫一個例子以示參考。由於我也不懂Android 只是由於項目需要百度了一個demo,當中有很多不足的地方忘各位大神指正。

一、首先先簡單的介紹一下什麼是極光推送

    ①為什麼需要推送:為瞭解決數據同步的問題,在手機平臺上,常用的方法有2種。一種是定時去伺服器上查詢數據,也叫Polling,還有一種手機跟伺服器之間維護一個 TCP 長連接,當伺服器有數據時,實時推送到客戶端,也就是我們說的 Push。由於做推送在移動網路下維持長連接有一定的技術難度,而且當用戶量上去的時候,需要很多伺服器來維持長連接,成本也是很大的。因此我們需要一個第三方的jar包來支持我們的推送服務。如果想瞭解更多內容可參看極光推送官方文檔。

    ②極光推送的通俗解答:就是把需要推送的內容通過調用jpush的api的發送到極光推送的伺服器上,極光推送的伺服器根據我們推送過去的內容選擇推送到具體的app。

 

二、源碼

服務端代碼:http://pan.baidu.com/s/1bpH55uR

安卓客戶端代碼:http://pan.baidu.com/s/1jIqmN7S

安卓環境為:ADT+SDK+eclipse

ADT下載:http://pan.baidu.com/s/1dFmZlZF

SDK下載:http://pan.baidu.com/s/1kU53AUr

所需JDK的環境安裝就不一一敘述了。

 註:代碼可直接導入只需要改幾個地方後面會闡述。首先教大家搭下安卓環境先保證代碼能導入成功

三、操作步驟

①  安裝插件

 

 

 

 ②安裝sdk

此步驟完成後頁面會切換到Android的開發界面,頁面會多兩個東西

選擇你要安裝的一般選擇Tools裡面的和Android你所需要的版本,然後帶你安裝,我這裡已經沒有選,所以示灰色的。

 

註:關於安裝很慢或者安裝失敗

有兩種方法:

①  使用FQ軟體  我用的藍燈

②  使用配置鏡像伺服器  如圖:

 

 ③然後導入安卓工程(服務端的工程就不敘述怎麼導入了)

 在工程列表的空白處右鍵--選擇import--然後操作如圖

 

 然後是運行安卓程式(最好是插上數據線--打開手機的usb調試--然後程式運行的時候回下到手機上)

具體的可以百度下。

 

四、極光推送的使用(肯定要到官網註冊一個賬號)

具體使用請百度,或者參照官網,下麵是主要截圖

appkey和master secret 後面會用到

五、修改Android配置文件,將appkey改成你所添加的應用的appkey

 

六、服務端代碼展示,代碼均有註釋就不一一解釋了

只用的到這三個代碼

APPKET和MASTERSECRET 改成你在極光開發者服務添加的應用時所生產的字元串

 

  1  package com.uxun.serviceImpl;
  2 
  3 import com.uxun.service.JPushService;
  4 
  5 import cn.jiguang.common.resp.APIConnectionException;
  6 import cn.jiguang.common.resp.APIRequestException;
  7 import cn.jpush.api.JPushClient;
  8 import cn.jpush.api.push.PushResult;
  9 import cn.jpush.api.push.model.Platform;
 10 import cn.jpush.api.push.model.PushPayload;
 11 import cn.jpush.api.push.model.audience.Audience;
 12 import cn.jpush.api.push.model.notification.AndroidNotification;
 13 import cn.jpush.api.push.model.notification.IosNotification;
 14 import cn.jpush.api.push.model.notification.Notification;
 15 
 16 public class JPushServiceImpl implements JPushService {
 17 
 18     private final static String APPKET = "44262636e2afd75d9b9f7932";
 19     
 20     private final static String  MASTERSECRET = "ae5c0ab5f093b2aba1f8ce25";
 21  
 22     private static JPushClient jPushClient = new JPushClient(MASTERSECRET, APPKET);//通知預設保留24小時。
 23     
 24     @Override
 25     public int sendToRegistrationId(String registrationId, String notification_alert, String notification_title,
 26             String extrasparam) {
 27         int result = 0;
 28         try {
 29             PushPayload pushPayload= JPushServiceImpl.buildPushObjectWithRegistrationId(registrationId,
 30                     notification_alert, notification_title, extrasparam);
 31             System.out.println(pushPayload);
 32             PushResult pushResult=jPushClient.sendPush(pushPayload);  //發送推送對象
 33             //System.out.println(pushResult);
 34             if(pushResult.getResponseCode() == 200) {  //狀態碼等於200 為成功
 35                 result=1;
 36             }
 37         } catch (APIConnectionException e) {
 38             e.printStackTrace();
 39         } catch (APIRequestException e) {
 40             e.printStackTrace();
 41         }
 42         
 43          return result;
 44     }
 45 
 46     @Override
 47     public int sendToAll(String notification_alert, String notification_title, String extrasparam) {
 48         int result = 0;
 49         try {
 50             PushPayload pushPayload= JPushServiceImpl.buildPushObjectWithAll(notification_alert,
 51                     notification_title, extrasparam);
 52             System.out.println(pushPayload);
 53             PushResult pushResult=jPushClient.sendPush(pushPayload);  //發送推送對象
 54             //System.out.println(pushResult);
 55             if(pushResult.getResponseCode() == 200) {  //狀態碼等於200 為成功
 56                 result=1;
 57             }
 58         } catch (APIConnectionException e) {
 59             e.printStackTrace();
 60         } catch (APIRequestException e) {
 61             e.printStackTrace();
 62         }
 63         
 64          return result;
 65     }
 66     
 67     @Override
 68     public int sendToAllIos(String notification_alert, String notification_title, String extrasparam) {
 69         
 70         int result = 0;
 71         try {
 72             PushPayload pushPayload= JPushServiceImpl.buildPushObjectWithIos(notification_alert,
 73                     notification_title, extrasparam);
 74             System.out.println(pushPayload);
 75             PushResult pushResult=jPushClient.sendPush(pushPayload);  //發送推送對象
 76             //System.out.println(pushResult);
 77             if(pushResult.getResponseCode() == 200) {  //狀態碼等於200 為成功
 78                 result=1;
 79             }
 80         } catch (APIConnectionException e) {
 81             e.printStackTrace();
 82         } catch (APIRequestException e) {
 83             e.printStackTrace();
 84         }
 85         
 86          return result;
 87     }
 88 
 89     @Override
 90     public int sendToAllAndroid(String notification_alert, String notification_title, String extrasparam) {
 91         
 92         int result = 0;
 93         try {
 94             PushPayload pushPayload= JPushServiceImpl.buildPushObjectWithAndroid(notification_alert,
 95                     notification_title, extrasparam);
 96             System.out.println(pushPayload);
 97             PushResult pushResult=jPushClient.sendPush(pushPayload);  //發送推送對象
 98             //System.out.println(pushResult);
 99             if(pushResult.getResponseCode() == 200) {  //狀態碼等於200 為成功
100                 result=1;
101             }
102         } catch (APIConnectionException e) {
103             e.printStackTrace();
104         } catch (APIRequestException e) {
105             e.printStackTrace();
106         }
107         
108          return result;
109     }
110 
111     /**
112      * 建立以唯一設備標識符推送的對象
113      * @param registrationId  唯一設備標識
114      * @param notification_alert  通知內容
115      * @param notification_title  通知標題
116      * @param extrasparam  擴展欄位
117      * @return  返回推送對象
118      */
119     private static PushPayload buildPushObjectWithRegistrationId(String registrationId, String notification_alert, String notification_title,
120             String extrasparam) {
121         return PushPayload.newBuilder()
122                 //指定要推送的平臺,all代表當前應用配置了的所有平臺,也可以傳android等具體平臺
123                 .setPlatform(Platform.all())
124                 //指定推送的接收對象,all代表所有人,也可以指定已經設置成功的tag或alias或該應應用客戶端調用介面獲取到的registration id
125                 .setAudience(Audience.registrationId(registrationId))
126                 //jpush的通知,android的由jpush直接下發,iOS的由apns伺服器下發,Winphone的由mpns下發
127                 .setNotification(Notification.newBuilder()
128                 //指定當前推送的android通知
129                 .addPlatformNotification(AndroidNotification.newBuilder()
130                     .setAlert(notification_alert)   //設置通知內容(必填)
131                     .setTitle(notification_title)    //設置通知標題(可選)
132                     //此欄位為透傳欄位,不會顯示在通知欄。用戶可以通過此欄位來做一些定製需求,如特定的key傳要指定跳轉的頁面(value)
133                     .addExtra("androidNotification extras key",extrasparam)
134                     .build())
135                     
136                 //指定當前推送的iOS通知
137                 .addPlatformNotification(IosNotification.newBuilder()
138                     //傳一個IosAlert對象,指定apns title、title、subtitle等
139                     .setAlert(notification_alert)
140                     //直接傳alert
141                     //此項是指定此推送的badge(應用角標)自動加1
142                     .incrBadge(1)
143                     //此欄位的值default表示系統預設聲音;傳sound.caf表示此推送以項目裡面打包的sound.caf聲音來提醒,
144                     // 如果系統沒有此音頻則以系統預設聲音提醒;此欄位如果傳空字元串,iOS9及以上的系統是無聲音提醒,以下的系統是預設聲音
145                     .setSound("sound.caf")
146                     //此欄位為透傳欄位,不會顯示在通知欄。用戶可以通過此欄位來做一些定製需求,如特定的key傳要指定跳轉的頁面(value)
147                     .addExtra("iosNotification extras key",extrasparam)
148                     //此項說明此推送是一個background推送,想瞭解background看:http://docs.jpush.io/client/ios_tutorials/#ios-7-background-remote-notification
149                     //取消此註釋,消息推送時ios將無法在鎖屏情況接收
150                     // .setContentAvailable(true)
151                     .build())
152                 
153                 //指定當前推送的winPhone通知
154                 /*.addPlatformNotification(WinphoneNotification.newBuilder()
155                       .setAlert(notification_alert)
156                       //.setTitle(""))  //設置通知標題(可選)此標題將取代顯示app名稱的地方
157                     .build())*/
158                     .build())
159                     .build();
160     }
161     
162     /**
163      * 建立推送所有用戶的推送對象
164      * @param notification_alert  通知內容
165      * @param notification_title  通知標題
166      * @param extrasparam  擴展欄位
167      * @return  返回推送對象
168      */
169     private static PushPayload buildPushObjectWithAll(String notification_alert,
170             String notification_title, String extrasparam) {
171         return PushPayload.newBuilder()
172                 //指定要推送的平臺,all代表當前應用配置了的所有平臺,也可以傳android等具體平臺
173                 .setPlatform(Platform.all())
174                 //指定推送的接收對象,all代表所有人,也可以指定已經設置成功的tag或alias或該應應用客戶端調用介面獲取到的registration id
175                 .setAudience(Audience.all())
176                 //jpush的通知,android的由jpush直接下發,iOS的由apns伺服器下發,Winphone的由mpns下發
177                 .setNotification(Notification.newBuilder()
178                 //指定當前推送的android通知
179                 .addPlatformNotification(AndroidNotification.newBuilder()
180                     .setAlert(notification_alert)   //設置通知內容(必填)
181                     .setTitle(notification_title)    //設置通知標題(可選)
182                     //此欄位為透傳欄位,不會顯示在通知欄。用戶可以通過此欄位來做一些定製需求,如特定的key傳要指定跳轉的頁面(value)
183                     .addExtra("androidNotification extras key",extrasparam)
184                     .build())
185                     
186                 //指定當前推送的iOS通知
187                 .addPlatformNotification(IosNotification.newBuilder()
188                     //傳一個IosAlert對象,指定apns title、title、subtitle等
189                     .setAlert(notification_alert)
190                     //直接傳alert
191                     //此項是指定此推送的badge(應用角標)自動加1
192                     .incrBadge(1)
193                     //此欄位的值default表示系統預設聲音;傳sound.caf表示此推送以項目裡面打包的sound.caf聲音來提醒,
194                     // 如果系統沒有此音頻則以系統預設聲音提醒;此欄位如果傳空字元串,iOS9及以上的系統是無聲音提醒,以下的系統是預設聲音
195                     .setSound("sound.caf")
196                     //此欄位為透傳欄位,不會顯示在通知欄。用戶可以通過此欄位來做一些定製需求,如特定的key傳要指定跳轉的頁面(value)
197                     .addExtra("iosNotification extras key",extrasparam)
198                     //此項說明此推送是一個background推送,想瞭解background看:http://docs.jpush.io/client/ios_tutorials/#ios-7-background-remote-notification
199                     //取消此註釋,消息推送時ios將無法在鎖屏情況接收
200                     // .setContentAvailable(true)
201                     .build())
202                 
203                 //指定當前推送的winPhone通知
204                 /*.addPlatformNotification(WinphoneNotification.newBuilder()
205                       .setAlert(notification_alert)
206                       //.setTitle(""))  //設置通知標題(可選)此標題將取代顯示app名稱的地方
207                     .build())*/
208                     .build())
209                     .build();
210     }
211     
212     /**
213      * 建立推送所有ios用戶的推送對象
214      * @param notification_alert  通知內容
215      * @param notification_title  通知標題
216      * @param extrasparam  擴展欄位
217      * @return  返回推送對象
218      */
219     private static PushPayload buildPushObjectWithIos(String notification_alert,
220             String notification_title, String extrasparam) {
221         return PushPayload.newBuilder()
222                 //指定要推送的平臺,all代表當前應用配置了的所有平臺,也可以傳android等具體平臺
223                 .setPlatform(Platform.ios())
224                 //指定推送的接收對象,all代表所有人,也可以指定已經設置成功的tag或alias或該應應用客戶端調用介面獲取到的registration id
225                 .setAudience(Audience.all())
226                 //jpush的通知,android的由jpush直接下發,iOS的由apns伺服器下發,Winphone的由mpns下發
227                 .setNotification(Notification.newBuilder()
228                     
229                 //指定當前推送的iOS通知
230                 .addPlatformNotification(IosNotification.newBuilder()
231                     //傳一個IosAlert對象,指定apns title、title、subtitle等
232                     .setAlert(notification_alert)
233                     //直接傳alert
234                     //此項是指定此推送的badge(應用角標)自動加1
235                     .incrBadge(1)
236                     //此欄位的值default表示系統預設聲音;傳sound.caf表示此推送以項目裡面打包的sound.caf聲音來提醒,
237                     // 如果系統沒有此音頻則以系統預設聲音提醒;此欄位如果傳空字元串,iOS9及以上的系統是無聲音提醒,以下的系統是預設聲音
238                     .setSound("sound.caf")
239                     //此欄位為透傳欄位,不會顯示在通知欄。用戶可以通過此欄位來做一些定製需求,如特定的key傳要指定跳轉的頁面(value)
240                     .addExtra("iosNotification extras key",extrasparam)
241                     //此項說明此推送是一個background推送,想瞭解background看:http://docs.jpush.io/client/ios_tutorials/#ios-7-background-remote-notification
242                     //取消此註釋,消息推送時ios將無法在鎖屏情況接收
243                     // .setContentAvailable(true)
244                     .build())
245                     .build())
246                     .build();
247     }
248     
249     /**
250      * 建立推送所有安卓用戶的推送對象
251      * @param notification_alert  通知內容
252      * @param notification_title  通知標題
253      * @param extrasparam  擴展欄位
254      * @return  返回推送對象
255      */
256     private static PushPayload buildPushObjectWithAndroid(String notification_alert,
257             String notification_title, String extrasparam) {
258         return PushPayload.newBuilder()
259                 //指定要推送的平臺,all代表當前應用配置了的所有平臺,也可以傳android等具體平臺
260                 .setPlatform(Platform.android())
261                 //指定推送的接收對象,all代表所有人,也可以指定已經設置成功的tag或alias或該應應用客戶端調用介面獲取到的registration id
262                 .setAudience(Audience.all())
263                 //jpush的通知,android的由jpush直接下發,iOS的由apns伺服器下發,Winphone的由mpns下發
264                 .setNotification(Notification.newBuilder()
265                     //指定當前推送的android通知
266                     .addPlatformNotification(AndroidNotification.newBuilder()
267                         .setAlert(notification_alert)   //設置通知內容(必填)
268                         .setTitle(notification_title)    //設置通知標題(可選)
269                         //此欄位為透傳欄位,不會顯示在通知欄。用戶可以通過此欄位來做一些定製需求,如特定的key傳要指定跳轉的頁面(value)
270                         .addExtra("androidNotification extras key",extrasparam)
271                         .build())
272                         .build())
273                         .build();
274     }
275 
276     
277 
278 }
View Code

 

 運行服務端代碼後手機會受到如下通知:

其實就是服務端通過唯一識別的appkey和master secret將通知發送到極光伺服器,伺服器再轉發至對應的app(上面app的配置文件里也配置了appkey

 

 具體操作就是這麼多,可能不是很詳細,但是操作步驟實在太多,就不一一截圖了,這裡只給大部分的具體方向。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一 概述 1.什麼是進程? 進程是一個相對獨立的執行單位。 2.什麼是線程? 進程的一部分,進程中實際的任務執行者,必須依附於進程。線程對進程的依賴主要體現在: 線程不能脫離進程開啟,必須在進程開啟的前提下開啟。 線程有時必須從進程中獲取數據。 3.線程與進程的區別? 線程與進程是兩個相對的概念,一 ...
  • 當我們有一個 先序遍歷序列:1,3,7,9,5,11 中序遍歷序列:9,7,3,1,5,11 我們可以很輕鬆的用筆寫出對應的二叉樹。但是用代碼又該如何實現? 下麵我們來簡單談談基本思想。 首先,先序遍歷的順序是根據 根-左孩子-右孩子 的順序遍歷的,那麼我們可以率先確認的是先序遍歷序列的第一個數就是 ...
  • 之前一直都是使用Notepad++來編寫Python代碼,後來想起來之前查資料的時候有個VS Code可以編寫一些的腳本語言(js,node.js)甚至是高級編程語言(C#,PHP,JAVA,Python等)而且這是微軟自家寫的,這就引起我的濃烈興趣了,查了下VS Code發現這東西不錯,而且廣受程 ...
  • 自學單片機學到中斷部分,用數位管動態顯示刷新頻率高的時候會有重影,為了消除重影我查找了網上很多資料,好多錯的。 看看原理圖: 百度百科:74HC573 數位管 74HC573是擁有八路輸出的透明鎖存器,輸出為三態門,是一種高性能硅柵CMOS器件。 SL74HC573跟LS/AL573的管腳一樣。器件 ...
  • 選擇排序: 選擇排序(Selection sort)是一種簡單直觀的排序演算法。它的工作原理如下。首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然後,再從剩餘未排序元素中繼續尋找最小(大)元素,然後放到已排序序列的末尾。以此類推,直到所有元素均排序完畢。 選擇排序的主要優點與數據移動 ...
  • php中添加utf-8: 1 header("Content-type:text/html;charset='UTF-8'"); 文件操作步驟: 1.在同一目錄下建立一個file.txt的文件夾 2.打開文件 1 $res = fopen("file.txt","r");//打開文件路徑,打開後是個 ...
  • 有1、2、3、4個數字,能組成多少個互不相同且無重覆數字的三位數?都是多少? public class Example11 { public static void main(String[] args) { number(); } public static void number() { int ...
  • package util; import java.io.UnsupportedEncodingException;import java.security.InvalidKeyException;import java.security.NoSuchAlgorithmException;impor ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...