極光推送總結(jié)
應(yīng)用場景:在我們的項目中我們用的是創(chuàng)建視頻會議和預(yù)警消息通知推送這兩種情況,首先創(chuàng)建視頻會議和中途邀請人參加會議我采用的是自定義推送消息,因為此應(yīng)用場景傳遞的參數(shù)比較多,在推送過去之后android和ios可以很方便的將參數(shù)傳遞過去,但是我們考慮到邀請的所有人都在登錄狀態(tài)的時候才可以創(chuàng)建會議房間,我們采用的是騰訊視頻會議的sdk,因為我們采用的是別名推送,當(dāng)用戶在登錄的時候安卓端將用戶uuid設(shè)置為別名,退出時取消別名,我在服務(wù)端根據(jù)傳遞過來的uuid利用別名查詢registration_ids的數(shù)組大小是否為空判斷當(dāng)前用戶是否設(shè)置別名,當(dāng)邀請的所有人都設(shè)置了別名之后我才調(diào)用創(chuàng)建會議房間的接口。而預(yù)警消息推送我采用的是通知推送,當(dāng)氣象預(yù)警觸發(fā)的時候我會采用通知推送的方式推送給app,這種方式比較簡單。
極光推送是給app推送消息的,我們首先需要在服務(wù)端集成maven依賴
<!-- 極光推送 -->
<groupId>cn.jpush.api
<artifactId>jpush-client
<version>3.2.3
</dependency>
接著我們需要了解極光推送有哪些推送方式,對于安卓和ios都適用的情況,我在項目中使用的是別名推送alias,(還有標(biāo)簽推送tag),推送方式又分為通知推送和自定義推送,通知推送能夠顯示在手機(jī)提示框中,而自定義推送卻不能,我看安卓他們做的能跟微信視頻一樣的彈出一個會話框,看著挺不錯的,這跟微信不同的是可以邀請多個,之前用阿里云的好像只能一對一,所以才換成騰訊視頻會議的,好了,廢話不多說,上我寫的一個工具類,
package com.jpxx.homepage.homePage.rvice.utils;
import cn.jpush.api.JPushClient;
import cn.jpush.api.push.PushResult;
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.notification.Notification;
import cn.jpush.api.push.model.Message;
import cn.jpush.api.push.model.PushPayload.Builder;
public class SendMessageUtils {
private static StringAppKey="8a7880c6fb81ad494b224078";
/**
* JPush MasterSecret 極光推送平臺生成的密鑰
*/
private static StringMasterSecret="c0fc675c4c48f9bf35269cf4";
//兩個參數(shù)分別填寫你申請的masterSecret和appKey
private static JPushClientjPushClient=new JPushClient(MasterSecret,AppKey);
/**
* 通知推送
* 備注:推送方式不為空時,推送的值也不能為空;推送方式為空時,推送值不做要求
* @param type 推送方式:1、“tag”標(biāo)簽推送,2、“alias”別名推送
* @param value 推送的標(biāo)簽或別名值
* @param alert 推送的內(nèi)容
*/
public static StringpushNotice(String type,String title,String value,String alert,int roomId,String MessageType,String name,String promoterAdavter,String meetingTitle,String sig){
Builder builder= PushPayload.newBuilder();
builder.tPlatform(Platform.all());//設(shè)置接受的平臺,all為所有平臺,包括安卓、ios、和微軟的
//設(shè)置如果用戶不在線、離線消息保存的時間
Options options=Options.ndno();
options.tTimeToLive(86400l); //設(shè)置為86400為保存一天,如果不設(shè)置默認(rèn)也是保存一天
builder.tOptions(options);
builder.tMessage(Message.newBuilder()
.tMsgContent(value)
.tTitle(title)
.addExtra("roomId",roomId)
.addExtra("MessageType",MessageType)
.addExtra("name",name)
.addExtra("promoterAdavter",promoterAdavter)
.addExtra("meetingTitle",meetingTitle)
.addExtra("urSig",sig)
.build());
//設(shè)置推送方式
if(type.equals("alias")){
builder.tAudience(Audience.alias(value));//根據(jù)別名推送
}el if(type.equals("tag")){
builder.tAudience(Audience.tag(value));//根據(jù)標(biāo)簽推送
}el{
builder.tAudience(Audience.all());//Audience設(shè)置為all,說明采用廣播方式推送,所有用戶都可以接收到
}
//設(shè)置為采用通知的方式發(fā)送消息
builder.tNotification(Notification.alert(alert));
PushPayload pushPayload=builder.build();
System.out.println("ggggggg"+pushPayload);
try{
//進(jìn)行推送,實際推送就在這一步
//System.out.println("zzzzzzzzz "+jPushClient.ndPush(pushPayload));
PushResult pushResult=jPushClient.ndPush(pushPayload);
return "success";
}catch(Exception e){
System.out.println("異常 "+e);
e.printStackTrace();
return "fail";
}
}
/**
* 自定義消息推送
* 備注:推送方式不為空時,推送的值也不能為空;推送方式為空時,推送值不做要求
* @param type 推送方式:1、“tag”標(biāo)簽推送,2、“alias”別名推送
* @param value 推送的標(biāo)簽或別名值
* @param alert 推送的內(nèi)容
*/
public static StringpushMsg(String type,String title,String value,String alert,int roomId,String MessageType,String name,String promoterAdavter,String meetingTitle,String sig){
Builder builder= PushPayload.newBuilder();
builder.tPlatform(Platform.all());//設(shè)置接受的平臺
if(type.equals("alias")){
builder.tAudience(Audience.alias(value));//別名推送
}el if(type.equals("tag")){
builder.tAudience(Audience.tag(value));//標(biāo)簽推送
}el{
builder.tAudience(Audience.all());//Audience設(shè)置為all,說明采用廣播方式推送,所有用戶都可以接收到
}
Message.Builder newBuilder=Message.newBuilder();
newBuilder.tMsgContent(alert);//消息內(nèi)容
newBuilder.tTitle(title);
newBuilder.addExtra("roomId",roomId);
newBuilder.addExtra("MessageType",MessageType);
newBuilder.addExtra("name",name);
newBuilder.addExtra("promoterAdavter",promoterAdavter);
newBuilder.addExtra("meetingTitle",meetingTitle);
newBuilder.addExtra("urSig",sig);
Message message=newBuilder.build();
builder.tMessage(message);
PushPayload pushPayload=builder.build();
try{
PushResult pushResult=jPushClient.ndPush(pushPayload);
System.out.println(pushResult.isResultOK());
return "success";
}catch(Exception e){
e.printStackTrace();
return "fail";
}
}
public static void main(String[] args) {
//給標(biāo)簽為kefu的用戶進(jìn)行消息推送
//SendMessageUtils.pushMsg("alias","標(biāo)題","5b9022746e284ea0992e3baa983035dc","你有新的任務(wù),請及時處理",111,"meetingType","name","avater","meetingTitle","");
//ndNotificationWirhAlias_Ios("zzzzzzzzzzzz","uuid");
//String result = SendMessageUtils.pushNotice("alias","標(biāo)題","5b9022746e284ea0992e3baa983035dc","你有新的任務(wù),請及時處理",111,"meetingType","name","avater","meetingTitle","");
//System.out.println("返回結(jié)果"+result);
/*String result = SendMessageUtils.pushNotice("alias","預(yù)警標(biāo)題","5b9022746e284ea0992e3baa983035dc","dddd",0,"warnType","","","",""); //urDto.getUuId()
System.out.println("result "+result);*/
//根據(jù)uuid查詢別名信息是否存在
String result = HttpRequestUtil.JGUtil("https://device.jpush.cn/v3/alias/5b9022746e284ea0992e3baa983035dc", "8a7880c6fb81ad494b224078","c0fc675c4c48f9bf35269cf4");//get請求
//String result = HttpRequestUtil.interfaceUtil("http://172.16.2.207:6606/daibancontroller.do?getDbxxNum", "","ydswtapp","eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ7XCJjbGllbnRJZFwiOlwieWRzd3RhcHBcIixcImxvZ2luVGltZVwiOjE1NTYwMDY1NDU4MzksXCJ1c0lkXCI6MjM5OSxcInVzZXJSb2xlXCI6XCJBRE1JTlwiLFwidXVJZFwiOlwiNDAyODgxZTUzYzdmMGRkZTAxM2M3ZjI5ZWQ4ZTAwMTZcIn0iLCJpc3MiOiJhdXRoMCIsImV4cCI6MTg3MTM2NjU0NSwiaWF0IjoxNTU2MDA2NTQ1fQ.Cy3-eDD4OEYhJlldvtJsymALRVGwP466TmBrSQJQGUo");//get請求
System.out.println("result "+result);
}
}
因為我要根據(jù)前端傳來的uuid判斷當(dāng)前用戶是否登錄,所以我對http方法進(jìn)行了稍微改裝,根據(jù)極光的api文檔(文檔寫的不是很好找),以下是我改裝的
/**
*
* 極光專用
*/
public static StringJGUtil(String path,String appKey,String masterSecret) {
String str ="";
try {
URL url =new URL(path);
//打開和url之間的連接
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
PrintWriter out =null;
/**設(shè)置URLConnection的參數(shù)和普通的請求屬性****start***/
String ba64String=appKey+":"+masterSecret;
System.out.println("拼接的 "+ba64String);
String str2=ba64String;
String encode =new BASE64Encoder().encode(str2.getBytes());
System.out.println("編碼過后:"+encode);
String auth ="Basic "+encode;
System.out.println("最終的 "+auth);
conn.tRequestProperty("Authorization", auth);
conn.tRequestProperty("Content-Type", "application/json");
//conn.tRequestProperty("Content-Type", "application/x-www-form-urlencoded");
conn.tRequestProperty("accept", "*/*");
conn.tRequestProperty("connection", "Keep-Alive");
conn.tRequestProperty("ur-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)");
/**設(shè)置URLConnection的參數(shù)和普通的請求屬性****end***/
//設(shè)置是否向httpUrlConnection輸出,設(shè)置是否從httpUrlConnection讀入,此外發(fā)送post請求必須設(shè)置這兩個
//最常用的Http請求無非是get和post,get請求可以獲取靜態(tài)頁面,也可以把參數(shù)放在URL字串后面,傳遞給rvlet,
//post與get的 不同之處在于post的參數(shù)不是放在URL字串里面,而是放在http請求的正文內(nèi)。
conn.tDoOutput(true);
conn.tDoInput(true);
conn.tRequestMethod("GET");//GET和POST必須全大寫
/**GET方法請求*****start*/
/**
* 如果只是發(fā)送GET方式請求,使用connet方法建立和遠(yuǎn)程資源之間的實際連接即可;
* 如果發(fā)送POST方式的請求,需要獲取URLConnection實例對應(yīng)的輸出流來發(fā)送請求參數(shù)。
* */
conn.connect();
/**GET方法請求*****end*/
/***POST方法請求****start*/
/*out = new PrintWriter(conn.getOutputStream());//獲取URLConnection對象對應(yīng)的輸出流 out.print(data);//發(fā)送請求參數(shù)即數(shù)據(jù) out.flush();//緩沖數(shù)據(jù)*/
/***POST方法請求****end*/
//獲取URLConnection對象對應(yīng)的輸入流
InputStream is = conn.getInputStream();
//構(gòu)造一個字符流緩存
BufferedReader br =new BufferedReader(new InputStreamReader(is));
while ((str = br.readLine()) !=null) {
str =new String(str.getBytes(), "UTF-8");//解決中文亂碼問題
System.out.println("wwwww"+str);
return str;
}
//關(guān)閉流
is.clo();
//斷開連接,最好寫上,disconnect是在底層tcp socket鏈接空閑時才切斷。如果正在被其他線程使用就不切斷。
//固定多線程的話,如果不disconnect,鏈接會增多,直到收發(fā)不出信息。寫上disconnect后正常一些。
conn.disconnect();
System.out.println("完整結(jié)束");
}catch (Exception e) {
e.printStackTrace();
}
return "success";
}
好了,以后再寫類似的就會寫了,這里附上極光文檔的鏈接 https://docs.jiguang.cn/jpush/rver/push/rver_overview/
極光推送的極光推送服務(wù)優(yōu)勢
極光推送服務(wù)具有如下的優(yōu)勢:
1)完全開放注冊,免費向所有的開發(fā)者開放使用
2)SDK流量電量消耗很少
3)集成簡單,很快就能夠集成跑起來
4)服務(wù)器端推送支持大并發(fā)量、延遲小
5)豐富的富媒體推送功能
6)通過極光推送APP的平均用戶活躍度提升了500%
7)使用極光推送做運營,用戶留存率會提升2倍以上
8)云端部署服務(wù)器超過2000臺
極光推送服務(wù)是什么,極光推送怎么樣?
極光推送,免費的第三方消息推送服務(wù)。
優(yōu)勢:
1) 開放注冊,免費向所有的開發(fā)者開放使用
2)SDK流量電量消耗很少
3)集成簡單,很快就能夠集成跑起來
4)服務(wù)器端推送支持大并發(fā)量、延遲小