**移動(dòng)端設(shè)備: **
Android:走自建的TCP長(zhǎng)連接通道
iOS : 走自家的系統(tǒng)推送通道,
WinPhone: 走自家的系統(tǒng)推送通道,
那么意味著你服務(wù)端要維護(hù)這三套推送系統(tǒng)。
極光推送是:使得開(kāi)發(fā)者可以即時(shí)地向其應(yīng)用程序的用戶推送通知或者消息,與用戶保持互動(dòng),從而有效地提高留存率,提升用戶體驗(yàn)。簡(jiǎn)單的說(shuō)就是通過(guò)JPush后臺(tái)管理網(wǎng)站進(jìn)行app消息的推送??梢宰層脩艏皶r(shí)的收到最新的消息提示。
但是往往有時(shí)候需要我們自己開(kāi)發(fā)自己的后臺(tái)管理網(wǎng)站實(shí)現(xiàn)推送的功能,這個(gè)時(shí)候就需要調(diào)用JPush提供的API接口,來(lái)進(jìn)行消息的推送。這里我只講一些核心API接口,JPush 當(dāng)前支持 Android, iOS, Windows Phone 三個(gè)平臺(tái)的推送。其關(guān)鍵字分別為:"android", "ios", "winphone"。
服務(wù)端主動(dòng)推送到客戶端的原理:
目前服務(wù)端給客戶端推送,普遍做法是客戶端與服務(wù)端維持一個(gè)長(zhǎng)連接,客戶端定時(shí)向服務(wù)端發(fā)送心跳值以維持這個(gè)長(zhǎng)連接。當(dāng)有新消息過(guò)來(lái)的時(shí)候,服務(wù)端查出該消息對(duì)應(yīng)的TCP Channel的ID并找到對(duì)應(yīng)的通道進(jìn)行消息下發(fā)。
這只是最基本的通訊模型,在此之上,有衍生出針對(duì)消息的發(fā)布/訂閱模型,客戶端可以訂閱某一個(gè)Topic,服務(wù)端根據(jù)Topic找到對(duì)應(yīng)的Channel進(jìn)行批量的消息下發(fā)。所有的客戶端隱式的訂閱的all這個(gè)opic,所以『類(lèi)似中國(guó)移動(dòng)給全網(wǎng)信號(hào)內(nèi)所有手機(jī)發(fā)消息的模式』亦可以理解『廣播消息』,即給all這個(gè)Topic發(fā)消息。
下面是[Java]后臺(tái)的代碼部分:
調(diào)用地址
POST https://api.jpush.cn/v3/push
public class JPushClientExample {
//在極光注冊(cè)上傳應(yīng)用的 appKey 和 masterSecret
private static final String appKey ="a148767f7440ff9daf56457f";//必填,例如466f7032ac604e02fb7bda89
private static final String masterSecret = "731e374afd796d5942ba1363";//必填,每個(gè)應(yīng)用都對(duì)應(yīng)一個(gè)masterSecret
private static JPushClient jpush = null;
/*調(diào)用驗(yàn)證
*HTTP Header(頭)里加一個(gè)字段(Key/Value對(duì)):
*Authorization: Basic base64_auth_string 其中 base64_auth_string 的生成算法為:*base64(appKey:masterSecret)即,對(duì) appKey 加上冒號(hào),加上 masterSecret 拼裝
*起來(lái)的字符串,再做 base64 轉(zhuǎn)換
*/
/*
* 保存離線的時(shí)長(zhǎng)。秒為單位。最多支持10天(864000秒)。
* 0 表示該消息不保存離線。即:用戶在線馬上發(fā)出,當(dāng)前不在線用戶將不會(huì)收到此消息。
* 此參數(shù)不設(shè)置則表示默認(rèn),默認(rèn)為保存1天的離線消息(86400秒
*/
private static long timeToLive = 60 * 60 * 24;
public static void main(String[] args) {
/*
* Example1: 初始化,默認(rèn)發(fā)送給android和ios,同時(shí)設(shè)置離線消息存活時(shí)間
* jpush = new JPushClient(masterSecret, appKey, timeToLive);
*
* Example2: 只發(fā)送給android *
* Example3: 只發(fā)送給IOS
* jpush = new JPushClient(masterSecret, appKey, DeviceEnum.IOS);
*
* Example4: 只發(fā)送給android,同時(shí)設(shè)置離線消息存活時(shí)間
* jpush = new JPushClient(masterSecret, appKey, timeToLive, DeviceEnum.Android);
*/
jpush = new JPushClient(masterSecret, appKey, timeToLive);
/*
* 是否啟用ssl安全連接, 可選
* 參數(shù):?jiǎn)⒂胻rue, 禁用false,默認(rèn)為非ssl連接
*/
jpush.setEnableSSL(true);
//測(cè)試發(fā)送消息或者通知
testSend();
}

private static void testSend() {
// 在實(shí)際業(yè)務(wù)中,建議 sendNo 是一個(gè)你自己的業(yè)務(wù)可以處理的一個(gè)自增數(shù)字。
// 除非需要覆蓋,請(qǐng)確保不要重復(fù)使用。詳情請(qǐng)參考 API 文檔相關(guān)說(shuō)明。
// Integer num= getRandomSendNo();
String sendNo="1900192560";
String msgTitle = "Hi, JPush!";
String msgContent = "我是JPush測(cè)試信息,已經(jīng)成功發(fā)送給你,請(qǐng)查收。";
/*
* IOS設(shè)備擴(kuò)展參數(shù),
* 設(shè)置badge,設(shè)置聲音
*/
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);
//對(duì)所有用戶發(fā)送通知, 更多方法請(qǐng)參考文檔
// MessageResult msgResult = jpush.sendCustomMessageWithAppKey(sendNo,msgTitle, msgContent);
if (null != msgResult) {
System.out.println("服務(wù)器返回?cái)?shù)據(jù): " + msgResult.toString());
if (msgResult.getErrcode() == ErrorCodeEnum.NOERROR.value()) {
System.out.println("發(fā)送成功, sendNo=" + msgResult.getSendno());
} else {
System.out.println("發(fā)送失敗, 錯(cuò)誤代碼=" + msgResult.getErrcode() + ", 錯(cuò)誤消息=" + msgResult.getErrmsg());
}
} else {
System.out.println("無(wú)法獲取數(shù)據(jù)");
}
}
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));
}
}
