package com.yeshi.fanli.util.push;
|
|
import java.io.InputStream;
|
import java.util.ArrayList;
|
import java.util.List;
|
|
import javax.annotation.PostConstruct;
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.stereotype.Component;
|
import org.yeshi.utils.HttpUtil;
|
|
import com.google.gson.Gson;
|
import com.yeshi.fanli.controller.admin.PushController;
|
import com.yeshi.fanli.dto.push.PushTypeEnum;
|
import com.yeshi.fanli.entity.xinge.MessageInfo;
|
import com.yeshi.fanli.entity.xinge.PushRecord;
|
import com.yeshi.fanli.log.LogHelper;
|
import com.yeshi.fanli.log.PushLogHelper;
|
import com.yeshi.fanli.service.inter.config.BusinessSystemService;
|
import com.yeshi.fanli.util.Constant;
|
import com.yeshi.fanli.util.StringUtil;
|
import com.yeshi.fanli.util.factory.IOSPushFactory;
|
|
import javapns.devices.Device;
|
import javapns.devices.implementations.basic.BasicDevice;
|
import javapns.notification.AppleNotificationServerBasicImpl;
|
import javapns.notification.PushNotificationManager;
|
import javapns.notification.PushNotificationPayload;
|
import javapns.notification.PushedNotification;
|
import net.sf.json.JSONObject;
|
|
@Component
|
public class IOSPushUtil {
|
|
private static IOSPushUtil iosPushUtil;
|
|
@Autowired
|
private BusinessSystemService businessSystemService;
|
|
@PostConstruct
|
public void init() {
|
iosPushUtil = this;
|
iosPushUtil.businessSystemService = this.businessSystemService;
|
}
|
|
/**
|
*
|
* 方法说明: IOS 多推
|
*
|
* @author mawurui createTime 2018年5月8日 上午10:19:57
|
* @param deviceToken
|
* @param packages
|
* @param alert
|
* @return
|
* @throws Exception
|
*/
|
public static String allPushIOS(List<String> deviceTokenList, MessageInfo info, String url, int type)
|
throws Exception {
|
|
if (Constant.IS_TEST)
|
return null;
|
|
Gson gson = new Gson();
|
PushLogHelper.iosInfo("IOS推送设备数为:" + deviceTokenList.size());
|
PushLogHelper.iosInfo("IOS推送的内容为:" + gson.toJson(info));
|
List<String> tokenList = new ArrayList<String>();
|
for (String deviceToken : deviceTokenList) {
|
tokenList.add(deviceToken);
|
}
|
// json自定义传值
|
|
JSONObject json = null;
|
if (type == PushTypeEnum.goodsdetail.getCode()) {
|
Long auctionId = null;
|
if (url.contains("id=")) {
|
String[] sts = url.split("\\?")[1].split("&");
|
for (String st : sts) {
|
if (st.contains("id=")) {
|
auctionId = Long.parseLong(st.replace("id=", "").trim());
|
}
|
}
|
}
|
if (auctionId == null)
|
throw new Exception("淘宝商品ID提取出错");
|
json = IOSPushFactory.createGoodsPush(auctionId, info.getTitle(), info.getContent());
|
} else if (type == PushTypeEnum.url.getCode()) {
|
String shortUrl = HttpUtil.getShortLink(url);
|
if (StringUtil.isNullOrEmpty(shortUrl))
|
throw new Exception("获取短链出错");
|
json = IOSPushFactory.createURLPush(shortUrl, info.getTitle(), info.getContent());
|
} else if (type == PushTypeEnum.ZNX.getCode()) {
|
json = IOSPushFactory.createZNXPush(info.getTitle(), info.getContent());
|
} else if (type == PushTypeEnum.weex.getCode()) {
|
String shortUrl = HttpUtil.getShortLink(url);
|
if (StringUtil.isNullOrEmpty(shortUrl))
|
throw new Exception("获取短链出错");
|
json = IOSPushFactory.createWEEXPush(shortUrl, info.getTitle(), info.getContent());
|
} else if (type == PushTypeEnum.baichuan.getCode()) {
|
String shortUrl = HttpUtil.getShortLink(url);
|
if (StringUtil.isNullOrEmpty(shortUrl))
|
throw new Exception("获取短链出错");
|
json = IOSPushFactory.createBaiChuanPush(shortUrl, info.getTitle(), info.getContent());
|
} else if (type == PushTypeEnum.welfare.getCode()) {
|
json = IOSPushFactory.createWelfarePush(info.getTitle(), info.getContent());
|
} else if (type == PushTypeEnum.signin.getCode()) {
|
json = IOSPushFactory.createUserSignInPush(info.getTitle(), info.getContent());
|
}
|
|
// 分组推送 每50个设备为一组
|
|
InputStream certificate = IOSPushUtil.class.getClassLoader()
|
.getResourceAsStream("certificate/pushCertificate.p12"); // 读取.p12文件
|
String certificatePassword = Constant.systemCommonConfig.getIosPushCertificatePwd();
|
if (tokenList != null && tokenList.size() > 0) {
|
int pageSize = 50;
|
int page = tokenList.size() % pageSize == 0 ? tokenList.size() / pageSize : tokenList.size() / pageSize + 1;
|
for (int i = 0; i < page; i++) {
|
int start = i * pageSize;
|
int end = start + pageSize;
|
if (end > tokenList.size())
|
end = tokenList.size();
|
pushIOS(tokenList.subList(start, end), json, certificate, certificatePassword);
|
}
|
|
}
|
|
return null;
|
}
|
|
public static String pushIOS(List<String> deviceTokenList, JSONObject json, InputStream certificate,
|
String certificatePWD) throws Exception {
|
List<String> tokenList = new ArrayList<String>();
|
for (String deviceToken : deviceTokenList) {
|
tokenList.add(deviceToken);
|
}
|
while (json.toString().getBytes().length > 256) {
|
// 首先削减内容,然后削减标题
|
String title = json.optJSONObject("aps").optJSONObject("alert").optString("title");
|
String body = json.optJSONObject("aps").optJSONObject("alert").optString("body");
|
if (StringUtil.isNullOrEmpty(body) || body.length() < 4) {
|
// 削减标题
|
if (!StringUtil.isNullOrEmpty(title) && body.length() > 6) {
|
json.optJSONObject("aps").optJSONObject("alert").put("title",
|
title.substring(0, title.length() - 1));
|
continue;
|
}
|
} else {
|
json.optJSONObject("aps").optJSONObject("alert").put("body", body.substring(0, body.length() - 1));
|
continue;
|
}
|
}
|
|
LogHelper.test("IOS推送的字节数" + json.toString().getBytes().length);
|
PushNotificationPayload payLoad = new PushNotificationPayload();
|
payLoad = PushNotificationPayload.fromJSON(json.toString());
|
|
PushNotificationManager pushManager = new PushNotificationManager();
|
// true:表示的是产品线上发布推送服务 false:表示的是产品测试推送服务
|
if (Constant.IS_TEST)
|
pushManager.initializeConnection(new AppleNotificationServerBasicImpl(certificate, certificatePWD, false));
|
else
|
pushManager.initializeConnection(new AppleNotificationServerBasicImpl(certificate, certificatePWD, true));
|
|
List<Device> deviceList = new ArrayList<Device>();
|
for (String token : tokenList) {
|
if (!StringUtil.isNullOrEmpty(token))
|
deviceList.add(new BasicDevice(token));
|
}
|
// 开始推送
|
List<PushedNotification> notificationList = pushManager.sendNotifications(payLoad, deviceList);
|
Gson gson = new Gson();
|
if (notificationList != null)
|
for (PushedNotification notification : notificationList) {
|
PushLogHelper.iosInfo(gson.toJson(notification));
|
}
|
pushManager.stopConnection();
|
return null;
|
}
|
|
/**
|
*
|
* @author mawurui createTime 2018年5月8日 下午12:12:19
|
* @param info
|
* @param json
|
* @param pushRecord
|
* @return
|
* @throws Exception
|
*/
|
public static int allFanLiQuanDevice(System b_IOS, List<String> deviceTokenList, String PACKAGES, String title,
|
String content, String url, PushRecord pushRecord, int type) throws Exception {
|
|
return pushApp(deviceTokenList, PACKAGES, title, content, b_IOS, url, pushRecord, type);
|
}
|
|
/**
|
*
|
* @param info
|
* @param params
|
* @param pushRecord
|
* @return 1:都成功 2:仅android 成功 3.仅IOS成功 4.都失败
|
* @throws Exception
|
*/
|
private static int pushApp(List<String> deviceTokenList, String PACKAGES, String title, String content,
|
System b_IOS, String url, PushRecord pushRecord, int type) throws Exception {
|
MessageInfo info = new MessageInfo();
|
info.setTitle(title);
|
info.setContent(content);
|
String IOS = allPushIOS(deviceTokenList, info, url, type);
|
LogHelper.userInfo("IOS的推送日志:" + IOS);
|
pushRecord.setIosPushId(IOS);
|
if (IOS != null) {
|
return 1;
|
} else {
|
return 4;
|
}
|
}
|
|
/**
|
* 执行推送
|
*
|
* @param tokenList
|
* @param json
|
* @throws Exception
|
*/
|
public static void executePushIOS(List<String> tokenList, JSONObject json) throws Exception {
|
InputStream certificate = IOSPushUtil.class.getClassLoader()
|
.getResourceAsStream("certificate/pushCertificate.p12"); // 读取.p12文件
|
String certificatePassword = Constant.systemCommonConfig.getIosPushCertificatePwd();
|
pushIOS(tokenList, json, certificate, certificatePassword);
|
}
|
|
/**
|
*
|
* 方法说明: IOS 多推
|
*
|
* @author mawurui createTime 2018年5月8日 上午10:19:57
|
* @param deviceToken
|
* @param packages
|
* @param alert
|
* @return
|
* @throws Exception
|
*/
|
public static JSONObject getJSONObject(MessageInfo info, String url, int type) throws Exception {
|
|
// json自定义传值
|
JSONObject json = null;
|
if (type == PushTypeEnum.goodsdetail.getCode()) {
|
Long auctionId = null;
|
if (url.contains("id=")) {
|
String[] sts = url.split("\\?")[1].split("&");
|
for (String st : sts) {
|
if (st.contains("id=")) {
|
auctionId = Long.parseLong(st.replace("id=", "").trim());
|
}
|
}
|
}
|
if (auctionId == null)
|
throw new Exception("淘宝商品ID提取出错");
|
json = IOSPushFactory.createGoodsPush(auctionId, info.getTitle(), info.getContent());
|
} else if (type == PushTypeEnum.url.getCode()) {
|
String shortUrl = HttpUtil.getShortLink(url);
|
if (StringUtil.isNullOrEmpty(shortUrl))
|
throw new Exception("获取短链出错");
|
json = IOSPushFactory.createURLPush(shortUrl, info.getTitle(), info.getContent());
|
} else if (type == PushTypeEnum.ZNX.getCode()) {
|
json = IOSPushFactory.createZNXPush(info.getTitle(), info.getContent());
|
} else if (type == PushTypeEnum.weex.getCode()) {
|
String shortUrl = HttpUtil.getShortLink(url);
|
if (StringUtil.isNullOrEmpty(shortUrl))
|
shortUrl = url;
|
json = IOSPushFactory.createWEEXPush(shortUrl, info.getTitle(), info.getContent());
|
} else if (type == PushTypeEnum.baichuan.getCode()) {
|
String shortUrl = HttpUtil.getShortLink(url);
|
if (StringUtil.isNullOrEmpty(shortUrl))
|
shortUrl = url;
|
json = IOSPushFactory.createBaiChuanPush(shortUrl, info.getTitle(), info.getContent());
|
} else if (type == PushTypeEnum.signin.getCode()) {
|
json = IOSPushFactory.createUserSignInPush(info.getTitle(), info.getContent());
|
}
|
|
return json;
|
}
|
}
|