本代码适用于unipush1.0版本的个推使用
先在项目pom中导入个推依赖
<!-- APP个推 -->
<dependency>
<groupId>com.getui.push</groupId>
<artifactId>restful-sdk</artifactId>
<version>1.0.0.4</version>
</dependency>
推送配置类:推送配置从配置文件中读取
import com.getui.push.v2.sdk.ApiHelper;
import com.getui.push.v2.sdk.GtApiConfiguration;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* 个推推送类
*/
@Configuration
public class GTPushConfig {
@Value("${push.app_id}")
private String appId;
@Value("${push.app_key}")
private String appKey;
@Value("${push.master_secret}")
private String masterSecret;
@Bean(name = "myApiHelper")
public ApiHelper apiHelper() {
// 设置httpClient最大连接数,当并发较大时建议调大此参数。或者启动参数加上 -Dhttp.maxConnections=200
System.setProperty("http.maxConnections", "200");
GtApiConfiguration apiConfiguration = new GtApiConfiguration();
// 填写应用配置
apiConfiguration.setAppId(appId);
apiConfiguration.setAppKey(appKey);
apiConfiguration.setMasterSecret(masterSecret);
// 接口调用前缀,请查看文档: 接口调用规范 -> 接口前缀, 可不填写appId
// 默认为https://restapi.getui.com/v2
apiConfiguration.setDomain("https://restapi.getui.com/v2/");
// 实例化ApiHelper对象,用于创建接口对象
ApiHelper apiHelper = ApiHelper.build(apiConfiguration);
return apiHelper;
}
}
推送集成工具类:注意厂商推送的Intent配置里的component=com.xx.xx改成自己的安卓打包包名,
该推送包含了华为、荣耀厂商推送角标,已经测试过正常显示角标
import com.getui.push.v2.sdk.ApiHelper;
import com.getui.push.v2.sdk.api.PushApi;
import com.getui.push.v2.sdk.common.ApiResult;
import com.getui.push.v2.sdk.dto.CommonEnum;
import com.getui.push.v2.sdk.dto.req.Audience;
import com.getui.push.v2.sdk.dto.req.AudienceDTO;
import com.getui.push.v2.sdk.dto.req.Settings;
import com.getui.push.v2.sdk.dto.req.Strategy;
import com.getui.push.v2.sdk.dto.req.message.PushChannel;
import com.getui.push.v2.sdk.dto.req.message.PushDTO;
import com.getui.push.v2.sdk.dto.req.message.PushMessage;
import com.getui.push.v2.sdk.dto.req.message.android.AndroidDTO;
import com.getui.push.v2.sdk.dto.req.message.android.ThirdNotification;
import com.getui.push.v2.sdk.dto.req.message.android.Ups;
import com.getui.push.v2.sdk.dto.req.message.ios.Alert;
import com.getui.push.v2.sdk.dto.req.message.ios.Aps;
import com.getui.push.v2.sdk.dto.req.message.ios.IosDTO;
import com.getui.push.v2.sdk.dto.res.TaskIdDTO;
import com.opencloud.common.utils.JSONUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Slf4j
@Component
public class UniPushUtils {
// 消息推送
public static final String MESSAGE_PUSH = "1";
// 离线推送
public static final String OFFLINE_PUSH = "2";
@Resource(name = "myApiHelper")
private ApiHelper myApiHelper;
/**
* 消息推送(离线推送)单cid推送
*/
public ApiResult<Map<String, Map<String, String>>> pushToSingleByCid(String cid, String title, String content, String linkUrl, String type) {
PushDTO<Audience> pushDTO = this.buildPushDTO(title, content, linkUrl, type);
// 设置接收人信息
Audience audience = new Audience();
pushDTO.setAudience(audience);
audience.addCid(cid); // cid
// 进行cid单推
PushApi pushApi = myApiHelper.creatApi(PushApi.class);
ApiResult<Map<String, Map<String, String>>> apiResult = pushApi.pushToSingleByCid(pushDTO);
if (apiResult.isSuccess()) {
// success
log.info("推送成功");
System.out.println(apiResult.getData());
} else {
// failed
log.error("推送失败");
System.out.println("code:" + apiResult.getCode() + ", msg: " + apiResult.getMsg());
}
return apiResult;
}
/**
* 消息推送(离线推送)别名推送
*/
public ApiResult<Map<String, Map<String, String>>> pushToSingleByAlias(String alias, String title, String content, String linkUrl, String type) {
PushDTO<Audience> pushDTO = this.buildPushDTO(title, content, linkUrl, type);
// 设置接收人信息
Audience audience = new Audience();
pushDTO.setAudience(audience);
audience.addAlias(alias); // cid
// 进行cid单推
PushApi pushApi = myApiHelper.creatApi(PushApi.class);
ApiResult<Map<String, Map<String, String>>> apiResult = pushApi.pushToSingleByAlias(pushDTO);
if (apiResult.isSuccess()) {
// success
log.info("推送成功");
System.out.println(apiResult.getData());
} else {
// failed
log.error("推送失败");
System.out.println("code:" + apiResult.getCode() + ", msg: " + apiResult.getMsg());
}
return apiResult;
}
/**
* cid批量推
* @param cidList
* @param title
* @param content
*/
public ApiResult<Map<String, Map<String, String>>> pushListByCid(List<String> cidList, String title, String content, String linkUrl, String type) {
//批量发送
AudienceDTO audienceDTO = new AudienceDTO();
PushDTO<Audience> pushDTO = this.buildPushDTO(title, content, linkUrl, type);
PushApi pushApi = myApiHelper.creatApi(PushApi.class);
ApiResult<TaskIdDTO> createApiResult = pushApi.createMsg(pushDTO);
if (! createApiResult.isSuccess()) {
log.error("推送:创建消息失败"+createApiResult.getMsg());
}
// 设置接收人信息
Audience audience = new Audience();
pushDTO.setAudience(audience);
audience.setCid(cidList);
audienceDTO.setAudience(audience);
audienceDTO.setTaskid(createApiResult.getData().getTaskId());
audienceDTO.setAsync(true);
ApiResult<Map<String, Map<String, String>>> apiResult = pushApi.pushListByCid(audienceDTO);
if (apiResult.isSuccess()) {
// success
log.info("推送成功");
} else {
// failed
log.error("推送失败");
System.out.println("code:" + apiResult.getCode() + ", msg: " + apiResult.getMsg());
}
return apiResult;
}
/**
* 推送所有用户
*
* @param title
* @param content
* @param linkUrl
* @return
*/
public ApiResult<TaskIdDTO> pushAll(String title, String content, String linkUrl, String type) {
PushDTO<String> pushDTO = this.pushDTOAll(title, content, linkUrl, type);
// 进行cid单推
PushApi pushApi = myApiHelper.creatApi(PushApi.class);
ApiResult<TaskIdDTO> apiResult = pushApi.pushAll(pushDTO);
if (apiResult.isSuccess()) {
// success
log.info("推送成功");
System.out.println(apiResult.getData());
} else {
// failed
log.error("推送失败");
System.out.println("code:" + apiResult.getCode() + ", msg: " + apiResult.getMsg());
}
return apiResult;
}
/**
* 推送全部组装消息实体
*
* @param title
* @param content
* @param linkUrl
* @return
*/
private PushDTO<String> pushDTOAll(String title, String content, String linkUrl, String type) {
Map<String, String> map = new HashMap<>();
map.put("title", title);
map.put("content", content);
map.put("linkUrl", linkUrl);
map.put("type", type);
// 转json对象
String payload = JSONUtils.toJSONString(map);
PushDTO<String> pushDTO = new PushDTO<String>();
pushDTO.setRequestId(System.currentTimeMillis() + "");
pushDTO.setGroupName("g-name1");
Settings settings = new Settings();
settings.setTtl(3600000);
Strategy strategy = new Strategy();
strategy.setSt(1);
settings.setStrategy(strategy);
pushDTO.setSettings(settings);
//TODO 安卓IOS应用在线走个推通道
PushMessage pushMessage = new PushMessage();
Map<String, Object> mapTC = new HashMap<>();
mapTC.put("title", title);
mapTC.put("content", content);
mapTC.put("linkUrl", linkUrl);
mapTC.put("type", type);
mapTC.put("payload", payload);
String jsonTC = JSONUtils.toJSONString(mapTC);
pushMessage.setTransmission(jsonTC);
pushDTO.setPushMessage(pushMessage);
//安卓应用离线走厂商
PushChannel pushChannel = new PushChannel();
AndroidDTO androidDTO = new AndroidDTO();
Ups ups = new Ups();
ThirdNotification thirdNotification = new ThirdNotification();
thirdNotification.setClickType(CommonEnum.ClickTypeEnum.TYPE_INTENT.type);
thirdNotification.setTitle(title);
thirdNotification.setBody(content);
thirdNotification.setIntent("intent://io.dcloud.unipush/?#Intent;scheme=unipush;launchFlags=0x4000000;" +
"component=com.xx.xx/io.dcloud.PandoraEntry;S.UP-OL-SU=true;" +
"S.title="+title+";" +
"S.content="+content+";" +
"S.payload="+payload+";end");
ups.setNotification(thirdNotification);
//设置options 方式二
Map<String, Map<String, Object>> options = new HashMap<String, Map<String, Object>>();
Map<String, Object> all = new HashMap<String, Object>();
all.put("channel", "default");
all.put("badgeAddNum", 1);
all.put("badgeClass", "com.getui.demo.GetuiSdkDemoActivity");
options.put("ALL", all);
Map<String, Object> hw = new HashMap<String, Object>();
options.put("HW", hw);
hw.put("/message/android/notification/badge/class", "io.dcloud.PandoraEntry");
hw.put("/message/android/notification/badge/add_num",1);
Map<String, Object> ho = new HashMap<String, Object>();
options.put("HO", ho);
ho.put("/message/android/notification/badge/badgeClass", "io.dcloud.PandoraEntry");
ho.put("/message/android/notification/badge/addNum",1);
ups.setOptions(options);
androidDTO.setUps(ups);
pushChannel.setAndroid(androidDTO);
IosDTO iosDTO = new IosDTO();
Aps aps = new Aps();
Alert alert = new Alert();
alert.setTitle(title);
alert.setBody(content);
aps.setContentAvailable(0);
aps.setSound("default");
aps.setAlert(alert);
iosDTO.setPayload(payload);
iosDTO.setAps(aps);
iosDTO.setType("notify");
iosDTO.setAutoBadge("+1");//苹果角标
pushChannel.setIos(iosDTO);
pushDTO.setPushChannel(pushChannel);
return pushDTO;
}
/**
* 消息参数模板
*/
private PushDTO<Audience> buildPushDTO(String title, String content, String linkUrl, String type) {
Map<String, String> map = new HashMap<>();
map.put("title", title);
map.put("content", content);
map.put("linkUrl", linkUrl);
map.put("type", type);
// 转json对象
String payload = JSONUtils.toJSONString(map);
PushDTO<Audience> pushDTO = new PushDTO<Audience>();
pushDTO.setRequestId(System.currentTimeMillis() + "");
pushDTO.setGroupName("g-name1");
Settings settings = new Settings();
settings.setTtl(3600000);
Strategy strategy = new Strategy();
strategy.setSt(1);
settings.setStrategy(strategy);
pushDTO.setSettings(settings);
//TODO 安卓IOS应用在线走个推通道
PushMessage pushMessage = new PushMessage();
Map<String, Object> mapTC = new HashMap<>();
mapTC.put("title", title);
mapTC.put("content", content);
mapTC.put("linkUrl", linkUrl);
mapTC.put("type", type);
mapTC.put("payload", payload);
String jsonTC = JSONUtils.toJSONString(mapTC);
pushMessage.setTransmission(jsonTC);
pushDTO.setPushMessage(pushMessage);
//TODO 安卓应用离线走厂商
PushChannel pushChannel = new PushChannel();
AndroidDTO androidDTO = new AndroidDTO();
Ups ups = new Ups();
ThirdNotification thirdNotification = new ThirdNotification();
thirdNotification.setClickType(CommonEnum.ClickTypeEnum.TYPE_INTENT.type);
thirdNotification.setTitle(title);
thirdNotification.setBody(content);
thirdNotification.setIntent("intent://io.dcloud.unipush/?#Intent;scheme=unipush;launchFlags=0x4000000;" +
"component=com.xx.xx/io.dcloud.PandoraEntry;S.UP-OL-SU=true;" +
"S.title="+title+";" +
"S.content="+content+";" +
"S.payload="+payload+";end");
ups.setNotification(thirdNotification);
//设置options 方式二
Map<String, Map<String, Object>> options = new HashMap<String, Map<String, Object>>();
Map<String, Object> all = new HashMap<String, Object>();
all.put("channel", "default");
all.put("badgeAddNum", 1);
all.put("badgeClass", "com.getui.demo.GetuiSdkDemoActivity");
options.put("ALL", all);
Map<String, Object> hw = new HashMap<String, Object>();
options.put("HW", hw);
hw.put("/message/android/notification/badge/class", "io.dcloud.PandoraEntry");
hw.put("/message/android/notification/badge/add_num",1);
Map<String, Object> ho = new HashMap<String, Object>();
options.put("HO", ho);
ho.put("/message/android/notification/badge/badgeClass", "io.dcloud.PandoraEntry");
ho.put("/message/android/notification/badge/addNum",1);
ups.setOptions(options);
androidDTO.setUps(ups);
pushChannel.setAndroid(androidDTO);
//TODO ios离线推送
IosDTO iosDTO = new IosDTO();
Aps aps = new Aps();
Alert alert = new Alert();
alert.setTitle(title);
alert.setBody(content);
aps.setContentAvailable(0);
aps.setSound("default");
aps.setAlert(alert);
iosDTO.setPayload(payload);
iosDTO.setAps(aps);
iosDTO.setType("notify");
iosDTO.setAutoBadge("+1");
pushChannel.setIos(iosDTO);
pushDTO.setPushChannel(pushChannel);
return pushDTO;
}
/**
* 离线通知消息参数模板
*/
private PushDTO<Audience> offlinePushDTO(String title, String content, String linkUrl, String type) {
PushDTO<Audience> pushDTO = new PushDTO<>();
// 设置推送参数
//requestid需要每次变化唯一
pushDTO.setRequestId(System.currentTimeMillis() + "");
pushDTO.setGroupName("wxb-group");
// PushMessage在线走个推通道才会起作用的消息体
Map<String, String> map = new HashMap<>();
map.put("title", title);
map.put("content", content);
map.put("linkUrl", linkUrl);
map.put("type", type);
PushMessage pushMessage = new PushMessage();
pushDTO.setPushMessage(pushMessage);
Map<String, Object> mapTC = new HashMap<>();
mapTC.put("title", title);
mapTC.put("content", content);
mapTC.put("payload", map);
String jsonTC = JSONUtils.toJSONString(mapTC);
System.err.println(jsonTC);
pushMessage.setTransmission(jsonTC);
log.info("pushDTO:{}", pushDTO);
return pushDTO;
}
}
单元测试参考:
//String alias = "29f27029ec9245a49335c02bff224952";//ios
String cid = "ba0c214fdf43f434gfg44545dghg4ttt";//iosk
String title = "“金点子”征集活动上线啦!";
String content = "2023年公司工作会暨职工代表大会金点子征集活动上线!点击参与“金点子”征集活动,赢精美礼品!";
String linkUrl = "/pages/viewactivityweb/viewactivityweb?";
String type = "click";
//ApiResult<Map<String, Map<String, String>>> map = uniPushUtils.pushToSingleByAlias(cid,title,content,linkUrl,type);
ApiResult<TaskIdDTO> map = uniPushUtils.pushAll(title,content,linkUrl,type);
APP端代码仅供参考:
App.vue中处理消息监听:
//消息推送监听处理
//#ifdef APP-PLUS
plus.push.addEventListener("click", function(msg) {
var payload = {};
var platform = uni.getSystemInfoSync().platform;
if (platform == "ios") {
if (msg['type'] == "click") {
//通过苹果服务器通知过来的消息
payload = msg['payload'];
} else {
//通过个推透传,创建本地通知的消息
payload = JSON.parse(JSON.parse(msg.payload));
}
} else if (platform == 'android') {
payload = msg.payload;
}
//跳转对应页面
setTimeout(function() {
if (payload.linkUrl) {
uni.navigateTo({
url: payload.linkUrl,
})
}
}, 1000)
}, false);
//在线消息推送监听处理
plus.push.addEventListener("receive", function(msg) {
console.log("receive:" + msg)
var platform = uni.getSystemInfoSync().platform;
let payload = msg.payload
if (platform == "ios") {
if (msg.type == "receive") // 这里判断触发的来源,否则一直推送。
{
//ios平台应用在前台时,不能收到通知消息,只能走透传,在创建一条本地消息 plus.push.createMessage(msg.content, JSON.stringify(msg.payload), { title: msg.title });
var options = {
cover: false,
title: msg.title
};
//创建一条推送消息
plus.push.createMessage(msg.content, JSON.stringify(msg.payload), options);
//添加在线消息提示点
getApp().globalData.badgeNumber = getApp().globalData.badgeNumber+1;
plus.runtime.setBadgeNumber(getApp().globalData.badgeNumber);
}
} else if (platform == 'android') {
var options = {
cover: false,
title: msg.title
};
//创建一条推送消息
plus.push.createMessage(msg.content, JSON.stringify(msg.payload), options);
//添加在线消息提示点
getApp().globalData.badgeNumber = getApp().globalData.badgeNumber+1;
plus.runtime.setBadgeNumber(getApp().globalData.badgeNumber);
}
}, false);
// #endif
App端绑定别名以及处理清除消息提示点:
新建getui.js
function igexinTool() {
var isAndorid, PushManager, context, Instance, GeTuiSdk, UIApplication, oldNum;
//#ifdef APP-PLUS
if (plus.os.name == 'Android') {
isAndorid = true;
} else {
isAndorid = false;
}
if (isAndorid) {
PushManager = plus.android.importClass("com.igexin.sdk.PushManager");
context = plus.android.runtimeMainActivity().getContext();
Instance = PushManager.getInstance();
} else {
GeTuiSdk = plus.ios.importClass("GeTuiSdk");
}
// #endif
this.bindAlias = function(alias) {
if (isAndorid) {
Instance.bindAlias(context, alias);
} else {
GeTuiSdk.bindAliasandSequenceNum(alias, alias);
}
}
this.unbindAlias = function(alias) {
if (isAndorid) {
Instance.unBindAlias(context, alias, true);
} else {
GeTuiSdk.unbindAliasandSequenceNumandIsSelf(alias, alias, true);
}
}
this.getVersion = function() {
if (isAndorid) {
return Instance.getVersion(context);
} else {
return GeTuiSdk.version;
}
}
//开启推送
this.turnOnPush = function() {
if (isAndorid) {
Instance.turnOnPush(context);
} else {
GeTuiSdk.setPushModeForOff(false);
}
}
//关闭推送
this.turnOffPush = function() {
if (isAndorid) {
Instance.turnOffPush(context);
} else {
GeTuiSdk.setPushModeForOff(true);
}
}
//清除消息角标
this.clearnBadge = function() {
getApp().globalData.badgeNumber = 0;
//清除角标
if (isAndorid) {
//设置应用图标的数量
plus.runtime.setBadgeNumber(0);
plus.runtime.setBadgeNumber(-1);
} else {
//设置应用图标的数量
plus.runtime.setBadgeNumber(0);
GeTuiSdk.setBadge(0);
}
}
}
export default igexinTool
清除消息角标:
App.vue引入js
import igexinTool from '@/config/getui.js'
onShow: function() {
//清除消息角标
var tool = new igexinTool();
tool.clearnBadge();
},
绑定推送别名:
在需要绑定别名的业务逻辑页面引入js
import igexinTool from '@/config/getui.js'
var tool = new igexinTool();
tool.bindAlias('需要绑定的别名 如:用户ID');