1. 程式人生 > 其它 >java整合信鴿推送

java整合信鴿推送

技術標籤:工具類騰訊訊息推送信鴿

一. 前言:

最近專案又要拓展幾個大流程,一直在加班(咦,為什麼是又…╥﹏╥…),其中app推送是小熙調研並且實現的。趁現在有點閒暇時間記錄分享下。

小熙在最初是選定極光推送(下篇分享)的,但由於財務方面,不得不轉向調研信鴿推送。
信鴿並未展現出如bat大廠的突出優勢,只是借用騰訊大資料使用者的資料分析,為使用者分組劃分標籤以及通過人口屬性、消費能力、短時興趣、LBS 資訊等資料分析,讓開發者可以針對不同使用者群體推送不同的內容。
信鴿官網

二. 檢視:

展示圖:
在這裡插入圖片描述

三. 依賴:

信鴿官網依賴座標:

		<dependency>
            <
groupId>com.github.xingePush</groupId> <artifactId>xinge</artifactId> <version>1.2.4</version> </dependency>

四. 配置程式碼:

  1. 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
  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; } }
  1. 封裝工具類:
	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。個人感覺還是極光比較好用些,下篇介紹極光推送