Browse Source

添加撤回/删除推送通知。在iOS已经实现,在android平台需要实现

heavyrain2012 3 years ago
parent
commit
92045bd259

+ 1 - 1
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;

+ 2 - 0
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;
 }

+ 6 - 0
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())

+ 7 - 0
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();

+ 6 - 0
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) {

+ 5 - 0
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); //创建通知栏消息体

+ 6 - 0
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) {

+ 4 - 0
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()

+ 50 - 5
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) {