關於極光推送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)
具體操作就是這麼多,可能不是很詳細,但是操作步驟實在太多,就不一一截圖了,這裡只給大部分的具體方向。