1. 程式人生 > >關於極光推送Jpush的demo

關於極光推送Jpush的demo

安卓 lips 介紹 gis 表示 request ice 通知欄 efault

關於極光推送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

技術分享

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

關於極光推送Jpush的demo