極光推送-服務端端智慧人社訊息推送方式
極光推送-服務端端智慧人社訊息推送方式
文章轉自:http://blog.csdn.NET/u014733374/article/details/43560983
最近一直在做後臺開發,但心裡還是總惦記著Android,感覺還是Android有意思。正好專案中要用到極光推送,今天抽空來記錄下這兩天的研究成果。
我們知道iOS有自己的推送服務,但很遺憾Android沒有原生的推送服務,現在有很多第三方的推送服務,比如個推、極光、亞馬遜、百度雲、聚能等。今天我們就來研究下極光推送的後臺伺服器如何實現。
關鍵點:
1.首先最好是把極光官網Java後臺伺服器的demo下載下來,裡面有我們需要的jar包,以及example.
2.極光推送的關鍵jpushClient = new JPushClient(masterSecret, appKey, 3);就是這個類。其中的引數需要我們從極光官網註冊開發者,然後建立具體專案獲取相應的兩 個key值。其中appKey值就是我們手機端對應的key值
3.極光推送給我們提供了很多種推送的方式,我們可以選擇某一個平臺進行推送(Android ,IOS ,Windows Phone),也可以全部推送;我們可以針對某個特別的使用者進行推送(設定alisa),也可以針對特別的群體進行推送(設定tag),第三個引數是設定推送保留的時間,只要在有效時間內上線就可以收到推送資訊
4. 極光推送現在都用https連線,提交請求是post,獲取資料為get
ok 接下來就看服務端的實現(JAVA),JdPush推送方法+一個Servlet
- package com.weiwend.jdpush;
- import org.slf4j.Logger;
- import org.slf4j.LoggerFactory;
- import cn.jpush.api.JPushClient;
- import cn.jpush.api.common.resp.APIConnectionException;
- import cn.jpush.api.common.resp.APIRequestException;
- import cn.jpush.api.push.PushResult;
- import cn.jpush.api.push.model.Message;
- import cn.jpush.api.push.model.Options;
- import cn.jpush.api.push.model.Platform;
- import cn.jpush.api.push.model.PushPayload;
- import cn.jpush.api.push.model.audience.Audience;
- import cn.jpush.api.push.model.audience.AudienceTarget;
- import cn.jpush.api.push.model.notification.AndroidNotification;
- import cn.jpush.api.push.model.notification.IosNotification;
- import cn.jpush.api.push.model.notification.Notification;
- public class Jdpush {
- protected static final Logger LOG = LoggerFactory.getLogger(Jdpush.class);
- // demo App defined in resources/jpush-api.conf
- public static final String TITLE = "申通快遞";
- public static final String ALERT = "祝大家新春快樂";
- public static final String MSG_CONTENT = "申通快遞祝新老客戶新春快樂";
- public static final String REGISTRATION_ID = "0900e8d85ef";
- public static final String TAG = "tag_api";
- public static JPushClient jpushClient=null;
- public static void testSendPush(String appKey ,String masterSecret) {
- jpushClient = new JPushClient(masterSecret, appKey, 3);
- // HttpProxy proxy = new HttpProxy("localhost", 3128);
- // Can use this https proxy: https://github.com/Exa-Networks/exaproxy
- // For push, all you need do is to build PushPayload object.
- //PushPayload payload = buildPushObject_all_all_alert();
- //生成推送的內容,這裡我們先測試全部推送
- PushPayload payload=buildPushObject_all_alias_alert();
- try {
- System.out.println(payload.toString());
- PushResult result = jpushClient.sendPush(payload);
- System.out.println(result+"................................");
- LOG.info("Got result - " + result);
- } catch (APIConnectionException e) {
- LOG.error("Connection error. Should retry later. ", e);
- } catch (APIRequestException e) {
- LOG.error("Error response from JPush server. Should review and fix it. ", 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());
- }
- }
- public static PushPayload buildPushObject_all_all_alert() {
- return PushPayload.alertAll(ALERT);
- }
- public static PushPayload buildPushObject_all_alias_alert() {
- return PushPayload.newBuilder()
- .setPlatform(Platform.all())//設定接受的平臺
- .setAudience(Audience.all())//Audience設定為all,說明採用廣播方式推送,所有使用者都可以接收到
- .setNotification(Notification.alert(ALERT))
- .build();
- }
- public static PushPayload buildPushObject_android_tag_alertWithTitle() {
- return PushPayload.newBuilder()
- .setPlatform(Platform.android())
- .setAudience(Audience.all())
- .setNotification(Notification.android(ALERT, TITLE, null))
- .build();
- }
- public static PushPayload buildPushObject_android_and_ios() {
- return PushPayload.newBuilder()
- .setPlatform(Platform.android_ios())
- .setAudience(Audience.tag("tag1"))
- .setNotification(Notification.newBuilder()
- .setAlert("alert content")
- .addPlatformNotification(AndroidNotification.newBuilder()
- .setTitle("Android Title").build())
- .addPlatformNotification(IosNotification.newBuilder()
- .incrBadge(1)
- .addExtra("extra_key", "extra_value").build())
- .build())
- .build();
- }
- public static PushPayload buildPushObject_ios_tagAnd_alertWithExtrasAndMessage() {
- return PushPayload.newBuilder()
- .setPlatform(Platform.ios())
- .setAudience(Audience.tag_and("tag1", "tag_all"))
- .setNotification(Notification.newBuilder()
- .addPlatformNotification(IosNotification.newBuilder()
- .setAlert(ALERT)
- .setBadge(5)
- .setSound("happy")
- .addExtra("from", "JPush")
- .build())
- .build())
- .setMessage(Message.content(MSG_CONTENT))
- .setOptions(Options.newBuilder()
- .setApnsProduction(true)
- .build())
- .build();
- }
- public static PushPayload buildPushObject_ios_audienceMore_messageWithExtras() {
- return PushPayload.newBuilder()
- .setPlatform(Platform.android_ios())
- .setAudience(Audience.newBuilder()
- .addAudienceTarget(AudienceTarget.tag("tag1", "tag2"))
- .addAudienceTarget(AudienceTarget.alias("alias1", "alias2"))
- .build())
- .setMessage(Message.newBuilder()
- .setMsgContent(MSG_CONTENT)
- .addExtra("from", "JPush")
- .build())
- .build();
- }
- }
可以看到上面我們推送平臺設定的是所有平臺,Audience設定為all(所有使用者),這裡key值和masterSecret值放在servlet中了。
servlet很簡單,只要傳入兩個key值,呼叫該方法就可以
- package com.weiwend.jdpush.servlet;
- import java.io.IOException;
- import javax.servlet.ServletException;
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import com.sun.org.apache.xml.internal.serializer.utils.Utils;
- import com.weiwend.jdpush.Jdpush;
- import com.weiwend.jdpush.utils.Base64Utils;
- /**
- * Servlet implementation class tuisong
- */
- public class tuisong extends HttpServlet {
- private static final long serialVersionUID = 1L;
- private static final String appKey ="84cf5ee2099c654aa03a5d70";
- private static final String masterSecret = "7cf23f25a41806d5fd29e3c5";
- public tuisong() {
- super();
- // TODO Auto-generated constructor stub
- }
- /**
- * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
- */
- protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
- Jdpush.testSendPush(appKey,masterSecret);
- System.out.println("sucess");
- }
- /**
- * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
- */
- protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
- // TODO Auto-generated method stub
- }
- }
最後來看下執行的結果,可以看到,提交資料是以json格式。如果返回{"msg_id":1663001319,"sendno":1981162191}這樣資料說明推送已經成功傳送
- {"platform":"all","audience":"all","notification":{"alert":"祝大家新春快樂"},"options":{"sendno":1981162191,"apns_production":false}}
- {"msg_id":1663001319,"sendno":1981162191}................................
- sucess
原始碼分析:
JPushClient jpushClient = new JPushClient(masterSecret, appKey, 3);實際上是例項化了一下三個類
- public JPushClient(String masterSecret, String appKey, int maxRetryTimes) {
- _pushClient = new PushClient(masterSecret, appKey, maxRetryTimes);
- _reportClient = new ReportClient(masterSecret, appKey, maxRetryTimes);
- _deviceClient = new DeviceClient(masterSecret, appKey, maxRetryTimes);
- }
PushPayload payload = buildPushObject_all_all_alert();,PushPayload類裡包含了傳遞和返回的所有資料
- public class PushPayload implements PushModel {
- private static final String PLATFORM = "platform";
- private static final String AUDIENCE = "audience";
- private static final String NOTIFICATION = "notification";
- private static final String MESSAGE = "message";
- private static final String OPTIONS = "options";
- private static final int MAX_GLOBAL_ENTITY_LENGTH = 1200; // Definition acording to JPush Docs
- private static final int MAX_IOS_PAYLOAD_LENGTH = 220; // Definition acording to JPush Docs
- private static Gson _gson = new Gson();
- private final Platform platform;
- private final Audience audience;
- private final Notification notification;
- private final Message message;
- private Options options;
- private PushPayload(Platform platform, Audience audience,
- Notification notification, Message message, Options options) {
- this.platform = platform;
- this.audience = audience;
- this.notification = notification;
- this.message = message;
- this.options = options;
- }
PushResult result = jpushClient.sendPush(payload);可以看到就是sendPost方法,然後接受返回的資料
- public PushResult sendPush(PushPayload pushPayload) throws APIConnectionException, APIRequestException {
- Preconditions.checkArgument(! (null == pushPayload), "pushPayload should not be null");
- if (_globalSettingEnabled) {
- pushPayload.resetOptionsTimeToLive(_timeToLive);
- pushPayload.resetOptionsApnsProduction(_apnsProduction);
- }
- ResponseWrapper response = _httpClient.sendPost(_baseUrl + PUSH_PATH, pushPayload.toString());
- return BaseResult.fromResponse(response, PushResult.class);
- }
另外我專門找了下sendNo如何生成的,其實就是隨機生成的一個數字
- public static Options sendno() {
- return newBuilder().setSendno(ServiceHelper.generateSendno()).build();
- }
- public static int generateSendno() {
- return RANDOM.nextInt((MAX - MIN) + 1) + MIN;
- }
大家有興趣也可以詳細看一下程式碼的實現.
相關文章
- IOS 推送訊息 php做推送服務端iOSPHP服務端
- APP訊息推送 極光推送 示例程式碼APP
- WebSocket實現服務端推送訊息和聊天會話Web服務端會話
- Spring Boot 整合 WebSocket 實現服務端推送訊息到客戶端Spring BootWeb服務端客戶端
- springboot2整合websocket,實現服務端推送訊息到客戶端Spring BootWeb服務端客戶端
- 使用極光推送實現分組傳送和服務端整合服務端
- JPush極光推送Java伺服器端例項Java伺服器
- mPaaS 服務端核心元件:訊息推送 MPS 架構及流程設計服務端元件架構
- 【PWA學習與實踐】(5)在Web中進行服務端訊息推送Web服務端
- iOS —— 極光推送和極光IMiOS
- 在ionic專案中使用極光推送實現推送 & 伺服器端程式碼伺服器
- 服務端主動推送技術☞WebSocket服務端Web
- 極光推送總結
- 利用WebSocket和EventSource實現服務端推送Web服務端
- WebSocket 實現伺服器訊息推送客戶端Web伺服器客戶端
- iOS APNS推送遠端訊息 java後臺實現iOSJava
- 極光推送-java工具類Java
- 極光推送—java快速接入Java
- 極光推送證書篇
- iOS極光推送封裝iOS封裝
- iOS推送之遠端推送iOS
- 遠端推送
- Flutter應用整合極光推送Flutter
- 在 Laravel 中使用 極光推送Laravel
- 極光推送 tag alias 設定
- Swift3.0整合極光推送Swift
- 服務端推送技術 Server-sent Events 快速上手服務端Server
- 基於APNs最新HTTP/2介面實現iOS的高效能訊息推送(服務端篇)HTTPiOS服務端
- iOS 極光推送整合與開發iOS
- iOS 極光推送遇到的問題iOS
- Laravel 極光推送驅動,使用極光不再那麼麻煩!Laravel
- workerman 實現訊息推送
- IOS 訊息推送處理iOS
- iOS-極光推送開發小結iOS
- iOS推送——本地推送與遠端推送詳解(一圖看懂)iOS
- 極光推送申請iOS推送證書p12及配置教程iOS
- 極光推送申請iOS推送證書p12及配置流程iOS
- 智慧運營助你輕鬆玩轉訊息推送