**移動端設備: **
Android:走自建的TCP長連接通道
iOS : 走自家的系統推送通道,
WinPhone: 走自家的系統推送通道,
那么意味著你服務端要維護這三套推送系統。
極光推送是:使得開發者可以即時地向其應用程序的用戶推送通知或者消息,與用戶保持互動,從而有效地提高留存率,提升用戶體驗。簡單的說就是通過JPush后臺管理網站進行app消息的推送。可以讓用戶及時的收到最新的消息提示。
但是往往有時候需要我們自己開發自己的后臺管理網站實現推送的功能,這個時候就需要調用JPush提供的API接口,來進行消息的推送。這里我只講一些核心API接口,JPush 當前支持 Android, iOS, Windows Phone 三個平臺的推送。其關鍵字分別為:"android", "ios", "winphone"。
服務端主動推送到客戶端的原理:
目前服務端給客戶端推送,普遍做法是客戶端與服務端維持一個長連接,客戶端定時向服務端發送心跳值以維持這個長連接。當有新消息過來的時候,服務端查出該消息對應的TCP Channel的ID并找到對應的通道進行消息下發。
這只是最基本的通訊模型,在此之上,有衍生出針對消息的發布/訂閱模型,客戶端可以訂閱某一個Topic,服務端根據Topic找到對應的Channel進行批量的消息下發。所有的客戶端隱式的訂閱的all這個opic,所以『類似中國移動給全網信號內所有手機發消息的模式』亦可以理解『廣播消息』,即給all這個Topic發消息。
下面是[Java]后臺的代碼部分:
調用地址
POST https://api.jpush.cn/v3/push
public class JPushClientExample {
//在極光注冊上傳應用的 appKey 和 masterSecret
private static final String appKey ="a148767f7440ff9daf56457f";//必填,例如466f7032ac604e02fb7bda89
private static final String masterSecret = "731e374afd796d5942ba1363";//必填,每個應用都對應一個masterSecret
private static JPushClient jpush = null;
/*調用驗證
*HTTP Header(頭)里加一個字段(Key/Value對):
*Authorization: Basic base64_auth_string 其中 base64_auth_string 的生成算法為:*base64(appKey:masterSecret)即,對 appKey 加上冒號,加上 masterSecret 拼裝
*起來的字符串,再做 base64 轉換
*/
/*
* 保存離線的時長。秒為單位。最多支持10天(864000秒)。
* 0 表示該消息不保存離線。即:用戶在線馬上發出,當前不在線用戶將不會收到此消息。
* 此參數不設置則表示默認,默認為保存1天的離線消息(86400秒
*/
private static long timeToLive = 60 * 60 * 24;
public static void main(String[] args) {
/*
* Example1: 初始化,默認發送給android和ios,同時設置離線消息存活時間
* jpush = new JPushClient(masterSecret, appKey, timeToLive);
*
* Example2: 只發送給android *
* Example3: 只發送給IOS
* jpush = new JPushClient(masterSecret, appKey, DeviceEnum.IOS);
*
* Example4: 只發送給android,同時設置離線消息存活時間
* jpush = new JPushClient(masterSecret, appKey, timeToLive, DeviceEnum.Android);
*/
jpush = new JPushClient(masterSecret, appKey, timeToLive);
/*
* 是否啟用ssl安全連接, 可選
* 參數:啟用true, 禁用false,默認為非ssl連接
*/
jpush.setEnableSSL(true);
//測試發送消息或者通知
testSend();
}
推送字段解說.png
private static void testSend() {
// 在實際業務中,建議 sendNo 是一個你自己的業務可以處理的一個自增數字。
// 除非需要覆蓋,請確保不要重復使用。詳情請參考 API 文檔相關說明。
// Integer num= getRandomSendNo();
String sendNo="1900192560";
String msgTitle = "Hi, JPush!";
String msgContent = "我是JPush測試信息,已經成功發送給你,請查收。";
/*
* IOS設備擴展參數,
* 設置badge,設置聲音
*/
Map<String, Object> extra = new HashMap<String, Object>();
IOSExtra iosExtra = new IOSExtra(1, "WindowsLogonSound.wav");
extra.put("id1",iosExtra);
extra.put("id2","I am extra infomation");
//IOS和安卓一起
MessageResult msgResult = jpush.sendNotificationWithAppKey(sendNo, msgTitle, msgContent, 0, extra);
//對所有用戶發送通知, 更多方法請參考文檔
// MessageResult msgResult = jpush.sendCustomMessageWithAppKey(sendNo,msgTitle, msgContent);
if (null != msgResult) {
System.out.println("服務器返回數據: " + msgResult.toString());
if (msgResult.getErrcode() == ErrorCodeEnum.NOERROR.value()) {
System.out.println("發送成功, sendNo=" + msgResult.getSendno());
} else {
System.out.println("發送失敗, 錯誤代碼=" + msgResult.getErrcode() + ", 錯誤消息=" + msgResult.getErrmsg());
}
} else {
System.out.println("無法獲取數據");
}
}
public static final int MAX = Integer.MAX_VALUE;
public static final int MIN = (int) MAX/2;
/**
* 保持 sendNo 的唯一性是有必要的
* It is very important to keep sendNo unique.
* @return sendNo
*/
public static int getRandomSendNo() {
return (int) (MIN + Math.random() * (MAX - MIN));
}
}
狀態碼.png