java服务端集成信鸽推送
最近项目需要集成推送功能,突发奇想的选了信鸽推送(可能是最近一直在用阿里的东西),没想到这坑不是一般的多,而且关于详细的集成案例,度娘上真是没一个能入眼的。算了,别的不多说了,上代码吧!
一、注册和生成证书
应用配置
- 首先进入信鸽,创建一个应用,然后在控制台点击我的应用:如下图:
- 点击应用配置,出现应用配置界面:
- 拿到两个参数APP ID 和 SECRET KEY
二、下载SDK
- 方法一:使用maven库(推荐)
- 在项目pom.xml中引入依赖项
<repositories>
<repository>
<id>xingePush</id>
<url>https://raw.githubusercontent.com/xingePush/maven-repository/snapshot/</url>
</repository>
</repositories>
<dependencies>
<!--信鸽推送这个版本竟然包涵springfox-swagger2的jar包,集成swagger的兄弟一定得注意别重复引用造成冲突-->
<dependency>
<groupId>com.github.xingePush</groupId>
<artifactId>xinge</artifactId>
<version>1.2.0-SNAPSHOT</version>
</dependency>
</dependencies>
-
方法二:checkout源代码
-
方法三:下载库文件
- 在信鸽官网下载最新版本的包
- 使用时引用XingeApp包即可
三、JAVA后台集成(以springboot为例,记得按上面步骤导入依赖)
- 先创建一个信鸽配置类XinGePushiConfig作为提供XingeApp实例
import cn.stylefeng.guns.core.common.constant.XinGeConstants;
import cn.stylefeng.guns.core.util.PushUtil;
import com.tencent.xinge.XingeApp;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* 信鸽推送配置类
* @author lwh
* @date 2019/08/01
*/
@Configuration
public class XinGePushiConfig {
@Bean(name = "androidXingeApp")
public XingeApp androidXingeApp(){
return new XingeApp(XinGeConstants.ANDROID_APP_ID, XinGeConstants.ANDROID_SECRE_KEY);
}
@Bean(name = "iosXingeApp")
public XingeApp iosXingeApp(){
return new XingeApp(XinGeConstants.IOS_APP_ID, XinGeConstants.IOS_SECRE_KEY);
}
}
- 创建一个信鸽推送所用的常量集合XinGeConstants,也就是保存我们应用的APP ID 和 SECRET KEY,
public interface XinGeConstants {
//请正确填写自己应用的APP ID 和 SECRET KEY,一个是安卓应用一个是苹果应用的(下面是乱写的不可用)
String ANDROID_APP_ID = "88dfgdfgdfg3";
String ANDROID_SECRE_KEY= "aaa1fgdfgdfgfdgdfgdfg";
String IOS_APP_ID = "8ddfgdfgdfgdfc13";
String IOS_SECRE_KEY= "aaa10sdfsdfsdfsdfsd1c867c";
}
- 下面是我写的一个工具类PushUtil,里面有单账号推送和账号列表推送和全设备推送的功能实现
import cn.stylefeng.guns.core.common.annotion.BussinessLog;
import cn.stylefeng.guns.core.common.constant.dictmap.DictMap;
import com.alibaba.fastjson.JSON;
import com.tencent.xinge.XingeApp;
import com.tencent.xinge.bean.*;
import com.tencent.xinge.push.app.PushAppRequest;
import org.json.JSONException;
import org.json.JSONObject;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.awt.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
/**
* 信鸽推送工具类
* @author lwh
* date 2019/08/01
*/
@Component
public class PushUtil {
private Logger log = LoggerFactory.getLogger(this.getClass());
@Resource(name = "androidXingeApp")
private XingeApp androidXingeApp;
@Resource(name = "iosXingeApp")
private XingeApp iosXingeApp;
/**
* 全平台单账号推送
* @param title 推送标题
* @param content 推送内容
* @param activity 点击动作
* @param account 推送账号
*/
public boolean pushAccount(String title, String content, String activity,ArrayList<String> account){
Boolean result=false;
result=pushAccountAndroid(title,content,activity,account);
if (!result){
log.error("安卓平台推送失败>>>>>>>>>>>>>>>>>>>>>>>");
result=true;
}
result=pushAccountIos(title,content,activity,account);
if (!result){
log.error("苹果平台推送失败>>>>>>>>>>>>>>>>>>>>>>>");
}
return result;
}
/**
* 全平台账号列表推送
* @param title 推送标题
* @param content 推送内容
* @param activity 点击动作
* @param account 推送账号
*/
public boolean pushAccounts(String title, String content, String activity,ArrayList<String> accounts){
Boolean result=false;
result=pushAccountsAndroid(title,content,activity,accounts);
if (!result){
log.error("安卓平台推送失败>>>>>>>>>>>>>>>>>>>>>>>");
result=true;
}
result=pushAccountsIos(title,content,activity,accounts);
if (!result){
log.error("苹果平台推送失败>>>>>>>>>>>>>>>>>>>>>>>");
}
return result;
}
/**
* 全平台全设备推送
* @param title 推送标题
* @param content 推送内容
* @param activity 点击动作
* @param account 推送账号
*/
public boolean pushAll(String title, String content, String activity){
Boolean result=false;
result=pushAllAndroid(title,content,activity);
if (!result){
log.error("安卓平台推送失败>>>>>>>>>>>>>>>>>>>>>>>");
result=true;
}
result=pushAllIos(title,content,activity);
if (!result){
log.error("苹果平台推送失败>>>>>>>>>>>>>>>>>>>>>>>");
}
return result;
}
/**
* 安卓单账号推送
* @param title 推送标题
* @param content 推送内容
* @param activity 点击动作
* @param account 推送账号
*/
public boolean pushAccountAndroid(String title, String content, String activity,ArrayList<String> account){
//设置消息体
Message message= getAndroidMessage(title, content,activity);
//推送请求信息
PushAppRequest pushAppRequest = new PushAppRequest();
//消息体
pushAppRequest.setMessage(message);
//消息类型
pushAppRequest.setMessage_type(MessageType.notify);
//推送平台
pushAppRequest.setPlatform(Platform.android);
//推送目标
pushAppRequest.setAudience_type(AudienceType.account);
//推送账号
pushAppRequest.setAccount_list(account);
String pushAppRequestStr=pushAppRequest.toString();
JSONObject resultJson=androidXingeApp.pushApp(pushAppRequestStr);
boolean result=false;
String ret_code="";
try {
ret_code= resultJson.getString("ret_code");
if ("0".equals(ret_code)){
result=true;
}
} catch (JSONException e) {
e.printStackTrace();
}finally {
log.info(resultJson.toString());
return result;
}
}
/**
* 安卓账号列表推送
* @param title 推送标题
* @param content 推送内容
* @param activity 点击动作
* @param accounts 推送账号列表
*/
public boolean pushAccountsAndroid(String title, String content, String activity,ArrayList<String> accounts){
//设置消息体
Message message= getAndroidMessage(title, content,activity);
//推送请求信息
PushAppRequest pushAppRequest = new PushAppRequest();
//消息体
pushAppRequest.setMessage(message);
//消息类型
pushAppRequest.setMessage_type(MessageType.notify);
//推送平台
pushAppRequest.setPlatform(Platform.android);
//推送目标
pushAppRequest.setAudience_type(AudienceType.account_list);
//推送账号
pushAppRequest.setAccount_list(accounts);
String pushAppRequestStr=pushAppRequest.toString();
JSONObject resultJson=androidXingeApp.pushApp(pushAppRequestStr);
boolean result=false;
String ret_code="";
try {
ret_code= resultJson.getString("ret_code");
if ("0".equals(ret_code)){
result=true;
}
} catch (JSONException e) {
e.printStackTrace();
}finally {
log.info(resultJson.toString());
return result;
}
}
/**
* 安卓全平台推送
* @param title 推送标题
* @param content 推送内容
* @param activity 点击动作
*/
public boolean pushAllAndroid(String title, String content, String activity){
//设置消息体
Message message= getAndroidMessage(title, content,activity);
//推送请求信息
PushAppRequest pushAppRequest = new PushAppRequest();
//消息体
pushAppRequest.setMessage(message);
//消息类型
pushAppRequest.setMessage_type(MessageType.notify);
//推送平台
pushAppRequest.setPlatform(Platform.android);
//推送全部
pushAppRequest.setAudience_type(AudienceType.all);
String pushAppRequestStr=pushAppRequest.toString();
//推送,并返回回馈信息
JSONObject resultJson=androidXingeApp.pushApp(pushAppRequestStr);
boolean result=false;
String ret_code="";
try {
ret_code= resultJson.getString("ret_code");
if ("0".equals(ret_code)){//回馈信息中ret_code为0.则表示推送成功
result=true;
}
} catch (JSONException e) {
e.printStackTrace();
}finally {
log.info(resultJson.toString());
return result;
}
}
/**
* iOS全单账号推送
* @param title 推送标题
* @param content 推送内容
* @param activity 点击动作
*/
public boolean pushAccountIos(String title, String content, String activity,ArrayList<String> account){
//设置消息体
Message message=getIosMessage(title,content,activity);
//推送请求信息
PushAppRequest pushAppRequest = new PushAppRequest();
//消息体
pushAppRequest.setMessage(message);
//消息类型
pushAppRequest.setMessage_type(MessageType.notify);
//推送平台
pushAppRequest.setPlatform(Platform.ios);
//推送目标
pushAppRequest.setAudience_type(AudienceType.account);
//推送账号
pushAppRequest.setAccount_list(account);
String pushAppRequestStr=pushAppRequest.toString();
//推送,并返回回馈信息
JSONObject resultJson=iosXingeApp.pushApp(pushAppRequestStr);
boolean result=false;
String ret_code="";
try {
ret_code= resultJson.getString("ret_code");
if ("0".equals(ret_code)){//回馈信息中ret_code为0.则表示推送成功
result=true;
}
} catch (JSONException e) {
e.printStackTrace();
}finally {
log.info(resultJson.toString());
return result;
}
}
/**
* iOS账号列表推送
* @param title 推送标题
* @param content 推送内容
* @param activity 点击动作
*/
public boolean pushAccountsIos(String title, String content, String activity,ArrayList<String> accounts){
//设置消息体
Message message=getIosMessage(title,content,activity);
//推送请求信息
PushAppRequest pushAppRequest = new PushAppRequest();
//消息体
pushAppRequest.setMessage(message);
//消息类型
pushAppRequest.setMessage_type(MessageType.notify);
//推送平台
pushAppRequest.setPlatform(Platform.ios);
//推送目标
pushAppRequest.setAudience_type(AudienceType.account_list);
//推送账号
pushAppRequest.setAccount_list(accounts);
String pushAppRequestStr=pushAppRequest.toString();
//推送,并返回回馈信息
JSONObject resultJson=iosXingeApp.pushApp(pushAppRequestStr);
boolean result=false;
String ret_code="";
try {
ret_code= resultJson.getString("ret_code");
if ("0".equals(ret_code)){//回馈信息中ret_code为0.则表示推送成功
result=true;
}
} catch (JSONException e) {
e.printStackTrace();
}finally {
log.info(resultJson.toString());
return result;
}
}
/**
* iOS全平台推送
* @param title 推送标题
* @param content 推送内容
* @param activity 点击动作
*/
public boolean pushAllIos(String title, String content, String activity){
//设置消息体
Message message=getIosMessage(title,content,activity);
//推送请求信息
PushAppRequest pushAppRequest = new PushAppRequest();
//消息体
pushAppRequest.setMessage(message);
//消息类型
pushAppRequest.setMessage_type(MessageType.notify);
//推送平台
pushAppRequest.setPlatform(Platform.ios);
//推送全部
pushAppRequest.setAudience_type(AudienceType.all);
String pushAppRequestStr=pushAppRequest.toString();
//推送,并返回回馈信息
JSONObject resultJson=iosXingeApp.pushApp(pushAppRequestStr);
boolean result=false;
String ret_code="";
try {
ret_code= resultJson.getString("ret_code");
if ("0".equals(ret_code)){//回馈信息中ret_code为0.则表示推送成功
result=true;
}
} catch (JSONException e) {
e.printStackTrace();
}finally {
log.info(resultJson.toString());
return result;
}
}
/**
* 设置并返回安卓消息体
* @param title 推送标题
* @param content 推送内容
* @param activity 点击动作
*/
public Message getAndroidMessage(String title, String content, String activit){
//安卓消息设置
MessageAndroid messageAndroid=new MessageAndroid();
//消息点击动作设置
ClickAction clickAction=new ClickAction();
clickAction.setAction_type(1);
clickAction.setActivity(activit);
//点击动作加入消息设置
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);
//封装推送消息
Message message = new Message();
message.setTitle(title);
message.setContent(content);
message.setAndroid(messageAndroid);
return message;
}
/**
* 设置并返回ios消息体
* @param title 推送标题
* @param content 推送内容
* @param activity 点击动作
*/
public Message getIosMessage(String title, String content, String activit){
//ios消息设置
MessageIOS messageIOS=new MessageIOS();
//苹果推送服务(APNs)特有的消息体字段
Aps aps=new Aps();
//标题和消息内容
Alert alert=new Alert();
alert.setBody(content);
alert.setTitle(title);
aps.setAlert(alert);
aps.setCategory("INVITE_CATEGORY");
aps.setBadge_type(5);
messageIOS.setAps(aps);
messageIOS.setCustom("bar");
//封装推送消息
Message message = new Message();
message.setTitle(title);
message.setContent(content);
message.setIos(messageIOS);
return message;
}
}
- 再附上我的测试类
import cn.stylefeng.guns.base.BaseJunit;
import cn.stylefeng.guns.core.util.PushUtil;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import java.lang.reflect.Array;
import java.util.ArrayList;
/**
* 用户测试
*
* @author lwh
* @date 2019-07-27 17:05
*/
public class PushTest extends BaseJunit {
@Autowired
private PushUtil pushUtil;
@Test
public void pushTest(){
// ArrayList<String> acc=new ArrayList<>();
// acc.add("10000000000");
pushUtil.pushAll("ios推送测试","ios推送测试,ios与android","com.jwhdzkj.palmnetwork.xgdemo.MessageActivity");
}
}
如果移动端APP已经集成了SDK那么这样就可以往移动端推送消息了
假如移动端还没有开发完成,那么就是信鸽控制台添加测试设备测试吧
现在最新的包是1.2.0的包,记得一定要下载最新的包,强烈推荐用在项目pom.xml中引入依赖项方式下载,要不可能会出现一些不可预料的问题。那就是官网的包和maven仓拿到的有点区别,真是太坑了!
有啥问题请多多指教,大家互相讨论才进步更快嘛,哈哈。