Java之~ 极光推送消息给APP

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/haopingping_88/article/details/79310147

一。先进行配置

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 org.slf4j.Logger;
import org.slf4j.LoggerFactory;
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);

    private static final String URL = "https://device.jpush.cn";//极光访问URL
    public static long timeToLive =  60 * 60 * 24 * 10;  //10天
    
//    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_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) {
           
            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(title)//弹框显示标题
                                  .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(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";//极光密码
    
    
    //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()]);//转化为数组
            //极光推送
            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();
    }
   
    //查询别名是否存在
    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

 

 

 

阅读更多
换一批

没有更多推荐了,返回首页