背景:最近公司app做用户推送功能,通过用户分析,85%的用户用的是华为,oppo,vivo。所以先考虑集成此三个平台,再开发过程中还是有一些坑的,在此记录一下。
1.华为推送:
sdk地址:https://developer.huawei.com/consumer/cn/service/hms/catalog/huaweipush_v3.html?page=hmssdk_huaweipush_sample_code_v3_s
解压后导入开发工具中,然后打包放到公司私服上:
:

注意这两个要是utf-8.
把pom.xml文件中的version改成1.0,因为这个jar包我们一般是不会改的。然后

把生成的上传到私服:

根据demo写个push的service:
package com.service.push.impl;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.annotation.PostConstruct;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import com.alibaba.fastjson.JSON;
import com.huawei.push.javasdk.exception.HuaweiMesssagingException;
import com.huawei.push.javasdk.message.AndroidConfig;
import com.huawei.push.javasdk.message.AndroidNotification;
import com.huawei.push.javasdk.message.ClickAction;
import com.huawei.push.javasdk.message.ClickAction.Builder;
import com.huawei.push.javasdk.message.Message;
import com.huawei.push.javasdk.message.Notification;
import com.huawei.push.javasdk.messaging.HuaweiApp;
import com.huawei.push.javasdk.messaging.HuaweiCredential;
import com.huawei.push.javasdk.messaging.HuaweiMessaging;
import com.huawei.push.javasdk.messaging.HuaweiOption;
import com.huawei.push.javasdk.messaging.ImplHuaweiTrampolines;
import com.huawei.push.javasdk.messaging.SendResponce;
//Push通知栏消息Demo
@Service
public class HuaPushServiceImpl extends PushService{
private static final Logger logger = LoggerFactory.getLogger(HuaPushServiceImpl.class);
private static String appId = "111111";
private static String appSecret = "914ce65aaffcd68207027335bb07a6d6111";
private static Map<String,HuaweiApp> appMap = new HashMap<>();
public static void main(String[] args) throws Exception {
String title = "这样的自驾游真是让人羡慕";
String content = "美国30天,玩遍全美所有景点";
Map<String, String> extras = new HashMap<String, String>();
extras.put("type", "1");
extras.put("videoId", "181578");
extras.put("targetUid", "775923");
String intent = "intent://com.piaoquantv/pushrouter?#Intent;scheme=pushscheme;launchFlags=0x4000000;";
intent = intent + "S.data="+JSON.toJSONString(extras)+";end";
logger.info("intent:"+intent);
HuaPushServiceImpl pushService = new HuaPushServiceImpl();
PushParamModel model = new PushParamModel();
model.setTitle(title);
model.setMsgContent(content);
model.setPushBrand(PushBrandEnum.HW.getBrand());
model.setApptype(AppTypeEnum.APPSPEED.getCode());
model.setDeviceToken(new String[]{"AC2cBkB1uEJh16hUFk2W5MTCGoG7nQO1xWhBV2K_YrhEYn-fb002hLrS8iQqOsMiJ0bOrKzY1RUJWY7mrK2B2ncD7tUHgOD6DgUh3OU4xlShV0rj3zXJF3YmXU0bHJybIA"});
model.setActionType(1);
model.setActionContent(intent);
pushService.sendNotificationMessage(model);
}
/**
*
* @Title: sendNotificationMessage
* @Description: 发送通知栏消息
* @param: @param apptype app类型
* @param: @param title 消息标题
* @param: @param msgContent 消息内容
* @param: @param extras 业务信息
* @param: @param actionType 点击类型
* 1标识点击行为用户自定义;2标识打开特定URL;3标识打开本业务的APP;4标识打开富媒体信息。
* @param: @param actionContent
* 当type为1时必选 intent 当type为2时必选 url 当type为4时必选rich_resource
* @param: @param deviceToken
* 用户注册id
* @param: @throws Exception
* @return: void
* @throws
* @author:石德斌
* @date:2020年4月8日 下午9:13:14
*/
@SuppressWarnings({ "rawtypes", "unchecked" })
public PushResult sendNotificationMessage(PushParamModel model) throws Exception {
Notification notification = new Notification(model.getTitle(),model.getMsgContent());
Builder builder = ClickAction.builder();
Integer apptype = model.getApptype();
Integer actionType = HWActionType.parseDescr(ActionType.getDescr(model.getActionType()));
String actionContent = model.getActionContent();
String[] deviceToken = model.getDeviceToken();
Map<String, String> extras = model.getExtras();
builder = builder.setType(actionType);
if(ActionType.INTENT.getCode().equals(actionType)){
builder = builder.setIntent(actionContent);
}else if(ActionType.URL.getCode().equals(actionType)){
builder = builder.setUrl(actionContent);
}else if(ActionType.APP.getCode().equals(actionType)){
}else if(ActionType.RICH.getCode().equals(actionType)){
builder = builder.setRichResource(actionContent);
}
ClickAction clickAction = builder.build();
AndroidNotification androidNotification = AndroidNotification.builder().setClickAction(clickAction)
.build();
logger.info("发送消息:"+JSON.toJSONString(androidNotification));
AndroidConfig androidConfig = AndroidConfig.builder().setNotification(androidNotification).build();
Message normalNotificationMessage = buildNotificationMessage(JSON.toJSONString(extras),notification,
androidConfig,Arrays.asList(deviceToken));
SendResponce responce = sendMessage(apptype,normalNotificationMessage,false);
PushResult result = new PushResult();
if(responce.getCode() == 80000000){
result.setCode(0);
}else{
result.setCode(-1);
}
result.setMsg(responce.getMsg());
result.setResponseId(responce.getRequestId());
return result;
}
public static HuaweiApp initializeApp() {
HuaweiCredential credential = HuaweiCredential.builder().setAppId(appId).setAppSecret(appSecret).build();
// Create HuaweiOption
HuaweiOption option = HuaweiOption.builder().setCredential(credential).build();
HuaweiApp app = HuaweiApp.initializeApp(option);
synchronized (appMap) {
if(appMap.get(appId) ==null){
synchronized (appMap) {
appMap.put(appId, app);
}
}
}
// Initialize HuaweiApp
return app;
}
/**
*
* @Title: sendToTopic
* @Description: 构造广播消息
* @param: @param apptype
* @param: @param topic
* @param: @param message
* @param: @return
* @param: @throws HuaweiMesssagingException
* @return: Message
* @throws
* @author:石德斌
* @date:2020年4月8日 上午11:19:38
*/
public Message buildTopicMessage(String data,String topic,Message message) throws HuaweiMesssagingException {
return Message.builder()
.setData(data)
.setTopic(topic)
.build();
}
/**
*
* @Title: buildConditionMessage
* @Description: 构造条件消息
* @param: @param data
* @param: @param condition
* @param: @param message
* @param: @return
* @param: @throws HuaweiMesssagingException
* @return: Message
* @throws
* @author:石德斌
* @date:2020年4月8日 上午11:17:32
*/
public Message buildConditionMessage(String data,String condition,Message message ) throws HuaweiMesssagingException {
return Message.builder()
.setData(data)
.setTopic(condition)
.build();
}
/**
*
* @Title: sendMessage
* @Description: 发送push消息
* @param: @param apptype
* @param: @param message
* @param: @param validateOnly true是测试消息,false是正式消息
* @param: @return
* @param: @throws HuaweiMesssagingException
* @return: SendResponce 80000000:成功
* @throws
* @author:石德斌
* @date:2020年4月8日 下午3:14:31
*/
public static SendResponce sendMessage(Integer apptype,Message message,boolean validateOnly) throws HuaweiMesssagingException {
if(AppTypeEnum.APPSPEED.getCode().equals(apptype)){
appId = "10180121";
appSecret = "1d7dfbed821296e308ac54ad008a160b4d219c96383aec39cc97897a82dde321321";
}
HuaweiApp app = appMap.get(appId);
if(app == null){
app = initializeApp();
}
logger.info("华为push拿到的accessToken{}",ImplHuaweiTrampolines.getAccessToken(app));
SendResponce response = HuaweiMessaging.getInstance(app).send(message, validateOnly);
logger.info("华为push请求结果{}",JSON.toJSONString(response));
System.out.println(JSON.toJSONString(response));
return response;
}
/**
*
* @Title: buildNotificationMessage
* @Description: 构造通知消息
* @param: @param apptype
* @param: @param notification
* @param: @param androidConfig
* @param: @param tokens
* @param: @return
* @return: Message
* @throws
* @author:石德斌
* @date:2020年4月8日 上午11:18:30
*/
public static Message buildNotificationMessage(String data,Notification notification,AndroidConfig androidConfig,List<String> tokens) {
return Message.builder().setNotification(notification).setAndroidConfig(androidConfig)
.addAllToken(tokens).setData(data).build();
}
@Override
@PostConstruct
public void initMap() {
pushMap.put(PushBrandEnum.HW.getBrand(), this);
}
}
vivo推送sdk:https://dev.vivo.com.cn/documentCenter/doc/197
直接解压后传到公司私服,然后工程pom文件引入就可以了。
pushservice:
package com..service.push.impl;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
import javax.annotation.PostConstruct;
import org.apache.commons.collections.CollectionUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.vivo.push.sdk.notofication.InvalidUser;
import com.vivo.push.sdk.notofication.Message;
import com.vivo.push.sdk.notofication.Result;
import com.vivo.push.sdk.notofication.Statistic;
import com.vivo.push.sdk.notofication.TargetMessage;
import com.vivo.push.sdk.server.Sender;
@Service
public class VivoPushServiceImpl extends PushService{
private static Logger logger = LoggerFactory.getLogger(VivoPushServiceImpl.class);
private static Integer appId = 11111;
private static String appKey = "0ec9694331704c70a8d3c6ca7404af432";
private static String appSecret = "b692cdd94748451295327290cb922f312";
private static Map<Integer,Sender> senderMap = new HashMap<>();
private Sender getSender(Integer apptype) throws Exception{
if(AppTypeEnum.APPSPEED.getCode().equals(apptype)){
appId = 1111;
appKey = "87b90ec1-4f51-4968-a5db-a9196c2cf021322";
appSecret = "c8bd3d43-89c4-4282-9d84-d40b397434”;
Sender sender = senderMap.get(appId);
if(sender == null){
synchronized(senderMap){
if(sender == null){
sender = new Sender(appSecret);//注册登录开发平台网站获取到的appSecret
Result result = sender.getToken(appId , appKey);//注册登录开发平台网站获取到的appId和appKey
sender.setAuthToken(result. getAuthToken());
senderMap.put(appId, sender);
}
}
}
return sender;
}
public Result sendSingle(Integer apptype,String title, String content
, Integer skipType, String actionContent, Map<String,String> extras,String registerId) throws Exception {
Sender sender = getSender(apptype);
logger.info("业务数据:" + extras);
//notifyType 1:无 2:响铃 3:振动 4:响铃和振动
//skipType 1:打开APP首页 2:打开链接 3:自定义 4:打开app内指定页面
Message singleMessage = new Message.Builder().regId(registerId)// 该测试手机设备订阅推送后生成的regId
.notifyType(4).title(title).content(content).skipType(skipType).timeToLive(60*60*24)
.skipContent(actionContent).requestId(registerId).clientCustomMap(extras).build();
logger.info("发送消息:"+JSON.toJSONString(singleMessage));
Result result = sender.sendSingle(singleMessage);
logger.info(JSONObject.toJSONString(result));
System.out.println(JSONObject.toJSONString(result));
return result;
}
public Result sendBatch(Integer apptype,String title, String content
,Integer actionType,String actionContent, Map<String,String> extras, Set<String> registerIds) throws Exception {
Sender sender = getSender(apptype);
logger.info("业务数据:" + extras);
String requestId = UUID.randomUUID().toString();
//notifyType 1:无 2:响铃 3:振动 4:响铃和振动
//skipType 1:打开APP首页 2:打开链接 3:自定义 4:打开app内指定页面
Message saveList = new Message.Builder().notifyType(4).title(title).content(content)
.skipType(actionType).skipContent(actionContent).requestId(requestId)
.clientCustomMap(extras).timeToLive(60*60*24).build();
Result result = sender.saveListPayLoad(saveList);
String taskId = result.getTaskId();
logger.info(JSONObject.toJSONString(result));
TargetMessage targetMessage = new TargetMessage.Builder().regIds(registerIds)
.requestId(requestId).taskId(taskId).build();//构建批量推送的消息体
logger.info("发送消息:"+JSON.toJSONString(targetMessage));
result = sender.sendToList(targetMessage);
logger.info(JSONObject.toJSONString(result));
System.out.println(JSONObject.toJSONString(result));
return result;
}
@Override
@SuppressWarnings({ "rawtypes", "unchecked" })
public PushResult sendNotificationMessageAll(PushParamModel model) throws Exception {
Integer apptype = model.getApptype();
Integer actionType = VivoActionType.parseDescr(ActionType.getDescr(model.getActionType()));
String actionContent = model.getActionContent();
Map<String, String> extras = model.getExtras();
String title = model.getTitle();
String content = model.getMsgContent();
PushResult result = new PushResult();
Sender sender = getSender(apptype);
String requestId = UUID.randomUUID().toString();
//notifyType 1:无 2:响铃 3:振动 4:响铃和振动
//skipType 1:打开APP首页 2:打开链接 3:自定义 4:打开app内指定页面
logger.info("业务数据:" + extras);
Message allMessage = new Message.Builder().notifyType(4).title(title).content(content)
.skipType(actionType).skipContent(actionContent).requestId(requestId).clientCustomMap(extras).build();
logger.info("发送消息:"+JSON.toJSONString(allMessage));
Result allResult = sender.sendToAll(allMessage);
logger.info(JSONObject.toJSONString(allResult));
result.setCode(allResult.getResult());
result.setMsg(allResult.getDesc());
result.setResponseId(allResult.getTaskId());
return result;
}
public Result sendTag(Integer apptype,String title, String content
,Integer actionType,String actionContent, JSONObject extras, String... registerIds) throws Exception {
Sender sender = getSender(apptype);
logger.info("json:" + extras.toJSONString());
Message tagMessage = new Message.Builder().regId("regId")// 该测试手机设备订阅推送后生成的regId
.notifyType(3).title("try_title").content("try-content").timeToLive(1000).skipType(2)
.skipContent("http://www.vivo.com").networkType(-1).requestId("1234567890123456").build();
Result result = sender.sendToTag(tagMessage);
logger.info(JSONObject.toJSONString(result));
return result;
}
public static void main(String[] args) {
Map<String,String> extras = new HashMap<>();
extras.put("type", "1");
extras.put("videoId", "510200"); //181578
extras.put("targetUid", "3733524"); //775923
// String [] registerIds=new String[]{"CN_0f636b8876bcfc8f29317e1fb6ef4404","CN_481f438b5b8439d2f7878095772e4d64"};
//String registerId="CN_481f438b5b8439d2f7878095772e4d64";
try {
PushParamModel model = new PushParamModel();
model.setTitle("王者归来!");
model.setMsgContent("7记三分创生涯新高!罗斯对湖人砍31分集锦");
model.setPushBrand(PushBrandEnum.HW.getBrand());
model.setApptype(AppTypeEnum.APPSPEED.getCode());
model.setDeviceToken(new String[]{"15864871340512006118608","15864871340512006118610"});
model.setActionType(4);
model.setActionContent("intent://com.piaoquantv/pushrouter?#Intent;scheme=pushscheme;launchFlags=0x4000000;i.type=1;i.targetId=690880;end");
VivoPushServiceImpl vivoPushService = new VivoPushServiceImpl();
vivoPushService.sendNotificationMessage(model);
} catch (Exception e) {
e.printStackTrace();
}
}
@PostConstruct
public void initMap() {
pushMap.put(PushBrandEnum.VIVO.getBrand(), this);
}
@Override
@SuppressWarnings({ "rawtypes", "unchecked" })
public PushResult sendNotificationMessage(PushParamModel model)throws Exception {
Integer apptype = model.getApptype();
Integer actionType = VivoActionType.parseDescr(ActionType.getDescr(model.getActionType()));
String actionContent = model.getActionContent();
String[] deviceToken = model.getDeviceToken();
Map<String, String> extras = model.getExtras();
String title = model.getTitle();
String msgContent = model.getMsgContent();
PushResult result = new PushResult();
if(deviceToken.length == 0 || deviceToken.length>1000){
result.setCode(-1);
result.setMsg("发送人数为0或超过1000");
return result;
}
Result viResult = null;
//单发
if(deviceToken.length ==1){
viResult = sendSingle(apptype,title,msgContent,actionType,actionContent,extras,deviceToken[0]);
}else{
Set<String> registerIds = new HashSet(Arrays.asList(deviceToken));
viResult = sendBatch(apptype,title,msgContent,actionType,actionContent,extras,registerIds);
}
result.setCode(viResult.getResult() );
result.setMsg(viResult.getDesc());
result.setResponseId(viResult.getTaskId());
List<String> invalidUsers = new ArrayList<>();
InvalidUser invalidUser = viResult.getInvalidUser();
if(invalidUser != null){
invalidUsers.add(invalidUser.getUserid());
}
List<InvalidUser> invalidUsersList = viResult.getInvalidUsers();
if(CollectionUtils.isNotEmpty(invalidUsersList)){
invalidUsersList.forEach(action->{
invalidUsers.add(action.getUserid());
});
}
result.setInvalidUsers(invalidUsers);
return result;
}
/**
*
* @Title: getStatistics
* @Description: 获取批量推送或全量推送返回的taskId对应的统计信息,单次查询的taskIds最多100个
* @param: @param taskIds
* @param: @return
* @param: @throws Exception
* @return: List<PushStatis>
* @throws
* @author:石德斌
* @date:2020年4月9日 下午5:08:45
*/
public PushResult<List<PushStatis>> getStatistics(Set<String> taskIds) throws Exception{
PushResult<List<PushStatis>> pushResult = new PushResult<List<PushStatis>>();
List<PushStatis> pushStatisList = new ArrayList<>();
Sender sender = senderMap.get(appId);
Result result = sender.getStatistics(taskIds);
if(result.getResult() == 0){
List<Statistic> statistics = result.getStatistics();
for(Statistic statistic : statistics){
PushStatis pushStatis = new PushStatis();
BeanUtils.copyProperties(statistic, pushStatis);
pushStatisList.add(pushStatis);
}
}
pushResult.setCode(result.getResult());
pushResult.setMsg(result.getDesc());
pushResult.setResponseId(result.getTaskId());
pushResult.setData(pushStatisList);
return pushResult;
}
}
注意timeToLive文档中说是非必填项,但真实是必填的
oppo推送sdk:https://open.oppomobile.com/wiki/doc#id=10203
package comservice.push.impl;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.annotation.PostConstruct;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.oppo.push.server.Notification;
import com.oppo.push.server.Result;
import com.oppo.push.server.Sender;
import com.oppo.push.server.Target;
import com.oppo.push.server.TargetType;
@Service
public class OpPushServiceImpl extends PushService{
private static Logger logger = LoggerFactory.getLogger(OpPushServiceImpl.class);
private static String appId = "30323214";
private static String appKey = "48e32b5f431ewrwe93ebc65d46e";
private static String appMasterSecret = "fedece5de38c4fdsfdsc9fcdb8d4ec2ce";
private static Map<String,Sender> senderMap = new HashMap<>();
private Sender getSender(Integer apptype) throws Exception{
if(AppTypeEnum.APPSPEED.getCode().equals(apptype)){
appId = "3032334";
appKey = "48e32b5f431e4fdfas193ebc65d46e";
appMasterSecret = "fedece5de38c433f88c9fcdb8d4ec2ce";
}
Sender sender = senderMap.get(appId);
if(sender == null){
synchronized(senderMap){
if(sender == null){
sender = new Sender(appKey,appMasterSecret);
senderMap.put(appId, sender);
}
}
}
return sender;
}
public Result sendSingle(Integer apptype,String title, String content
,Integer actionType,String actionContent,String callbackUrl,Map<String, String> extras,String registerId) throws Exception{
Sender sender = getSender(apptype);
logger.info("业务信息:"+JSON.toJSONString(extras));
Result result=null;
Notification notification = getNotification(title,content,actionType,actionContent,callbackUrl,extras); //创建通知栏消息体
logger.info("发送消息:"+JSON.toJSONString(notification));
Target target = Target.build(registerId); //创建发送对象
result = sender.unicastNotification(notification, target); //发送单推消息
result.getStatusCode(); // 获取http请求状态码
result.getReturnCode(); // 获取平台返回码
result.getMessageId(); // 获取平台返回的messageId
logger.info("单个发送:{}",JSONObject.toJSONString(result));
System.out.println(JSONObject.toJSONString(result));
return result;
}
public Result sendBatch(Integer apptype,String title, String content
,Integer actionType,String actionContent,String callbackUrl, Map<String, String> extras, String... registerIds) throws Exception {
Sender sender = getSender(apptype);
Notification broadNotification = getNotification(title, content,actionType,actionContent,callbackUrl, extras);// 创建通知栏消息体
logger.info("发送消息:"+JSON.toJSONString(broadNotification));
Result saveResult = sender.saveNotification(broadNotification); // 发送保存消息体请求
saveResult.getStatusCode(); // 获取http请求状态码
saveResult.getReturnCode(); // 获取平台返回码
logger.info(JSONObject.toJSONString(saveResult));
String messageId = saveResult.getMessageId(); // 获取messageId
Target target = new Target(); // 创建广播目标
StringBuffer buffer = new StringBuffer("");
for (String registerId : registerIds) {
buffer.append(registerId + ";");
}
int length = buffer.toString().length();
target.setTargetType(TargetType.REGISTRATION_ID);
target.setTargetValue(buffer.toString().substring(0, length - 1));
Result broadResult = sender.broadcastNotification(messageId, target); // 发送广播消息
broadResult.getTaskId(); // 获取广播taskId
List<Result.BroadcastErrorResult> errorList = broadResult.getBroadcastErrorResults();
if (errorList.size() > 0) { // 如果大小为0,代表所有目标发送成功
for (Result.BroadcastErrorResult error : errorList) {
error.getErrorCode(); // 错误码
error.getTargetValue(); // 目标
}
}
logger.info("批量发送:{}",JSONObject.toJSONString(broadResult));
return broadResult;
}
@Override
@SuppressWarnings({ "rawtypes", "unchecked" })
public PushResult sendNotificationMessageAll(PushParamModel model) throws Exception {
Integer apptype = model.getApptype();
Integer actionType = OppoActionType.parseDescr(ActionType.getDescr(model.getActionType()));
String actionContent = model.getActionContent();
Map<String, String> extras = model.getExtras();
String title = model.getTitle();
String content = model.getMsgContent();
String callbackUrl = model.getCallbackUrl();
PushResult result = new PushResult();
Sender sender = getSender(apptype);
Notification broadNotification = getNotification(title, content,actionType,actionContent,callbackUrl, extras);// 创建通知栏消息体
logger.info("发送消息:"+JSON.toJSONString(broadNotification));
Result saveResult = sender.saveNotification(broadNotification); // 发送保存消息体请求
saveResult.getStatusCode(); // 获取http请求状态码
saveResult.getReturnCode(); // 获取平台返回码
logger.info(JSONObject.toJSONString(saveResult));
String messageId = saveResult.getMessageId(); // 获取messageId
Target target = new Target(); // 创建广播目标
target.setTargetType(TargetType.ALL);
Result broadResult = sender.broadcastNotification(messageId,target); // 发送广播消息
broadResult.getTaskId(); // 获取广播taskId
List<Result.BroadcastErrorResult> errorList = broadResult.getBroadcastErrorResults();
if (errorList.size() > 0) { // 如果大小为0,代表所有目标发送成功
for (Result.BroadcastErrorResult error : errorList) {
error.getErrorCode(); // 错误码
error.getTargetValue(); // 目标
}
}
result.setCode(broadResult.getReturnCode().getCode());
result.setMsg(broadResult.getReturnCode().getMessage());
result.setResponseId(broadResult.getTaskId());
logger.info(JSONObject.toJSONString(broadResult));
return result;
}
/**
*
* @Title: getNotification
* @Description: 构造通知消息
* @param: @param title 消息标题
* @param: @param content 消息内容
* @param: @param actionType 消息点击类型:点击动作类型0,启动应用;1,打开应用内页
* (activity的intent action);2,打开网页;4,打开应用内页(activity);5,Intent scheme URL 【非必填,默认值为0】
* @param: @param actionContent 应用内页地址【click_action_type为1或4时必填,长度500】,网页地址【click_action_type为2必填,长度500】
* @param: @param extras 动作参数,打开应用内页或网页时传递给应用或网页【JSON格式,非必填】,字符数不能超过4K,示例:{"key1":"value1","key2":"value2"}
* @param: @return
* @return: Notification
* @throws
* @author:石德斌
* @date:2020年4月8日 下午4:18:01
*/
private static Notification getNotification(String title,String content,Integer actionType,
String actionContent,String callbackUrl,Map<String, String> extras ) {
Notification notification = new Notification();
/**
* 参数必填项
*/
notification.setTitle(title);
if(title.length()>6){
notification.setSubTitle(title.substring(0,6));
}else{
notification.setSubTitle(title);
}
notification.setContent(content);
/**
* App开发者自定义消息Id,OPPO推送平台根据此ID做去重处理,
* 对于广播推送相同appMessageId只会保存一次,对于单推相同appMessageId只会推送一次
* */
notification.setAppMessageId(RandomUtil.generate18String());
/**
* 点击动作类型0,启动应用;1,打开应用内页(activity的intent action);
* 2,打开网页;4,打开应用内页(activity);【非必填,默认值为0】;5,Intent scheme URL
*/
notification.setClickActionType(actionType);
/**
* 应用内页地址 click_action_type为1或4时必填,长度500
*/
if(StringUtils.isNotBlank(actionContent)){
notification.setClickActionActivity(actionContent);
}
/**
* 动作参数,打开应用内页或网页时传递给应用或网页【JSON格式,非必填】
* 字符数不能超过4K,示例:{"key1":"value1","key2":"value2"}
*/
notification.setActionParameters(JSON.toJSONString(extras));
/**
* 展示类型 (0, “即时”),(1, “定时”)
*/
notification.setShowTimeType(0);
/**
* 是否进离线消息,【非必填,默认为True】
*/
notification.setOffLine(true);
/**
* 离线消息的存活时间(time_to_live) (单位:秒), 【off_line值为true时,必填,最长3天】
*/
notification.setOffLineTtl(24 * 3600*3);
/**
* 0:不限联网方式, 1:仅wifi推送
*/
notification.setNetworkType(0);
notification.setCallBackUrl(callbackUrl);
return notification;
}
public static void main(String[] args) {
Map<String, String> extras = new HashMap<>();
extras.put("type", "1");
extras.put("videoId", "510200"); //181578
extras.put("targetUid", "3733524"); //775923
//String registerId="CN_481f438b5b8439d2f7878095772e4d64";
logger.info(JSON.toJSONString(extras));
try {
PushParamModel model = new PushParamModel();
model.setTitle("王者归来!");
model.setMsgContent("7记三分创生涯新高!罗斯对湖人砍31分集锦");
model.setPushBrand(PushBrandEnum.HW.getBrand());
model.setApptype(AppTypeEnum.APPSPEED.getCode());
model.setDeviceToken(new String[]{"CN_9489e97aae3e39fb030e79663310dbfe","CN_9489e97aae3e39fb030e79663310dbff"});
model.setActionType(1);
model.setActionContent("com.oppo.push.router");
OpPushServiceImpl opPushService = new OpPushServiceImpl();
PushResult sendNotificationMessage = opPushService.sendNotificationMessage(model);
System.out.println(JSON.toJSONString(sendNotificationMessage));
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
@PostConstruct
public void initMap() {
pushMap.put(PushBrandEnum.OP.getBrand(), this);
}
@Override
@SuppressWarnings({ "rawtypes", "unchecked" })
public PushResult sendNotificationMessage(PushParamModel model)throws Exception {
Integer apptype = model.getApptype();
Integer actionType = OppoActionType.parseDescr(ActionType.getDescr(model.getActionType()));
String actionContent = model.getActionContent();
String[] deviceToken = model.getDeviceToken();
Map<String, String> extras = model.getExtras();
String callbackUrl = model.getCallbackUrl();
PushResult result = new PushResult();
if(deviceToken.length == 0 || deviceToken.length>1000){
result.setCode(-1);
result.setMsg("发送人数为0或超过1000");
return result;
}
Result opResult = null;
//单发
if(deviceToken.length ==1){
opResult = sendSingle(apptype,model.getTitle(),model.getMsgContent(),actionType,actionContent,callbackUrl,extras,deviceToken[0]);
}else{
opResult = sendBatch(apptype,model.getTitle(),model.getMsgContent(),actionType,actionContent,callbackUrl,extras,deviceToken);
}
if(opResult.getReturnCode().getCode() == 0){
result.setCode(0);
result.setMsg("发送成功");
result.setResponseId(opResult.getMessageId());
return result;
}
result.setCode(-1);
result.setMsg(opResult.getReturnCode().getMessage());
result.setResponseId(opResult.getMessageId());
return result;
}
}
此文章同步到了我个人公众号:java面试工程师。关注公众号更加便于查阅。
1164

被折叠的 条评论
为什么被折叠?



