前言
用过极光推送的用户们都知道,如果我们有一款app应用,并且需要推送功能,那么我们就需要在极光后台创建一个应用,即创建生成了一组appKey和masterSecret,然后我们需要在后台配置文件中配置对应的推送配置信息(title、appKey、masterSecret、tag、apnsProduction),那么如果我们有三款应用呢,同时也需要实时推送功能,此时就需要在极光的后台创建新的应用,即生成三组不同的appKey和masterSecret,那么问题来了,此时我们需要将这三款应用同时进行推送相关消息,该如何做呢?因为配置文件中读取的是一组appKey和masterSecret值。
思路
1、首先最容易想到的解决方案是,既然一个应用对应一组appKey和masterSecret,进行相关的推送消息没有问题,那么有三款应用我们就利用for循环进行循环推送不就完事了嘛。既然利用循环,那么就该考虑在配置文件中编写三组配置信息还是在数据库中创建表,将对应的app应用的相关appKey和masterSecret等信息存入表中,然后推送时去进行读取,顺着这个思路做下去看似也没有问题,那么如果以后继续上架其他应用时,就需要在配置文件中或者数据库表中配置相关的信息,但如果有几十款或上百款应用呢?
就会出现这样的逻辑顺序:
A应用创建连接->A推送应用消息->A应用关闭连接->B应用创建连接->B推送应用消息->B应用关闭连接->C应用创建连接->C推送应用消息->C应用关闭连接……………
2、我比较懒,所以我没有急着去按照1思路去做,设想如果我们可以利用单个推送的方法对这些所有的应用进行推送岂不是更方便,那么有没有这样的appKey和masterSecret呢?答案肯定是有的,
首先我们登陆极光开发者服务后台,会发现菜单栏中有一个分组管理
然后进入分组详情。可以看到有GroupKey和Group Master Secret,既然有,那么肯定就可以对GroupKey和Group Master Secret进行实时推送,创建好分组,在应用列表中添加测试应用后,方可进行代码测试!
话不多说上代码!
import cn.jiguang.common.resp.APIConnectionException;
import cn.jiguang.common.resp.APIRequestException;
import cn.jpush.api.push.GroupPushClient;
import cn.jpush.api.push.PushResult;
import cn.jpush.api.push.model.Platform;
import cn.jpush.api.push.model.PushPayload;
import cn.jpush.api.push.model.audience.Audience;
import cn.jpush.api.push.model.notification.AndroidNotification;
import cn.jpush.api.push.model.notification.IosNotification;
import cn.jpush.api.push.model.notification.Notification;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.Map;
@Component
public class GroupPushUtils {
private final static Logger LOG = LoggerFactory.getLogger(PushUtils.class);
@Value("${groupJPush.groupKey}")
private String groupKey;
@Value("${groupJPush.groupMasterSecret}")
private String groupMasterSecret;
public PushResult sendGroupPush(PushVo pushVo) {//pushVo是传入参数,不再过多解释
GroupPushClient groupPushClient = new GroupPushClient(groupMasterSecret, groupKey);
final PushPayload payload = buildPushObject_android_and_ios(pushVo);
PushResult pushResult=new PushResult();
try {
Map<String, PushResult> result = groupPushClient.sendGroupPush(payload);
for (Map.Entry<String, PushResult> entry : result.entrySet()) {
pushResult = entry.getValue();
PushResult.Error error = pushResult.error;
if (error != null) {
LOG.info("AppKey: " + entry.getKey() + " error code : " + error.getCode() + " error message: " + error.getMessage());
} else {
LOG.info("AppKey: " + entry.getKey() + " sendno: " + pushResult.sendno + " msg_id:" + pushResult.msg_id);
}
}
} catch (APIConnectionException e) {
LOG.error("Connection error. Should retry later. ", e);
LOG.error("Sendno: " + payload.getSendno());
} catch (APIRequestException e) {
LOG.error("Error response from JPush server. Should review and fix it. ", e);
LOG.info("HTTP Status: " + e.getStatus());
LOG.info("Error Code: " + e.getErrorCode());
LOG.info("Error Message: " + e.getErrorMessage());
LOG.info("Msg ID: " + e.getMsgId());
LOG.error("Sendno: " + payload.getSendno());
}
return pushResult;
}
public PushPayload buildPushObject_android_and_ios(PushVo pushVo) {
Map<String, String> extras = new HashMap<String, String>();
extras.put("parameter1", "value1");
extras.put("parameter2", "value2");
return PushPayload.newBuilder()
.setPlatform(Platform.android_ios())
.setAudience(Audience.all())
.setNotification(Notification.newBuilder()
.setAlert(pushVo.getNotification())
.addPlatformNotification(AndroidNotification.newBuilder()
// .setTitle("Title")//此参数根据实际需要可用可不用
.addExtras(extras).build())
.addPlatformNotification(IosNotification.newBuilder()
.incrBadge(1)
.addExtras(extras).build())
.build())
.build();
}
}
我们不生产代码,我们只是代码的搬运工!
延伸思考:
这篇文章其实没有任何深度,其主要想表达的是我们在实际工作中,遇到问题应该如何去思考问题以及如何去解决问题,从而寻求解决问题的最佳方案,正如世界上有很多东西都是由懒人发明的,现实中,当你懒于去做某件事时,请相信一定会有解决这个问题的懒人办法,如果真的没有,那么如果你能够想出来并且能做出来,那么你就是一个创造者!