java整合信鴿推送
阿新 • • 發佈:2020-12-18
一. 前言:
最近專案又要拓展幾個大流程,一直在加班(咦,為什麼是又…╥﹏╥…),其中app推送是小熙調研並且實現的。趁現在有點閒暇時間記錄分享下。
小熙在最初是選定極光推送(下篇分享)的,但由於財務方面,不得不轉向調研信鴿推送。
信鴿並未展現出如bat大廠的突出優勢,只是借用騰訊大資料使用者的資料分析,為使用者分組劃分標籤以及通過人口屬性、消費能力、短時興趣、LBS 資訊等資料分析,讓開發者可以針對不同使用者群體推送不同的內容。
信鴿官網
二. 檢視:
展示圖:
三. 依賴:
信鴿官網依賴座標:
<dependency>
< groupId>com.github.xingePush</groupId>
<artifactId>xinge</artifactId>
<version>1.2.4</version>
</dependency>
四. 配置程式碼:
- yml配置資料:
# 騰訊信鴿推送, 官方未實現ios和android一起推送,所以有兩類 key
xinge:
android-appKey: 1580002xxx
android-masterSecret: cedfb61f4f60074d84xxxxxxxxx
ios-appKey: 168000xxxx
ios-masterSecret: 0be4326e1b2a8ea55922dexxxxxxxx
# 小熙的應用是上海伺服器的,所以訪問的上海渠道
area-channel-url: https://api.tpns.sh.tencent.com/
# 1:dev,0:product
environment: 1
- 配置檔案類:
package com.chengxi.datalom.utils.XinGe;
import com.tencent.xinge.XingeApp;
import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties. ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
/**
* 程熙cjp:https://blog.csdn.net/weixin_41133233
* 信鴿推送配置類
*
* @author chengxi
* @date 2020-12-10
*/
@Component
@Data
@ConfigurationProperties(prefix = "xinge")
public class XinGePushConfig {
@Value("android-appKey")
public String androidAppKey;
@Value("android-masterSecret")
public String androidMasterSecret;
@Value("ios-appKey")
private String iosAppKey;
@Value("ios-masterSecret")
private String iosMasterSecret;
@Value("area-channel-url")
private String areaChannelUrl;
@Value("environment")
private String environment;
@Bean(name = "androidXinGeApp")
public XingeApp androidXinGeApp() throws Exception {
return XingeApp.Builder.class.newInstance().appId(androidAppKey).secretKey(androidMasterSecret).domainUrl(areaChannelUrl).build();
}
@Bean(name = "iosXinGeApp")
public XingeApp iosXinGeApp() throws Exception {
return XingeApp.Builder.class.newInstance().appId(iosAppKey).secretKey(iosMasterSecret).domainUrl(areaChannelUrl).build();
}
public String getEnvironmentNum() {
return this.environment;
}
}
- 封裝工具類:
package com.crystalshield.mcd.smscenter.util;
import com.crystalshield.mcd.smscenter.config.XinGePushConfig;
import com.tencent.xinge.XingeApp;
import com.tencent.xinge.bean.*;
import com.tencent.xinge.bean.ios.Alert;
import com.tencent.xinge.bean.ios.Aps;
import com.tencent.xinge.push.app.PushAppRequest;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.json.JSONException;
import org.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.ArrayList;
/**
* 程熙cjp:https://blog.csdn.net/weixin_41133233
* 信鴿推送工具
*
* @author chengxi
* @date 2020/12/10 19:38
*/
@Slf4j
@Component
public class XinGeUtil {
@Resource(name = "androidXinGeApp")
private XingeApp androidXinGeApp;
@Resource(name = "iosXinGeApp")
private XingeApp iosXinGeApp;
@Autowired
private XinGePushConfig xinGePushConfig;
/**
* 安卓全平臺推送
*
* @param title 推送標題
* @param content 推送內容
* @param activity 點選動作
* @param expandInformation 拓展資訊
*/
public Boolean pushAllAndroid(String title, String content, String activity, Object expandInformation) {
return pushAndroidBase(title, content, activity, AudienceType.all, null, expandInformation);
}
/**
* 安卓單賬號推送
*
* @param title 推送標題
* @param content 推送內容
* @param activity 點選動作
* @param account 推送賬號
* @param expandInformation 拓展資訊
*/
public Boolean pushAccountAndroid(String title, String content, String activity, ArrayList<String> account, Object expandInformation) {
return pushAndroidBase(title, content, activity, AudienceType.account, account, expandInformation);
}
/**
* 安卓賬號列表推送
*
* @param title 推送標題
* @param content 推送內容
* @param activity 點選動作
* @param accountList 推送賬號列表
* @param expandInformation 拓展資訊
*/
public Boolean pushAccountListAndroid(String title, String content, String activity, ArrayList<String> accountList, Object expandInformation) {
return pushAndroidBase(title, content, activity, AudienceType.account_list, accountList, expandInformation);
}
/**
* 安卓基礎推送
*
* @param title 推送標題
* @param content 推送內容
* @param activity 點選動作
* @param audienceType 推送型別
* @param accountList 推送賬號
* @param expandInformation 拓展資訊
*/
private Boolean pushAndroidBase(String title, String content, String activity, AudienceType audienceType, ArrayList<String> accountList, Object expandInformation) {
// 設定訊息體
Message message = getAndroidMessage(title, content, activity, expandInformation);
// 獲取推送請求返回的字串
JSONObject resultJson = androidXinGeApp.pushApp(queryPushAppRequestReturnString(message, Platform.android, audienceType, accountList));
// 校驗返回資訊是否成功
return judgeReturnBoolean(resultJson);
}
/**
* iOS單賬號推送
*
* @param title 推送標題
* @param content 推送內容
* @param activity 點選動作
* @param account 推送賬號
* @param expandInformation 拓展資訊
*/
public Boolean pushAccountIos(String title, String content, String activity, ArrayList<String> account, Object expandInformation) {
return pushIosBase(title, content, activity, AudienceType.account, account, expandInformation);
}
/**
* iOS賬號列表推送
*
* @param title 推送標題
* @param content 推送內容
* @param activity 點選動作
* @param accounts 使用者賬號集合
* @param expandInformation 拓展資訊
*/
public Boolean pushAccountListIos(String title, String content, String activity, ArrayList<String> accounts, Object expandInformation) {
return pushIosBase(title, content, activity, AudienceType.account_list, accounts, expandInformation);
}
/**
* iOS全平臺推送
*
* @param title 推送標題
* @param content 推送內容
* @param activity 點選動作
* @param expandInformation 拓展資訊
*/
public Boolean pushAllIos(String title, String content, String activity, Object expandInformation) {
return pushIosBase(title, content, activity, AudienceType.all, null, expandInformation);
}
/**
* iOS基礎推送
*
* @param title 推送標題
* @param content 推送內容
* @param activity 點選動作
* @param audienceType 推送型別
* @param accountList 推送賬號
* @param expandInformation 拓展資訊
*/
private Boolean pushIosBase(String title, String content, String activity, AudienceType audienceType, ArrayList<String> accountList, Object expandInformation) {
//設定訊息體
Message message = getIosMessage(title, content, activity, expandInformation);
//推送,並返回回饋資訊
JSONObject resultJson = iosXinGeApp.pushApp(queryPushAppRequestReturnString(message, Platform.ios, audienceType, accountList));
return judgeReturnBoolean(resultJson);
}
/**
* 獲取校驗返回的布林值
*
* @param resultJson 返回json字串
* @return
*/
private Boolean judgeReturnBoolean(JSONObject resultJson) {
boolean result = false;
int ret_code = 1;
try {
ret_code = resultJson.getInt("ret_code");
log.info("[信鴿推送]PushResult result is " + resultJson);
return ret_code == 0 ? true : false;
} catch (JSONException e) {
e.printStackTrace();
log.error("[信鴿推送]Connection error. Should retry later. ", e);
} finally {
log.info(resultJson.toString());
}
return result;
}
/**
* 獲取推送請求返回的字串(如需特殊操作,請拓展,目前需求為此)
*
* @param message 推送的訊息
* @param platform 平臺型別
* @param audienceType 推送型別
* @param accountList 推送賬號
* @return
*/
private String queryPushAppRequestReturnString(Message message, Platform platform, AudienceType audienceType, ArrayList<String> accountList) {
//推送請求資訊
PushAppRequest pushAppRequest = new PushAppRequest();
//推送環境
pushAppRequest.setEnvironment(String.valueOf(Environment.dev.getType()).equals(xinGePushConfig.getEnvironment()) ? Environment.dev : Environment.product);
//訊息體
pushAppRequest.setMessage(message);
//訊息型別
pushAppRequest.setMessage_type(MessageType.notify);
//推送平臺
pushAppRequest.setPlatform(platform);
//推送目標
pushAppRequest.setAudience_type(audienceType);
//推送賬號
if (CollectionUtils.isNotEmpty(accountList)) {
pushAppRequest.setAccount_list(accountList);
}
return pushAppRequest.toString();
}
/**
* 設定並返回安卓訊息體(如需特殊操作,請拓展,目前需求為此)
*
* @param title 推送標題
* @param content 推送內容
* @param activity 點選動作
* @param expandInformation 拓展資訊
*/
private Message getAndroidMessage(String title, String content, String activity, Object expandInformation) {
//安卓訊息設定
MessageAndroid messageAndroid = new MessageAndroid();
//訊息點選動作設定
ClickAction clickAction = new ClickAction();
clickAction.setAction_type(1);
clickAction.setActivity(activity);
//點選動作加入訊息設定
messageAndroid.setAction(clickAction);
//推送訊息其他引數設定
messageAndroid.setBuilder_id(0);
messageAndroid.setRing(1);
messageAndroid.setVibrate(1);
messageAndroid.setClearable(1);
messageAndroid.setN_id(0);
messageAndroid.setLights(1);
messageAndroid.setIcon_type(0);
messageAndroid.setStyle_id(1);
//新增拓展資訊(此資訊不直接展示在推送上)
messageAndroid.setCustom_content(expandInformation);
//封裝推送訊息
Message message = queryMessage(title, content);
message.setAndroid(messageAndroid);
return message;
}
/**
* 設定並返回ios訊息體(如需特殊操作,請拓展,目前需求為此)
*
* @param title 推送標題
* @param content 推送內容
* @param activity 點選動作
* @param expandInformation 拓展資訊
*/
private Message getIosMessage(String title, String content, String activity, Object expandInformation) {
//ios訊息設定
MessageIOS messageIOS = new MessageIOS();
//蘋果推送服務(APNs)特有的訊息體欄位
Aps aps = new Aps();
//標題和訊息內容
Alert alert = new Alert();
alert.setTitle(title);
alert.setBody(content);
aps.setAlert(alert);
aps.setCategory("INVITE_CATEGORY");
aps.setBadge_type(5);
messageIOS.setAps(aps);
//設定拓展資訊(此資訊不直接展示在推送上)
messageIOS.setCustom(expandInformation);
//封裝推送訊息
Message message = queryMessage(title, content);
message.setIos(messageIOS);
return message;
}
/**
* 獲取Message
*
* @param title
* @param content
* @return
*/
private Message queryMessage(String title, String content) {
Message message = new Message();
message.setTitle(title);
message.setContent(content);
return message;
}
}
五. 示例:
下面試小熙的測試用例:
@Autowired
private XinGeUtil xinGeUtil;
@Test
public void testXinGe() throws JSONException {
// 這裡可以使用專案定義的信鴿傳輸類,以下只是示例
JSONObject jsonObject = new JSONObject();
jsonObject.put("userName", "小熙");
// 測試單個ios賬戶
System.out.println(xinGeUtil.pushAccountIos("IOS測試標題", "IOS測試內容", "", Lists.newArrayList("13456767890")));
// 測試批量安卓賬戶
System.out.println(xinGeUtil.pushAccountListAndroid("批量使用者的安卓測試標題", "批量使用者的安卓測試內容", "", Lists.newArrayList("17601000911","18601980911")));
// 測試批量安卓賬戶並且加上拓展欄位
System.out.println(xinGeUtil.pushAccountListAndroid("批量使用者的安卓測試標題", "批量使用者的安卓測試內容", "", Lists.newArrayList("17601000911","18601980911"), jsonObject.toString()));
}
六. 後語:
到此小熙介紹的,後端java整合就好了,前端整合還需要按照官網流程操作生成對應應用,獲取對應key。個人感覺還是極光比較好用些,下篇介紹極光推送。