Java之~ 极光推送消息给APP

一。先进行配置

1.具体配置可参考极光官方文档https://docs.jiguang.cn/jpush/server/sdk/java_sdk/ 或  https://github.com/jpush/jpush-api-java-client  可进行源码下载参考

2.配置maven pom.xml 文件

找到3.3.3jar包进行下载,复制jar包到你的项目(jiguang-common-1.0.8 jar  &&  jpush-client-3.3.3 jar

<dependency>
    <groupId>cn.jpush.api</groupId>
    <artifactId>jpush-client</artifactId>
    <version>3.3.3</version>
</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>
 <dependency>
     <groupId>org.slf4j</groupId>
     <artifactId>slf4j-api</artifactId>
     <version>1.7.7</version>
</dependency>

    <!-- For log4j -->
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
        <version>1.7.7</version>
    </dependency>
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.17</version>
    </dependency>
找到以上包,进行配置。官方文档有详细说明

 

二。写一个公用推送demo工具类调用

//极光推送方法工具类

package com.javajy.util;

import java.util.ArrayList;
import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

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.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;
//极光推送类
public class JPushDevice {
    protected static final Logger LOG = LoggerFactory.getLogger(JPushDevice.class);
    
    public static final String URL = "https://device.jpush.cn";//极光访问URL
    public static final String APPKEY = "****";//极光用户名
    public static final String MASTERSECRET = "***";//极光密码
    public static long timeToLive =  60 * 60 * 24 * 10;  //10天
    
        
    
        public static void main(String[] args) {
            List<String> list = new ArrayList<String>();
            list.add("234354676");
            list.add("234564566");
//            System.out.println(list.toString());
//            buildPushObject_ios_audienceMore_messageWithExtras(new String[]{"23456","234565","23456"},"title","content",3);
//            buildPushObject_all_alertWithTitle("234566","title","content",3);
            
            try {
                JPushClient jpushClient = new JPushClient(JPushDevice.MASTERSECRET, JPushDevice.APPKEY, null,
                        ClientConfig.getInstance());
                PushPayload payload = AllName(new String[]{"234566","23456"},"title3","content3",1);
                PushResult pResult = jpushClient.sendPush(payload);

                System.out.println("Got result  - " + pResult);
                 try {
                    Thread.sleep(5000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } // 请求结束后,调用 NettyHttpClient 中的 close
                // 方法,否则进程不会退出。
                jpushClient.close();
            } catch (APIConnectionException e) {
                e.printStackTrace();
            } catch (APIRequestException e) {
                e.printStackTrace();
            }
        }
       public static PushPayload AllName(String[] username,String title,String fsmessagecontent,Integer count) {
           
            return PushPayload.newBuilder()
//                    .setPlatform(Platform.android_ios())//安卓和ios
                    .setPlatform(Platform.all())
                    .setAudience(Audience.newBuilder()
//                             .addAudienceTarget(AudienceTarget.tag("tag1", "tag2"))
                            .addAudienceTarget(AudienceTarget.alias(username))
                            .build())
                    .setMessage(Message.newBuilder()
                            .setMsgContent(fsmessagecontent)
                            .setTitle(count.toString())
                            .build())
                    .setNotification(Notification.newBuilder()
                            .addPlatformNotification(IosNotification.newBuilder()
                                    .setAlert(title)
                                    .setBadge(count)//角标
                                    .build())
                            .addPlatformNotification(AndroidNotification.newBuilder()
                                    .setAlert(title)
                                    .build())
                            .build())
                    .build();
        }
    
//    private static JPushClient jpushClient =  new JPushClient(masterSecret,appKey,null,ClientConfig.getInstance());

//    //对于推送,您所需要做的就是构建PushPayload对象。
//    PushPayload payload = buildPushObject_ios_audienceMore_messageWithExtras();
//    PushResult result = jpushClient.sendPush(payload);
    //构建推送对象:所有平台弹框
      public static PushPayload buildPushObject_all_alertWithTitle(String username,String title,String fsmessagecontent,Integer count){
             return PushPayload.newBuilder()
                    .setPlatform(Platform.all())
                    .setAudience(Audience.alias(username))
                    .setMessage(Message.newBuilder()//创建
                            .setMsgContent(fsmessagecontent)
                            .setTitle(count.toString())
                            .build())//角标
                    .setNotification(Notification.newBuilder()
                                .addPlatformNotification(IosNotification.newBuilder()
                                        .setAlert(title)
                                        .setBadge(count)//角标
                                        .build())
                                .addPlatformNotification(AndroidNotification.newBuilder()
                                        .setAlert(title)
                                        .build())
                                .build())

                    .build();
      }
      //构建推送对象:所有平台
      public static PushPayload buildPushObject_ios_audienceMore_messageWithExtras(String username,String fsmessagecontent){
             return PushPayload.newBuilder()
                    .setPlatform(Platform.all())//如果指定安卓Platform.android();
                    .setAudience(Audience.alias(username))//设置方式是使用别名
                    .setMessage(Message.newBuilder()//创建
                    .setMsgContent(fsmessagecontent)//消息内容
                    .addExtra("from", "JPush")//消息是 JPush 应用内消息通道的
                        .build())
                    .build();
      }
    //构建推送对象:所有平台
      public static PushPayload buildPushObject_all_alertsendByWeather(String title,String fsmessagecontent,Integer count){
             return PushPayload.newBuilder()
                    .setPlatform(Platform.all())
                    .setAudience(Audience.all())//设置方式是使用别名
                    .setMessage(Message.newBuilder()//创建
                            .setMsgContent(fsmessagecontent)
                            .setTitle(count.toString())
                            .build())//角标
                    .setNotification(Notification.newBuilder()//notification:通知
                                .addPlatformNotification(IosNotification.newBuilder()
                                        .setAlert(title)
                                        .setBadge(count)//角标
                                        .build())
                                .addPlatformNotification(AndroidNotification.newBuilder()
                                        .setAlert(title)
                                        .build())
                                .build())

                    .build();
      }
}

三。//在controller或者serviceImpl中调用demo中的方法

一)我写了一个JPushDeviceController类。用来方便以后直接调用(这些都是集合了查询别名再推送的)

package com.javajy.controller;

import java.io.UnsupportedEncodingException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.codec.binary.Base64;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.framework.frext.controller.common.GenericController;
import org.framework.frext.util.Ajax;
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;

import com.google.gson.Gson;
import com.javajy.util.HttpClientUtils;
import com.javajy.util.JPushDevice;
import com.javajy.vo.JPushDeviceBean;

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 net.sf.json.JSONObject;


@Controller
@RequestMapping("/JPushDevice/")
public class JPushDeviceController extends GenericController{
    private static Logger logger = Logger.getLogger(JPushDeviceController.class);
    private static final String URL = "https://device.jpush.cn";//极光访问URL
    private static final String APPKEY ="2b5258f16c5294424ad4b910";//极光用户名
    private static final String MASTERSECRET ="926d72e84333176ff9cd9f9b";//极光密码
    

/**  将用户别名分成1000个循环发送
     * @param ulist  别名数组
     * @param title  标题
     * @param content  内容
     * @return
     */
    public static boolean sendJgMessaage(List<String> ulist,String title ,String content) {
        // 调用极光多人推送方法,一次性只能推1000个。

        // --------极光------
        List<List<String>> listAll = new ArrayList<List<String>>(); // 拆分后的list数组
        int size = 1000;
        // 获取被拆分的数组个数
        int allListSize = ulist.size() % size == 0 ? ulist.size() / size : ulist.size() / size + 1;

        for (int i = 0; i < allListSize; i++) {
            List<String> sub = new ArrayList<String>();
            // 把指定索引数据放入到list中
            for (int j = i * size; j <= size * (i + 1) - 1; j++) {
                if (j <= ulist.size() - 1) {
                    // 得到拆分后的集合
                    sub.add(ulist.get(j));
                }
            }
            // 拆分的集合可以做点什么
            // sub.dosomething();
            // 将拆分后的集合综合为一个集合
            listAll.add(sub);
        }
        for (List<String> userlist : listAll) {
            // 4.每一千个调用一次极光推送
            JPushDeviceBean JPushDeviceBean = new JPushDeviceBean();
            JPushDeviceBean.setUsername(userlist);
            JPushDeviceBean.setTitle(title);// 标题
            JPushDeviceBean.setFsmessagecontent(content);// 内容
            JPushDeviceBean.setCount(1);// 角标
            // 调用发送信息接口
            JPushDeviceController jdc = new JPushDeviceController();
            jdc.getAllJPushDevice(JPushDeviceBean);
        }
        return true;
    }
    //1.推送一个人
    @RequestMapping(value = "getOneJPushDevice", method = RequestMethod.POST)
    @ResponseBody
    public Map<String, Object> getOneJPushDevice(@RequestBody JPushDeviceBean j) {
        System.out.println("-----2");
        String aliases = getAliases(j.getAlias_value());//别名;
        if(StringUtils.isNotBlank(aliases)){
            //极光推送
            JPushClient jpushClient =  new JPushClient(MASTERSECRET,APPKEY,null,ClientConfig.getInstance());
            PushPayload payload = JPushDevice.oneName(aliases, j.getTitle(), j.getFsmessagecontent());//一个别名
            PushResult pResult;
            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 Ajax.buildSuccessResult();
    }

    //2.推送多人//先循环判断别名(常用)
    @RequestMapping(value = "getAllJPushDevice", method = RequestMethod.POST)
    @ResponseBody
    public Map<String, Object> getAllJPushDevice(@RequestBody JPushDeviceBean j) {
        List<String> ulist = j.getUsername();//判断过得别名数组
        if(null!=ulist && !ulist.isEmpty()){
            String[] username = ulist.toArray(new String[ulist.size()]);//转化为数组, 调用极光多人推送方法,一次性只能推1000个。
            //极光推送
            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);
                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();
            }
        }
        return Ajax.buildSuccessResult();
    }
   
    //3.判断查询别名是否存在
    public static String getAliases(String aliases){
        String alia ="";
        JPushDeviceBean j = new JPushDeviceBean();
        j.setAlias_value(aliases);
        Map<String, Object> map = getJPushDeviceAliases(j);//查询是否含有别名
        Map<String, Object> ma = (Map<String, Object>)map.get("data");
        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 Map<String, Object> getJPushDeviceAliases(@RequestBody JPushDeviceBean ht) {
        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 = HttpClientUtils.doGet(url.toString(), authorValue, para);

        if (StringUtils.isNotEmpty((String) response.get("error"))) {
                logger.info("getAliases:url+params----" + url + para);
                return Ajax.buildErrorResult((String) response.get("error"));
            }
        } catch (Exception e) {
            e.printStackTrace();
            logger.error("getAliases:url+params----" + e);
        }
        return Ajax.getSuccessReturnMapWithData(response);
    }
    
    //String转base64
    public static String getBase64(){
        Base64 base64 = new Base64();
        String base64Sign ="";
         String string  = APPKEY+":"+MASTERSECRET;
         try {
             base64Sign = base64.encodeToString(string.getBytes("UTF-8"));
//             System.out.println(base64Sign);
         } catch (UnsupportedEncodingException e) {
             e.printStackTrace();
         }
        return " Basic "+base64Sign;
    }

}

 

//自定义的类用来接收参数

package com.javajy.vo;

import java.util.List;

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;//角标数
    
    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;
    }

    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 String getToken() {
        return token;
    }

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

}
 

/*(二)给一个用户推送(直接调用极光实例未进行别名判断)

Fsuser u = fsuserDao.findOne(userId);
try {
JPushClient jpushClient = new JPushClient(JPushDevice.masterSecret, JPushDevice.appKey, null, ClientConfig.getInstance());
PushPayload payload = null;
if(u!=null){
payload = JPushDevice.buildPushObject_ios_audienceMore_messageWithExtras(u.getUsername(),fsmessagecontent);
}
PushResult pResult = jpushClient.sendPush(payload);
System.out.println("Got result  - " + pResult );
Thread.sleep(5000); // 请求结束后,调用 NettyHttpClient 中的 close 方法,否则进程不会退出。
jpushClient.close();
} catch (APIConnectionException e) {
e.printStackTrace();
System.out.println(e);
} catch (APIRequestException e) {
e.printStackTrace();
System.out.println(e);
} catch (InterruptedException e) {
e.printStackTrace();
System.out.println(e);
}*/

/*    public static void main(String[] args) {
        JPushDeviceController JPushDeviceController = new JPushDeviceController();
        JPushDeviceBean jd = new JPushDeviceBean();
        jd.setAlias_value("物业2");
        jd.setTitle("物业标题");
        jd.setFsmessagecontent("物业内容");
        JPushDeviceController.getOneJPushDevice(jd);
    }*/

 

四。注意调用极光推送前要进行判断,查一下是否含有该别名,如果没有,就不推送。要不然推了,后台会报错

详情请查看我的另一篇文章,Java之~用Https调用第三方极光推送,查询极光推送别名

https://blog.csdn.net/haopingping_88/article/details/81207628

 

 

 

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值