说明:个推官网上创建应用获取 appId appKey masterSecret
一、maven依赖个推的sdk
<!--移动端消息推送(个推)start-->
<dependency>
<groupId>com.gexin.platform</groupId>
<artifactId>gexin-rp-sdk-base</artifactId>
<version>4.0.0.20</version>
</dependency>
<dependency>
<groupId>com.gexin.platform</groupId>
<artifactId>gexin-rp-sdk-http</artifactId>
<version>4.0.1.15</version>
</dependency>
<dependency>
<groupId>com.gexin.platform</groupId>
<artifactId>gexin-rp-sdk-template</artifactId>
<version>4.0.0.14</version>
</dependency>
<dependency>
<groupId>com.gexin</groupId>
<artifactId>gexin-rp-fastjson</artifactId>
<version>1.0.0.1</version>
</dependency>
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
<version>2.5.0</version>
</dependency>
<!--移动端消息推送(个推)end-->
二、GetuiUtils工具类
package com.zsplat.contract.util;
/**
* @author ZhouPan
* @version V1.0
* @ClassName: GeiTuiUtils
* @Description: TODO(这个类的作用是 :)
* @date 2018/9/10 18:54
* @Copyright: 2018 www.zsplat.com Inc. All rights reserved.
*/
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import com.gexin.rp.sdk.base.IAliasResult;
import com.gexin.rp.sdk.base.IBatch;
import com.gexin.rp.sdk.base.IIGtPush;
import com.gexin.rp.sdk.base.IPushResult;
import com.gexin.rp.sdk.base.impl.AppMessage;
import com.gexin.rp.sdk.base.impl.SingleMessage;
import com.gexin.rp.sdk.base.impl.Target;
import com.gexin.rp.sdk.base.uitls.AppConditions;
import com.gexin.rp.sdk.exceptions.RequestException;
import com.gexin.rp.sdk.http.IGtPush;
import com.gexin.rp.sdk.template.LinkTemplate;
import com.gexin.rp.sdk.template.NotificationTemplate;
import com.gexin.rp.sdk.template.TransmissionTemplate;
import com.gexin.rp.sdk.template.style.Style0;
public class GetuiUtils {
private static String appId = "zJWXXzw2eN7H8qNuZ13u1";
private static String appKey = "VrbK80QzQ89cZfvxtyFzI8";
private static String masterSecret = "zD66fgm5Ux8ZAkOoGrUmc2";
public static String host = "https://sdk.open.api.igexin.com/apiex.htm";
// public static String CID_A = "096ed21e39f2a8f42bc78b4058973a1b";//在打包后的APP的js中获取 var cId = plus.push.getClientInfo().clientid;
public static String CID_A = "FAE67BE19A4A579114F8C34186EFA9D709F1BEB16358285316F3E38642C79761";//在打包后的APP的js中获取 var cId = plus.push.getClientInfo().clientid;
public static String CID_B = "bae837b470994d614f0773097b92dbf3";
public static IGtPush push;
static {
push = new IGtPush(host, appKey, masterSecret);
}
/**
* 绑定用户cid 别名
*
* @param Alias
* @param CID
* @return
*/
public static boolean bindAlias(String alias, String CID) {
IAliasResult bindSCid = push.bindAlias(appId, alias, CID);
if (bindSCid.getResult()) {
return true;
}
return false;
}
/**
* 对单个用户推送消息
*
* @param alias
* @param msg
* @return
*/
public static boolean pushMessageToSingle(String cid, String text, String transMsg) {
IGtPush push = new IGtPush(host, appKey, masterSecret);
NotificationTemplate template = notificationTemplate("title", text, transMsg);
SingleMessage message = new SingleMessage();
message.setOffline(true);
// 离线有效时间,单位为毫秒,可选
message.setOfflineExpireTime(24 * 3600 * 1000);
message.setData(template);
// 可选,1为wifi,0为不限制网络环境。根据手机处于的网络情况,决定是否下发
message.setPushNetWorkType(0);
Target target = new Target();
target.setAppId(appId);
target.setClientId(cid);
//target.setAlias(Alias);
IPushResult ret = null;
try {
ret = push.pushMessageToSingle(message, target);
} catch (RequestException e) {
e.printStackTrace();
ret = push.pushMessageToSingle(message, target, e.getRequestId());
}
if (ret != null && ret.getResponse() != null && ret.getResponse().containsKey("result")) {
System.out.println(ret.getResponse().toString());
if (ret.getResponse().get("result").toString().equals("ok") && ret.getResponse().containsKey("status")) {
return true;
}
}
return false;
}
/**
* 指定应用的所有用户群发推送消息
*
* @param msg
*/
public static boolean pushtoAPP(String text, String transMsg) {
IGtPush push = new IGtPush(host, appKey, masterSecret);
NotificationTemplate template = notificationTemplate("title", text, transMsg);
AppMessage message = new AppMessage();
message.setData(template);
message.setOffline(true);
//离线有效时间,单位为毫秒,可选
message.setOfflineExpireTime(24 * 1000 * 3600);
//推送给App的目标用户需要满足的条件
AppConditions cdt = new AppConditions();
List<String> appIdList = new ArrayList<String>();
appIdList.add(appId);
message.setAppIdList(appIdList);
//手机类型
List<String> phoneTypeList = new ArrayList<String>();
//省份
List<String> provinceList = new ArrayList<String>();
//自定义tag
List<String> tagList = new ArrayList<String>();
cdt.addCondition(AppConditions.PHONE_TYPE, phoneTypeList);
cdt.addCondition(AppConditions.REGION, provinceList);
cdt.addCondition(AppConditions.TAG, tagList);
message.setConditions(cdt);
IPushResult ret = push.pushMessageToApp(message, "msg_toApp");
if (ret != null && ret.getResponse() != null && ret.getResponse().containsKey("result")) {
System.out.println(ret.getResponse().toString());
if (ret.getResponse().get("result").toString().equals("ok")) {
return true;
}
}
return false;
}
/**
* 对单个用户推送透传消息
*
* @param alias
* @param title
* @param content
* @return
*/
public static boolean pushTransMessageToSingle(String cid, String msg) {
TransmissionTemplate template = transTemplate(cid, msg);
SingleMessage message = new SingleMessage();
message.setOffline(true);
// 离线有效时间,单位为毫秒,可选
message.setOfflineExpireTime(24 * 3600 * 1000);
message.setData(template);
// 可选,1为wifi,0为不限制网络环境。根据手机处于的网络情况,决定是否下发
message.setPushNetWorkType(0);
Target target = new Target();
target.setAppId(appId);
target.setClientId(cid);
IPushResult ret = null;
try {
ret = push.pushMessageToSingle(message, target);
} catch (RequestException e) {
e.printStackTrace();
ret = push.pushMessageToSingle(message, target, e.getRequestId());
}
if (ret != null && ret.getResponse() != null && ret.getResponse().containsKey("result")) {
System.out.println(ret.getResponse().toString());
if (ret.getResponse().get("result").toString().equals("ok") && ret.getResponse().containsKey("status")) {
return true;
}
}
return false;
}
public static void pushMessageToIBatch(List<String> alias, String msg) {
IBatch batch = push.getBatch();
IPushResult ret = null;
try {
for (int i = 0; i < alias.size(); i++) {
// 构建客户a的透传消息a
constructClientTransMsg(alias.get(i), msg, batch);
}
// 构建客户B的点击通知打开网页消息b
// constructClientLinkMsg(CID_B,"msgB",batch);
ret = batch.submit();
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(ret.getResponse().toString());
}
private static NotificationTemplate notificationTemplate(String title, String text, String obj) {
NotificationTemplate template = new NotificationTemplate();
// 设置APPID与APPKEY
template.setAppId(appId);
template.setAppkey(appKey);
// 透传消息设置,1为强制启动应用,客户端接收到消息后就会立即启动应用;2为等待应用启动
template.setTransmissionType(1);
template.setTransmissionContent(obj);
// 设置定时展示时间
// template.setDuration("2015-01-16 11:40:00", "2015-01-16 12:24:00");
Style0 style = new Style0();
// 设置通知栏标题与内容
style.setTitle(title);
style.setText(text);
// 配置通知栏图标
style.setLogo("XXX");
// 配置通知栏网络图标
//style.setLogoUrl("");
// 设置通知是否响铃,震动,或者可清除
style.setRing(true);
style.setVibrate(true);
style.setClearable(true);
template.setStyle(style);
return template;
}
private static TransmissionTemplate transTemplate(String cid, String msg) {
TransmissionTemplate template = new TransmissionTemplate();
// 设置APPID与APPKEY
template.setAppId(appId);
template.setAppkey(appKey);
template.setTransmissionContent(msg);
template.setTransmissionType(0); // 这个Type为int型,填写1则自动启动app
return template;
}
//点击通知打开应用模板
public static void constructClientTransMsg(String cid, String msg, IBatch batch) throws Exception {
SingleMessage message = new SingleMessage();
NotificationTemplate template = new NotificationTemplate();
// TransmissionTemplate template = new TransmissionTemplate();//自定义模板
template.setAppId(appId);
template.setAppkey(appKey);
template.setTransmissionContent(msg);//消息内容
template.setTransmissionType(1); // 这个Type为int型,填写1则自动启动app
Style0 style = new Style0(); // 设置通知栏标题与内容
style.setTitle("合同管理");
style.setText(msg); // 配置通知栏图标
style.setLogo(""); // 配置通知栏网络图标
style.setLogoUrl("");//网络图标地址
// 设置通知是否响铃,震动,或者可清除
style.setRing(true);
style.setVibrate(true);
style.setClearable(true);
template.setStyle(style);
message.setData(template);
message.setOffline(true);
message.setOfflineExpireTime(2 * 60 * 60 * 1000);
// 设置推送目标,填入appid和clientId
Target target = new Target();
target.setAppId(appId);
target.setClientId(cid);
batch.add(message, target);
}
//点击通知打开网页消息
public static void constructClientLinkMsg(String cid, String msg, IBatch batch) throws Exception {
SingleMessage message = new SingleMessage();
LinkTemplate template = new LinkTemplate();
template.setAppId(appId);
template.setAppkey(appKey);
template.setTitle("title");
template.setText(msg);
template.setLogo("push.png");
template.setLogoUrl("logoUrl");
template.setUrl("http://www.baidu.com");
message.setData(template);
message.setOffline(true);
message.setOfflineExpireTime(60 * 1000);
// 设置推送目标,填入appid和clientId
Target target = new Target();
target.setAppId(appId);
target.setClientId(cid);
batch.add(message, target);
}
public static void main(String[] args) throws IOException {
IIGtPush push = new IGtPush(host, appKey, masterSecret);
IBatch batch = push.getBatch();
try {
//构建客户a的透传消息a
GetuiUtils.constructClientTransMsg(CID_A, "msgA", batch);
//构建客户B的点击通知打开网页消息b
// constructClientLinkMsg(CID_B, "msgB", batch);
} catch (Exception e) {
e.printStackTrace();
}
batch.submit();
}
}
三、controller应用
package com.zsplat.contract.controller;
import com.gexin.rp.sdk.base.IBatch;
import com.zsplat.contract.model.ZsFundFlow;
import com.zsplat.contract.model.ZsGoods;
import com.zsplat.contract.model.ZsGoodsFlow;
import com.zsplat.contract.model.ZsPubDoctor;
import com.zsplat.contract.service.*;
import com.zsplat.contract.util.DateUtil;
import com.zsplat.contract.util.GetuiUtils;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @author ZhouPan
* @version V1.0
* @ClassName: messageQuartz
* @Description: TODO(这个类的作用是 : 定时发送消息)
* @date 2018/9/12 20:07
*/
@Component(value = "messageQuartz")
public class messageQuartz {
@Resource
private GoodsFlowService goodsFlowService;
@Resource
private ContractService contractService;
@Resource
private MessageService messageService;
@Resource
private PubDoctorService pubDoctorService;
@Resource
private FundFlowService fundFlowService;
private static int CALC = 0;
@Scheduled(cron="30 * * * * ?")
// @Scheduled(cron = "0 0 9 * * ? ") //每天早上9:00触发
public void sendMessage() {
Map<String, Object> paramsMap = new HashMap<String, Object>();
try {
IBatch batch = GetuiUtils.push.getBatch();
/*货物流推送 0:备货;1:生产;2:包装;3:发货;4:到场;5:验收;6:移交;*/
List<ZsGoodsFlow> ZsGoodsFlowList = goodsFlowService.queryGoodsFlow(paramsMap);
/*资金流消息定时推送 0:预付款;1:进度款;2:发货款;3:收货款;4:验收款;5:质保金;*/
List<ZsFundFlow> zsFundFlowsList = fundFlowService.queryFundFlow(paramsMap);
for (int i = 0; i < zsFundFlowsList.size(); i++) {
ZsFundFlow zsFundFlow = zsFundFlowsList.get(i);
if (zsFundFlow.getTime1() != null) {
int days = DateUtil.differentDaysByMillisecond(new Date(), zsFundFlow.getTime1());
if (days == 7) {
//发送的信息详情
String sendContent = "";
ZsGoods goodsModel = null;
if (zsFundFlow.getType().equals("0")) {
goodsModel = zsFundFlow.getGoodsModel();
//发送的信息详情
sendContent = goodsModel.getContractName() + "下的" + goodsModel.getGoodsName() + "还有7天就要预付款,请提前做好准备,准备结款";
} else if (zsFundFlow.getType().equals("1")) {
goodsModel = zsFundFlow.getGoodsModel();
//发送的信息详情
sendContent = goodsModel.getContractName() + "下的" + goodsModel.getGoodsName() + "还有7天就要进度款,请提前做好准备,准备结款";
} else if (zsFundFlow.getType().equals("2")) {
goodsModel = zsFundFlow.getGoodsModel();
//发送的信息详情
sendContent = goodsModel.getContractName() + "下的" + goodsModel.getGoodsName() + "还有7天就要发货款,请提前做好准备,准备结款";
} else if (zsFundFlow.getType().equals("3")) {
goodsModel = zsFundFlow.getGoodsModel();
//发送的信息详情
sendContent = goodsModel.getContractName() + "下的" + goodsModel.getGoodsName() + "还有7天就要收货款,请提前做好准备,准备结款";
} else if (zsFundFlow.getType().equals("4")) {
goodsModel = zsFundFlow.getGoodsModel();
//发送的信息详情
sendContent = goodsModel.getContractName() + "下的" + goodsModel.getGoodsName() + "还有7天就要验收款,请提前做好准备,准备结款";
} else if (zsFundFlow.getType().equals("5")) {
goodsModel = zsFundFlow.getGoodsModel();
//发送的信息详情
sendContent = goodsModel.getContractName() + "下的" + goodsModel.getGoodsName() + "还有7天就要质保金,请提前做好准备,准备结款";
} else {
continue;
}
Map<String, Object> goodsMap = new HashMap<String, Object>();
goodsMap.put("deptName", goodsModel.getDeptName());
List<ZsPubDoctor> zsPubDoctors = pubDoctorService.selectByRoleIdAndDept(goodsMap);
ZsPubDoctor createUserModel = goodsModel.getCreateUserModel();//创建货物的用户
boolean flag = true;//默认创建人不是领导
for (int j = 0; j < zsPubDoctors.size(); j++) {
Map<String, Object> messageMap = new HashMap<String, Object>();//消息实体参数
ZsPubDoctor zsPubDoctor = zsPubDoctors.get(j);
if (zsPubDoctor.getId() == createUserModel.getId()) {
flag = false;
}
if(zsPubDoctor.getRole().getId()==49){
if (zsFundFlow.getType().equals("5")) {
messageMap.put("contractNumber", goodsModel.getContractNumber());
messageMap.put("contractName", goodsModel.getContractName());
messageMap.put("goodId", goodsModel.getId());
messageMap.put("goodName", goodsModel.getGoodsName());
messageMap.put("node", "1");
messageMap.put("type", zsFundFlow.getType());
messageMap.put("content", sendContent);
messageMap.put("acceptId", zsPubDoctor.getId());
messageMap.put("acceptName", zsPubDoctor.getRealname());
messageMap.put("createTime", new Date());
Integer messageId = messageService.addMessage(messageMap);
GetuiUtils.constructClientTransMsg(zsPubDoctor.getClientId(), sendContent, batch);
batch.submit();
} else {
continue;
}
} else {
messageMap.put("contractNumber", goodsModel.getContractNumber());
messageMap.put("contractName", goodsModel.getContractName());
messageMap.put("goodId", goodsModel.getId());
messageMap.put("goodName", goodsModel.getGoodsName());
messageMap.put("node", "1");
messageMap.put("type", zsFundFlow.getType());
messageMap.put("content", sendContent);
messageMap.put("acceptId", zsPubDoctor.getId());
messageMap.put("acceptName", zsPubDoctor.getRealname());
messageMap.put("createTime", new Date());
Integer messageId = messageService.addMessage(messageMap);
GetuiUtils.constructClientTransMsg(zsPubDoctor.getClientId(), sendContent, batch);
batch.submit();
}
}
if (flag) {
Map<String, Object> messageMap = new HashMap<String, Object>();//消息实体参数
messageMap.put("contractNumber", goodsModel.getContractNumber());
messageMap.put("contractName", goodsModel.getContractName());
messageMap.put("goodId", goodsModel.getId());
messageMap.put("goodName", goodsModel.getGoodsName());
messageMap.put("node", "1");
messageMap.put("type", zsFundFlow.getType());
messageMap.put("content", sendContent);
messageMap.put("acceptId", createUserModel.getId());
messageMap.put("acceptName", createUserModel.getRealname());
messageMap.put("createTime", new Date());
Integer messageId = messageService.addMessage(messageMap);
GetuiUtils.constructClientTransMsg(createUserModel.getClientId(), sendContent, batch);
batch.submit();
}
//goodsMap.put("contractNumber",goodsModel.getContractNumber());
//合同编号
//List<ZsContract> zsContractList = contractService.queryContract(new HashMap<String, Object>());
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
四、app(mui+h5)首页
获取token
var clientId = null;
if (mui.os.ios) {
clientId = plus.push.getClientInfo().token;
}
if (mui.os.android) {
clientId = plus.push.getClientInfo().clientid;
}
html页面
document.addEventListener("plusready", function() {
var message = document.getElementById("message");
// 监听点击消息事件
plus.push.addEventListener("click", function(msg) {
// 判断是从本地创建还是离线推送的消息
switch(msg.payload) {
case "LocalMSG":
outSet("点击本地创建消息启动:");
break;
default:
outSet("点击离线推送消息启动:");
break;
}
// 提示点击的内容
plus.ui.alert(msg.content);
// 处理其它数据
logoutPushMsg(msg);
}, false);
// 监听在线消息事件
plus.push.addEventListener("receive", function(msg) {
mui.openWindow({
url: "../setting/message.html",
id: "message",
extras: {}
});
if(msg.aps) { // Apple APNS message
outSet("接收到在线APNS消息:");
} else {
outSet("接收到在线透传消息:");
}
logoutPushMsg(msg);
}, false);
}, false);