一。先进行配置
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);
}*/
四。注意调用极光推送前要进行判断,查一下是否含有该别名,如果没有,就不推送。要不然推了,后台会报错