admin
2025-02-25 30d8e227e8d823b6c38c3b9c90ac2df03b63befe
fanli/src/main/java/com/yeshi/fanli/util/push/IOSPushUtil.java
@@ -33,253 +33,239 @@
@Component
public class IOSPushUtil {
   private static IOSPushUtil iosPushUtil;
    private static IOSPushUtil iosPushUtil;
   @Autowired
   private BusinessSystemService businessSystemService;
    @Autowired
    private BusinessSystemService businessSystemService;
   @PostConstruct
   public void init() {
      iosPushUtil = this;
      iosPushUtil.businessSystemService = this.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 {
    /**
     * 方法说明: IOS 多推
     *
     * @return
     * @throws Exception
     * @author mawurui createTime 2018年5月8日 上午10:19:57
     */
    public static String allPushIOS(List<String> deviceTokenList, MessageInfo info, String url, int type, String pwd)
            throws Exception {
      // if (Constant.IS_TEST)
      // return null;
        // 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自定义传值
        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 = url;
         // 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());
      }
        JSONObject json = null;
        if (type == PushTypeEnum.goodsdetail.getCode()) {
            String auctionId = null;
            if (url.contains("id=")) {
                String[] sts = url.split("\\?")[1].split("&");
                for (String st : sts) {
                    if (st.contains("id=")) {
                        auctionId = (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 = url;
            // 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个设备为一组
        // 分组推送 每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);
         }
        InputStream certificate = IOSPushUtil.class.getClassLoader()
                .getResourceAsStream("certificate/pushCertificate.p12"); // 读取.p12文件
        String certificatePassword = pwd;
        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;
   }
        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;
         }
      }
    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());
        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));
        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;
   }
        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 {
    /**
     * @param pushRecord
     * @return
     * @throws Exception
     * @author mawurui createTime 2018年5月8日 下午12:12:19
     */
    public static int allFanLiQuanDevice(System b_IOS, List<String> deviceTokenList, String PACKAGES, String title,
                                         String content, String url, PushRecord pushRecord, int type,String pwd) throws Exception {
      return pushApp(deviceTokenList, PACKAGES, title, content, b_IOS, url, pushRecord, type);
   }
        return pushApp(deviceTokenList, PACKAGES, title, content, b_IOS, url, pushRecord, type,pwd);
    }
   /**
    *
    * @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 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, String pwd) throws Exception {
        MessageInfo info = new MessageInfo();
        info.setTitle(title);
        info.setContent(content);
        String IOS = allPushIOS(deviceTokenList, info, url, type, pwd);
        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);
   }
    /**
     * 执行推送
     *
     * @param tokenList
     * @param json
     * @throws Exception
     */
    public static void executePushIOS(List<String> tokenList, JSONObject json, String pwd) throws Exception {
        InputStream certificate = IOSPushUtil.class.getClassLoader()
                .getResourceAsStream("certificate/push_certification_2025216.p12"); // 读取.p12文件
        String certificatePassword = pwd;
        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 {
    /**
     * 方法说明: IOS 多推
     *
     * @return
     * @throws Exception
     * @author mawurui createTime 2018年5月8日 上午10:19:57
     */
    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());
      }
        // json自定义传值
        JSONObject json = null;
        if (type == PushTypeEnum.goodsdetail.getCode()) {
            String auctionId = null;
            if (url.contains("id=")) {
                String[] sts = url.split("\\?")[1].split("&");
                for (String st : sts) {
                    if (st.contains("id=")) {
                        auctionId = (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;
   }
        return json;
    }
}