前言
用過極光推送的用戶們都知道,如果我們有一款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();
}
}
我們不生產代碼,我們只是代碼的搬運工!
這篇文章其實沒有任何深度,其主要想表達的是我們在實際工作中,遇到問題應該如何去思考問題以及如何去解決問題,從而尋求解決問題的最佳方案,正如世界上有很多東西都是由懶人發明的,現實中,當你懶於去做某件事時,請相信一定會有解決這個問題的懶人辦法,如果真的沒有,那麼如果你能夠想出來並且能做出來,那麼你就是一個創造者!
微信掃描下方二維碼(我的個人微信公衆號:程序員Hotel), 更多優質資源及優質文章及時獲取,請大家多多支持哦!