極光推送消息——Alias別稱方式(Andirod)


1、pom文件引入相關jar包

 <!--極光推送消息start-->
    <dependency>
      <groupId>net.sf.json-lib</groupId>
      <artifactId>json-lib</artifactId>
      <version>2.4</version>
      <classifier>jdk15</classifier>
    </dependency>


    <dependency>
      <groupId>cn.jpush.api</groupId>
      <artifactId>jpush-client</artifactId>
      <version>3.3.3</version>
      <exclusions>
        <exclusion>
          <groupId>org.slf4j</groupId>
          <artifactId>slf4j-api</artifactId>
        </exclusion>
      </exclusions>

    </dependency>

    <dependency>
      <groupId>cn.jpush.api</groupId>
      <artifactId>jiguang-common</artifactId>
      <version>1.1.1</version>
    </dependency>

    <dependency>
      <groupId>io.netty</groupId>
      <artifactId>netty-all</artifactId>
      <version>4.1.6.Final</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>com.google.code.gson</groupId>
      <artifactId>gson</artifactId>
      <version>2.3</version>
    </dependency>

    <!--極光推送消息end-->

2、提供相關包裝好的類

(1)消息封裝類

package com.test.entity.common;

import com.google.gson.JsonObject;

import java.util.List;
import java.util.Map;

/**
 * 極光推送消息類
 */
public class JPushDeviceBean {
  private String token;
  private String alias_value;//別名值
  private String registration_id;
  private List<String> username;//所有用戶別名
  private String title;//標題
  private String fsmessagecontent;//內容
  private Integer count;//角標數
  private Map<String, String> extrasMap;
  private JsonObject extra;

  public JsonObject getExtra() {
    return extra;
  }

  public void setExtra(JsonObject extra) {
    this.extra = extra;
  }

  public Map<String, String> getExtrasMap() {
    return extrasMap;
  }

  public void setExtrasMap(Map<String, String> extrasMap) {
    this.extrasMap = extrasMap;
  }

  public String getToken() {
    return token;
  }

  public void setToken(String token) {
    this.token = token;
  }

  public String getAlias_value() {
    return alias_value;
  }

  public void setAlias_value(String alias_value) {
    this.alias_value = alias_value;
  }

  public String getRegistration_id() {
    return registration_id;
  }

  public void setRegistration_id(String registration_id) {
    this.registration_id = registration_id;
  }

  public List<String> getUsername() {
    return username;
  }

  public void setUsername(List<String> username) {
    this.username = username;
  }

  public String getTitle() {
    return title;
  }

  public void setTitle(String title) {
    this.title = title;
  }

  public String getFsmessagecontent() {
    return fsmessagecontent;
  }

  public void setFsmessagecontent(String fsmessagecontent) {
    this.fsmessagecontent = fsmessagecontent;
  }

  public Integer getCount() {
    return count;
  }

  public void setCount(Integer count) {
    this.count = count;
  }
}

 

(2)工具類

package com.test.util;

import cn.jpush.api.push.model.Message;
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.audience.AudienceTarget;
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 com.google.gson.JsonObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Map;

public class JPushDevice {

    protected static final Logger LOG =LoggerFactory.getLogger(JPushDevice.class);

    private static final String URL="https://device.jpush.cn";//極光訪問URL
    public static long timeToLive=60*60*24*10;//10天

    //privatestaticJPushClientjpushClient= newJPushClient(masterSecret,appKey,null,ClientConfig.getInstance());

    //  //對於推送,您所需要做的就是構建PushPayload對象。
    //  PushPayloadpayload=buildPushObject_ios_audienceMore_messageWithExtras();
    //  PushResultresult=jpushClient.sendPush(payload);

    public static PushPayload buildPushObject_android_tag_alertWithTitle(String username){
      return PushPayload.newBuilder()
        .setPlatform(Platform.all())
        .setAudience(Audience.alias(username))
        .setNotification(Notification.alert("ALERT"))
        .build();
    }
    //彈框
   public static PushPayload buildPushObject_ios_audienceMore_messageWithExtras(String username){
      return PushPayload.newBuilder()
        .setPlatform(Platform.all())
        .setAudience(Audience.alias(username))
        .setMessage(Message.newBuilder()
            .setMsgContent("您有一條回復內容。。")
            .addExtra("from","JPush")
          .build())
        .build();
    }
    //推送全部平台(一個用戶)(無角標)
  public static PushPayload oneName(String username, String title, String fsmessagecontent,
                                    Map<String, String> extrasMap, JsonObject extra){
      return PushPayload.newBuilder()
        .setPlatform(Platform.all())//推送全部平台
      .setAudience(Audience.newBuilder()//推送目標:別名、標簽、注冊ID、分群、廣播等。
        .addAudienceTarget(AudienceTarget.alias(username))
        .build())
        .setMessage(Message.newBuilder()
          .setMsgContent(fsmessagecontent)//消息內容
       //     .setTitle(count.toString())//當做安卓的角標數
            .addExtra("from","JPush")//應用內消息通道
            .build())
        .setNotification(Notification.newBuilder()//notification:通知內容體。是被推送到客戶端的內容
        .addPlatformNotification(IosNotification.newBuilder()//iOS
        .setAlert(title)//彈框顯示標題
       // .setBadge(count)//角標
        .build())
            .addPlatformNotification(AndroidNotification.newBuilder()//安卓
            .setAlert(fsmessagecontent)//彈框顯示內容
            .setTitle(title)//彈框顯示標題
              .addExtras(extrasMap)
              .addExtra("extra",extra)
            .build())
            .build())
        .build();
    }
      //推送全部平台(傳多個別名用戶)(有角標)
      public static PushPayload AllName(String[] username,String title,String fsmessagecontent,Integer count){
        return PushPayload.newBuilder()
          .setPlatform(Platform.all())//推送全部平台
          .setAudience(Audience.newBuilder()//推送目標:別名、標簽、注冊ID、分群、廣播等。
          .addAudienceTarget(AudienceTarget.alias(username))//別名可以是數組為並集,一次只能存1000個
          .build())
          .setMessage(Message.newBuilder()
              .setMsgContent(fsmessagecontent)//消息內容
              .setTitle(count.toString())//當做安卓的角標數
              .addExtra("from","JPush")//應用內消息通道
              .build())
          .setNotification(Notification.newBuilder()//notification:通知
          .addPlatformNotification(IosNotification.newBuilder()//iOS
          .setAlert(title)//彈框顯示標題
          .setBadge(count)//角標
          .build())
              .addPlatformNotification(AndroidNotification.newBuilder()//安卓
              .setAlert(fsmessagecontent)//彈框顯示內容
              .setTitle(title)//彈框顯示標題
              .build())
              .build())
          .build();
    }
}

(3)實現類

package com.test.controller.common;

import static com.yjl.util.UploadUtil.getErrorMsg;
import static com.yjl.util.UploadUtil.getYjlResponseModel;
import static com.yjl.util.UploadUtil.isSuccess;
import static com.yjl.util.UploadUtil.setErrorMsg;
import static com.yjl.util.UploadUtil.setSuccess;
import static com.yjl.util.UploadUtil.setYjlResponseModel;

import cn.jiguang.common.ClientConfig;
import cn.jiguang.common.resp.APIConnectionException;
import cn.jiguang.common.resp.APIRequestException;
import cn.jpush.api.JPushClient;
import cn.jpush.api.push.PushResult;
import cn.jpush.api.push.model.PushPayload;
import com.google.gson.Gson;
import com.yjl.entity.common.JPushDeviceBean;
import com.yjl.entity.common.YJLResponseModel;
import com.yjl.util.HttpClientUtil;
import com.yjl.util.JPushDevice;
import java.io.UnsupportedEncodingException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import net.sf.json.JSONObject;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
@RequestMapping("/JPushDevice")
public class JPushDeviceController{

  private static Logger logger = LoggerFactory.getLogger(JPushDeviceController.class);

  //極光訪問URL
  private static final String URL = "https://device.jpush.cn";
  //極光用戶名
  private static final String APPKEY ="極光平台生成的app的appkey";
  //極光密碼
  private static final String MASTERSECRET ="極光平台生成的app的mastersecret";

  //1.推送一個人
  @RequestMapping(value = "getOneJPushDevice", method = RequestMethod.POST)
  @ResponseBody
  public PushResult getOneJPushDevice(@RequestBody JPushDeviceBean j) {
    String aliases = getAliases(j.getAlias_value());
    //一個別名
    PushResult pResult = new PushResult();
    //別名;
    if(StringUtils.isNotBlank(aliases)){
      //極光推送
      JPushClient jpushClient = new JPushClient(MASTERSECRET,APPKEY,null,ClientConfig.getInstance());
      PushPayload payload = JPushDevice.oneName(aliases, j.getTitle(), j.getFsmessagecontent(),j.getExtrasMap(),j.getExtra());
      try {
        pResult = jpushClient.sendPush(payload);
        System.out.println("Got result 推送一個人 - 3" + pResult );
        Thread.sleep(5000);
        // 請求結束后,調用 NettyHttpClient 中的 close 方法,否則進程不會退出。
        jpushClient.close();
      }
      catch (APIConnectionException e) {
        e.printStackTrace();
      }
      catch (APIRequestException e) {
        e.printStackTrace();
      }
      catch (InterruptedException e) {
        e.printStackTrace();
      }
    }
    return pResult;
  }
  //2.推送多人//先循環判斷別名
  @RequestMapping(value = "getAllJPushDevice", method = RequestMethod.POST)
  @ResponseBody
  public YJLResponseModel getAllJPushDevice(@RequestBody JPushDeviceBean j) {
    setYjlResponseModel(new YJLResponseModel());
    setErrorMsg("");
    setSuccess(false);
    List<String> ulist = j.getUsername();
    //判斷過得別名數組
    if(null!=ulist && !ulist.isEmpty()){
      String[] username = ulist.toArray(new String[ulist.size()]);
      //轉化為數組
      //極光推送
      JPushClient jpushClient = new JPushClient(MASTERSECRET,APPKEY,null, ClientConfig.getInstance());
      PushPayload payload = JPushDevice.AllName(username, j.getTitle(), j.getFsmessagecontent(), j.getCount());
      //用戶別名數組1000個一次,標題,內容,角標數
      PushResult pResult;
      try {
        pResult = jpushClient.sendPush(payload);
        setSuccess(true);
        System.out.println("Got result - " + new Gson().toJson(pResult) );
        try {
          Thread.sleep(5000);
        }
        catch (InterruptedException e) {
          e.printStackTrace();
        }
        // 請求結束后,調用 NettyHttpClient 中的 close 方法,否則進程不會退出。
        jpushClient.close();
      }
      catch (APIConnectionException e) {
        e.printStackTrace();
      }
      catch (APIRequestException e) {
        e.printStackTrace();
      }
      finally {
        getYjlResponseModel().setErrorMsg(getErrorMsg());
        getYjlResponseModel().setSuccess(isSuccess());
      }
    }
    return getYjlResponseModel();
  }
  //查詢別名是否存在
  public static String getAliases(String aliases){
    String alia ="";
    JPushDeviceBean j = new JPushDeviceBean();
    j.setAlias_value(aliases);
    YJLResponseModel map = getJPushDeviceAliases(j);
    //查詢是否含有別名
    Map<String, Object> ma = (Map<String, Object>)map.getData();
    if(ma.containsKey("registration_ids")){
      List<String> list = (List<String>)ma.get("registration_ids");
      //查詢registration_ids的值不為空則含有該別名
      if(null!=list && !list.isEmpty()){
        System.out.println("查詢別名----"+new Gson().toJson(list));
        //在此內可調用極光的推送方法
        alia = aliases;
        //如果存在就給返回該別名
      }
    }
    return alia;
  }
  //--------------------查詢別名的方法-------------------------------------------
  //查詢別名(找不到統計項就是 null,否則為統計項的值。)
  @RequestMapping(value = "getJPushDeviceAliases", method = RequestMethod.POST)
  @ResponseBody
  public static YJLResponseModel getJPushDeviceAliases(@RequestBody JPushDeviceBean ht) {
    setYjlResponseModel(new YJLResponseModel());
    setErrorMsg("");
    setSuccess(false);
    JSONObject response = null;
    try {
      StringBuilder url = new StringBuilder(URL).append("/v3/aliases/"+ht.getAlias_value());
      String authorValue = getBase64();
      Map<String, String> para = new HashMap<>();
      response = HttpClientUtil.doGet(url.toString(), authorValue, para);
      if (StringUtils.isNotEmpty((String)response.get("error"))) {
        logger.info("getAliases:url+params----" + url + para);
        throw new Exception();
      }
      setSuccess(true);
    }
    catch (Exception e) {
      e.printStackTrace();
      logger.error("getAliases:url+params----" + e);
    }finally {
      getYjlResponseModel().setErrorMsg(getErrorMsg());
      getYjlResponseModel().setSuccess(isSuccess());
      getYjlResponseModel().setData(response);
    }
    return getYjlResponseModel();
  }

  //String轉base64
  public static String getBase64(){
    Base64 base64 = new Base64();
    String base64Sign ="";
    String string = APPKEY+":"+MASTERSECRET;
    try {
      base64Sign = base64.encodeToString(string.getBytes("UTF-8"));
    }
    catch (UnsupportedEncodingException e) {
      e.printStackTrace();
    }
    return " Basic "+base64Sign;
  }

  //測試一下
  public static void main(String[] args) {
    JPushDeviceController JPushDeviceController = new JPushDeviceController();
    JPushDeviceBean jd = new JPushDeviceBean();
    jd.setAlias_value("40");//此處為待推送的用戶id
    jd.setTitle("推送消息");
    jd.setFsmessagecontent("測試一下服務器端");
    PushResult pushResult = JPushDeviceController.getOneJPushDevice(jd);
    System.out.println(pushResult);

  }
}

3.測試一下

 //測試一下
  public static void main(String[] args) {
    JPushDeviceController JPushDeviceController = new JPushDeviceController();
    JPushDeviceBean jd = new JPushDeviceBean();
    jd.setAlias_value("18037471792");
    jd.setTitle("推送消息");
    jd.setFsmessagecontent("測試一下服務器端");
    Map<String,String> extrasParam = new HashMap<>();
      extrasParam.put("額外參數1","額外參數內容1");
      jd.setExtrasMap(extrasParam);
    PushResult pushResult = JPushDeviceController.getOneJPushDevice(jd);
    System.out.println(pushResult);

  }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM