diff --git a/src/main/java/cn/wildfirechat/push/PushMessage.java b/src/main/java/cn/wildfirechat/push/PushMessage.java index 419f4d6..a52abad 100644 --- a/src/main/java/cn/wildfirechat/push/PushMessage.java +++ b/src/main/java/cn/wildfirechat/push/PushMessage.java @@ -24,7 +24,7 @@ public class PushMessage { public String voipDeviceToken; public boolean isHiddenDetail; public String language; - + public long messageId; public String getSender() { return sender; diff --git a/src/main/java/cn/wildfirechat/push/PushMessageType.java b/src/main/java/cn/wildfirechat/push/PushMessageType.java index d2409b4..900deab 100644 --- a/src/main/java/cn/wildfirechat/push/PushMessageType.java +++ b/src/main/java/cn/wildfirechat/push/PushMessageType.java @@ -6,4 +6,6 @@ public interface PushMessageType { int PUSH_MESSAGE_TYPE_VOIP_BYE = 2; int PUSH_MESSAGE_TYPE_FRIEND_REQUEST = 3; int PUSH_MESSAGE_TYPE_VOIP_ANSWER = 4; + int PUSH_MESSAGE_TYPE_RECALLED = 5; + int PUSH_MESSAGE_TYPE_DELETED = 6; } diff --git a/src/main/java/cn/wildfirechat/push/android/fcm/FCMPush.java b/src/main/java/cn/wildfirechat/push/android/fcm/FCMPush.java index 901fd17..5f338e8 100644 --- a/src/main/java/cn/wildfirechat/push/android/fcm/FCMPush.java +++ b/src/main/java/cn/wildfirechat/push/android/fcm/FCMPush.java @@ -34,6 +34,12 @@ public class FCMPush { public void push(PushMessage pushMessage) { + if(pushMessage.pushMessageType == PushMessageType.PUSH_MESSAGE_TYPE_RECALLED || pushMessage.pushMessageType == PushMessageType.PUSH_MESSAGE_TYPE_DELETED) { + //Todo not implement + //撤回或者删除消息,需要更新远程通知,暂未实现 + return; + } + Notification.Builder builder = Notification.builder().setTitle(pushMessage.senderName).setBody(pushMessage.pushContent); Message message = Message.builder() .setNotification(builder.build()) diff --git a/src/main/java/cn/wildfirechat/push/android/hms/HMSPush.java b/src/main/java/cn/wildfirechat/push/android/hms/HMSPush.java index 1e7393e..7540061 100644 --- a/src/main/java/cn/wildfirechat/push/android/hms/HMSPush.java +++ b/src/main/java/cn/wildfirechat/push/android/hms/HMSPush.java @@ -2,6 +2,7 @@ package cn.wildfirechat.push.android.hms; import cn.wildfirechat.push.PushMessage; +import cn.wildfirechat.push.PushMessageType; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.google.gson.Gson; @@ -46,6 +47,12 @@ public class HMSPush { //发送Push消息 public void push(PushMessage pushMessage) { + if(pushMessage.pushMessageType == PushMessageType.PUSH_MESSAGE_TYPE_RECALLED || pushMessage.pushMessageType == PushMessageType.PUSH_MESSAGE_TYPE_DELETED) { + //Todo not implement + //撤回或者删除消息,需要更新远程通知,暂未实现 + return; + } + if (tokenExpiredTime <= System.currentTimeMillis()) { try { refreshToken(); diff --git a/src/main/java/cn/wildfirechat/push/android/meizu/MeiZuPush.java b/src/main/java/cn/wildfirechat/push/android/meizu/MeiZuPush.java index f74eaf7..7619b54 100644 --- a/src/main/java/cn/wildfirechat/push/android/meizu/MeiZuPush.java +++ b/src/main/java/cn/wildfirechat/push/android/meizu/MeiZuPush.java @@ -32,6 +32,12 @@ public class MeiZuPush { private MeiZuConfig mConfig; public void push(PushMessage pushMessage) { + if(pushMessage.pushMessageType == PushMessageType.PUSH_MESSAGE_TYPE_RECALLED || pushMessage.pushMessageType == PushMessageType.PUSH_MESSAGE_TYPE_DELETED) { + //Todo not implement + //撤回或者删除消息,需要更新远程通知,暂未实现 + return; + } + //组装透传消息 String title; if (pushMessage.pushMessageType == PushMessageType.PUSH_MESSAGE_TYPE_FRIEND_REQUEST) { diff --git a/src/main/java/cn/wildfirechat/push/android/oppo/OppoPush.java b/src/main/java/cn/wildfirechat/push/android/oppo/OppoPush.java index 04ea7f3..5d136c6 100644 --- a/src/main/java/cn/wildfirechat/push/android/oppo/OppoPush.java +++ b/src/main/java/cn/wildfirechat/push/android/oppo/OppoPush.java @@ -38,6 +38,11 @@ public class OppoPush { if (mSender == null) { LOG.error("Oppo push message can't sent, because not initial correctly"); } + if(pushMessage.pushMessageType == PushMessageType.PUSH_MESSAGE_TYPE_RECALLED || pushMessage.pushMessageType == PushMessageType.PUSH_MESSAGE_TYPE_DELETED) { + //Todo not implement + //撤回或者删除消息,需要更新远程通知,暂未实现 + return; + } Result result = null; try { Notification notification = getNotification(pushMessage); //创建通知栏消息体 diff --git a/src/main/java/cn/wildfirechat/push/android/vivo/VivoPush.java b/src/main/java/cn/wildfirechat/push/android/vivo/VivoPush.java index 4eb8061..687f78c 100644 --- a/src/main/java/cn/wildfirechat/push/android/vivo/VivoPush.java +++ b/src/main/java/cn/wildfirechat/push/android/vivo/VivoPush.java @@ -42,6 +42,12 @@ public class VivoPush { refreshToken(); } + if(pushMessage.pushMessageType == PushMessageType.PUSH_MESSAGE_TYPE_RECALLED || pushMessage.pushMessageType == PushMessageType.PUSH_MESSAGE_TYPE_DELETED) { + //Todo not implement + //撤回或者删除消息,需要更新远程通知,暂未实现 + return; + } + Result resultMessage = null; try { if (pushMessage.isHiddenDetail) { diff --git a/src/main/java/cn/wildfirechat/push/android/xiaomi/XiaomiPush.java b/src/main/java/cn/wildfirechat/push/android/xiaomi/XiaomiPush.java index 16101c9..000c75e 100644 --- a/src/main/java/cn/wildfirechat/push/android/xiaomi/XiaomiPush.java +++ b/src/main/java/cn/wildfirechat/push/android/xiaomi/XiaomiPush.java @@ -43,6 +43,10 @@ public class XiaomiPush { .timeToLive(timeToLive) .enableFlowControl(false) .build(); + } else if(pushMessage.pushMessageType == PushMessageType.PUSH_MESSAGE_TYPE_RECALLED || pushMessage.pushMessageType == PushMessageType.PUSH_MESSAGE_TYPE_DELETED) { + //Todo not implement + //撤回或者删除消息,需要更新远程通知,暂未实现 + return; } else { long timeToLive = 600 * 1000;//10 min message = new Message.Builder() diff --git a/src/main/java/cn/wildfirechat/push/ios/ApnsServer.java b/src/main/java/cn/wildfirechat/push/ios/ApnsServer.java index 1d7eb1e..5f4e1be 100644 --- a/src/main/java/cn/wildfirechat/push/ios/ApnsServer.java +++ b/src/main/java/cn/wildfirechat/push/ios/ApnsServer.java @@ -10,6 +10,9 @@ import com.turo.pushy.apns.util.concurrent.PushNotificationFuture; import io.micrometer.core.instrument.simple.SimpleMeterRegistry; import io.netty.util.concurrent.Future; import io.netty.util.concurrent.GenericFutureListener; +import org.json.simple.JSONObject; +import org.json.simple.parser.JSONParser; +import org.json.simple.parser.ParseException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -87,11 +90,32 @@ public class ApnsServer { } } + public long getMessageId(PushMessage pushMessage) { + try { + JSONObject jsonObject = (JSONObject)(new JSONParser().parse(pushMessage.pushData)); + if(jsonObject.get("messageUid") instanceof Long) { + return (Long)jsonObject.get("messageUid"); + } else if(jsonObject.get("messageUid") instanceof Integer) { + return (Integer)jsonObject.get("messageUid"); + } else if(jsonObject.get("messageUid") instanceof Double) { + double uid = (Double)jsonObject.get("messageUid"); + return (long)uid; + } + } catch (ParseException e) { + e.printStackTrace(); + } + return 0; + } public void pushMessage(PushMessage pushMessage) { ApnsClient service; String sound = mConfig.alert; + String collapseId = null; + if(pushMessage.messageId > 0) { + collapseId = pushMessage.messageId + ""; + } + String pushContent = pushMessage.getPushContent(); boolean hiddenDetail = pushMessage.isHiddenDetail; if (pushMessage.pushMessageType == PushMessageType.PUSH_MESSAGE_TYPE_VOIP_INVITE) { @@ -106,9 +130,30 @@ public class ApnsServer { pushContent = "已被其他端接听"; sound = null; hiddenDetail = false; + } else if(pushMessage.pushMessageType == PushMessageType.PUSH_MESSAGE_TYPE_RECALLED) { + pushContent = "消息已被撤回"; + sound = null; + hiddenDetail = false; + long recalledId = getMessageId(pushMessage); + if(recalledId > 0) { + collapseId = recalledId + ""; + } + pushMessage.pushData = null; + } else if(pushMessage.pushMessageType == PushMessageType.PUSH_MESSAGE_TYPE_DELETED) { + pushContent = "消息已被删除"; + sound = null; + hiddenDetail = false; + long deletedId = getMessageId(pushMessage); + if(deletedId > 0) { + collapseId = deletedId + ""; + } + pushMessage.pushData = null; + } else if(pushMessage.pushMessageType != PushMessageType.PUSH_MESSAGE_TYPE_NORMAL) { + LOG.error("not support push message type:{}", pushMessage.pushMessageType); } - int badge = pushMessage.getUnReceivedMsg(); + + int badge = pushMessage.getUnReceivedMsg(); if (badge <= 0) { badge = 1; } @@ -187,10 +232,10 @@ public class ApnsServer { } else { service = developSvc; } - if(pushMessage.pushMessageType == PushMessageType.PUSH_MESSAGE_TYPE_NORMAL || StringUtils.isEmpty(pushMessage.getVoipDeviceToken())) { + if((pushMessage.pushMessageType == PushMessageType.PUSH_MESSAGE_TYPE_NORMAL || pushMessage.pushMessageType == PushMessageType.PUSH_MESSAGE_TYPE_RECALLED || pushMessage.pushMessageType == PushMessageType.PUSH_MESSAGE_TYPE_DELETED) || StringUtils.isEmpty(pushMessage.getVoipDeviceToken())) { c.add(Calendar.MINUTE, 10); //普通推送 String payload = payloadBuilder.buildWithDefaultMaximumLength(); - pushNotification = new SimpleApnsPushNotification(pushMessage.deviceToken, pushMessage.packageName, payload, c.getTime(), DeliveryPriority.CONSERVE_POWER, PushType.ALERT); + pushNotification = new SimpleApnsPushNotification(pushMessage.deviceToken, pushMessage.packageName, payload, c.getTime(), DeliveryPriority.CONSERVE_POWER, PushType.ALERT, collapseId); } else { c.add(Calendar.MINUTE, 1); //voip通知,使用普通推送 payloadBuilder.setContentAvailable(true); @@ -198,7 +243,7 @@ public class ApnsServer { payloadBuilder.addCustomProperty("voip_type", pushMessage.pushMessageType); payloadBuilder.addCustomProperty("voip_data", pushMessage.pushData); String payload = payloadBuilder.buildWithDefaultMaximumLength(); - pushNotification = new SimpleApnsPushNotification(pushMessage.deviceToken, pushMessage.packageName, payload, c.getTime(), DeliveryPriority.IMMEDIATE, PushType.BACKGROUND); + pushNotification = new SimpleApnsPushNotification(pushMessage.deviceToken, pushMessage.packageName, payload, c.getTime(), DeliveryPriority.IMMEDIATE, PushType.BACKGROUND, collapseId); } } else { if (pushMessage.getPushType() == IOSPushType.IOS_PUSH_TYPE_DISTRIBUTION) { @@ -208,7 +253,7 @@ public class ApnsServer { } c.add(Calendar.MINUTE, 1); String payload = payloadBuilder.buildWithDefaultMaximumLength(); - pushNotification = new SimpleApnsPushNotification(pushMessage.voipDeviceToken, pushMessage.packageName + ".voip", payload, c.getTime(), DeliveryPriority.IMMEDIATE, PushType.VOIP); + pushNotification = new SimpleApnsPushNotification(pushMessage.voipDeviceToken, pushMessage.packageName + ".voip", payload, c.getTime(), DeliveryPriority.IMMEDIATE, PushType.VOIP, collapseId); } if (service == null) {