From af56062f6295a99cd9c65480165e1cbd38c62f29 Mon Sep 17 00:00:00 2001 From: heavyrian2012 Date: Thu, 29 Sep 2022 14:00:30 +0800 Subject: [PATCH] =?UTF-8?q?1,=20=E4=BC=98=E5=8C=96=E4=BB=A3=E7=A0=81=202,?= =?UTF-8?q?=20=E5=BD=93=E4=BC=9A=E8=AF=9D=E4=B8=BA=E9=A2=91=E9=81=93?= =?UTF-8?q?=E6=97=B6=EF=BC=8C=E6=8E=A8=E9=80=81=E6=A0=87=E9=A2=98=E4=BD=BF?= =?UTF-8?q?=E7=94=A8=E9=A2=91=E9=81=93=E5=90=8D=E7=A7=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cn/wildfirechat/push/Utility.java | 101 +++++++ .../push/android/fcm/FCMPush.java | 7 +- .../push/android/oppo/OppoPush.java | 24 +- .../push/android/vivo/VivoPush.java | 26 +- .../push/android/xiaomi/XiaomiPush.java | 9 +- .../cn/wildfirechat/push/ios/ApnsServer.java | 261 ++++++------------ 6 files changed, 211 insertions(+), 217 deletions(-) diff --git a/src/main/java/cn/wildfirechat/push/Utility.java b/src/main/java/cn/wildfirechat/push/Utility.java index f8cc5e9..0c07131 100644 --- a/src/main/java/cn/wildfirechat/push/Utility.java +++ b/src/main/java/cn/wildfirechat/push/Utility.java @@ -8,8 +8,109 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.util.StringUtils; +import java.util.Map; + public class Utility { private static final Logger LOG = LoggerFactory.getLogger(Utility.class); + + public static String[] getPushTitleAndContent(PushMessage pushMessage) { + String pushContent = pushMessage.getPushContent(); + boolean hiddenDetail = pushMessage.isHiddenDetail; + if (pushMessage.pushMessageType == PushMessageType.PUSH_MESSAGE_TYPE_VOIP_INVITE) { + pushContent = "通话邀请"; + hiddenDetail = false; + } else if(pushMessage.pushMessageType == PushMessageType.PUSH_MESSAGE_TYPE_VOIP_BYE) { + pushContent = "通话结束"; + hiddenDetail = false; + } else if(pushMessage.pushMessageType == PushMessageType.PUSH_MESSAGE_TYPE_VOIP_ANSWER) { + pushContent = "已被其他端接听"; + hiddenDetail = false; + } else if(pushMessage.pushMessageType == PushMessageType.PUSH_MESSAGE_TYPE_RECALLED) { + pushContent = "消息已被撤回"; + hiddenDetail = false; + pushMessage.pushData = null; + } else if(pushMessage.pushMessageType == PushMessageType.PUSH_MESSAGE_TYPE_DELETED) { + pushContent = "消息已被删除"; + hiddenDetail = false; + pushMessage.pushData = null; + } else if(pushMessage.pushMessageType == PushMessageType.PUSH_MESSAGE_TYPE_SECRET_CHAT) { + pushContent = "您收到一条密聊消息"; + } else if(pushMessage.pushMessageType != PushMessageType.PUSH_MESSAGE_TYPE_NORMAL) { + LOG.error("not support push message type:{}", pushMessage.pushMessageType); + } + + String title; + String body; + + //todo 这里需要加上语言的处理 +// if (pushMessage.language == "zh_CN") { +// +// } else if(pushMessage.language == "US_EN") { +// +// } + if (pushMessage.convType == 1) { + title = pushMessage.targetName; + if (StringUtils.isEmpty(title)) { + title = "群聊"; + } + + if (StringUtils.isEmpty(pushMessage.senderName)) { + body = pushContent; + } else { + body = pushMessage.senderName + ":" + pushContent; + } + + if (hiddenDetail) { + body = "你收到一条新消息"; //Todo 需要判断当前语言 + } + + if (pushMessage.mentionedType == 1) { + if (StringUtils.isEmpty(pushMessage.senderName)) { + body = "有人在群里@了你"; + } else { + body = pushMessage.senderName + "在群里@了你"; + } + } else if (pushMessage.mentionedType == 2) { + if (StringUtils.isEmpty(pushMessage.senderName)) { + body = "有人在群里@了大家"; + } else { + body = pushMessage.senderName + "在群里@了大家"; + } + } + } else if(pushMessage.convType == 3) { + title = pushMessage.targetName; + if (hiddenDetail) { + body = "你收到一条新消息"; //Todo 需要判断当前语言 + } else { + body = pushContent; + } + } else { + if (pushMessage.pushMessageType == PushMessageType.PUSH_MESSAGE_TYPE_FRIEND_REQUEST) { + if (StringUtils.isEmpty(pushMessage.senderName)) { + title = "好友请求"; + } else { + title = pushMessage.senderName + " 请求加您为好友"; + } + } else { + if (StringUtils.isEmpty(pushMessage.senderName)) { + title = "消息"; + } else { + title = pushMessage.senderName; + } + } + + if (hiddenDetail) { + body = "你收到一条新消息"; //Todo 需要判断当前语言 + } else { + body = pushContent; + } + } + String[] result = new String[2]; + result[0] = title; + result[1] = body; + return result; + } + public static boolean filterPush(PushMessage pushMessage) { if(pushMessage.pushMessageType == PushMessageType.PUSH_MESSAGE_TYPE_VOIP_BYE) { if(Utility.shouldCancelVoipByePush(pushMessage.sender, pushMessage.convType, pushMessage.userId, pushMessage.pushData)) { 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 b7386f6..bdc4804 100644 --- a/src/main/java/cn/wildfirechat/push/android/fcm/FCMPush.java +++ b/src/main/java/cn/wildfirechat/push/android/fcm/FCMPush.java @@ -2,6 +2,7 @@ package cn.wildfirechat.push.android.fcm; import cn.wildfirechat.push.PushMessage; import cn.wildfirechat.push.PushMessageType; +import cn.wildfirechat.push.Utility; import com.google.auth.oauth2.GoogleCredentials; import com.google.firebase.FirebaseApp; import com.google.firebase.FirebaseOptions; @@ -44,7 +45,11 @@ public class FCMPush { pushMessage.pushContent = "您收到一条密聊消息"; } - Notification.Builder builder = Notification.builder().setTitle(pushMessage.senderName).setBody(pushMessage.pushContent); + String[] arr = Utility.getPushTitleAndContent(pushMessage); + String title = arr[0]; + String body = arr[1]; + + Notification.Builder builder = Notification.builder().setTitle(title).setBody(body); Message message = Message.builder() .setNotification(builder.build()) .setToken(pushMessage.deviceToken) 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 8a84f54..2975d88 100644 --- a/src/main/java/cn/wildfirechat/push/android/oppo/OppoPush.java +++ b/src/main/java/cn/wildfirechat/push/android/oppo/OppoPush.java @@ -2,6 +2,7 @@ package cn.wildfirechat.push.android.oppo; import cn.wildfirechat.push.PushMessage; import cn.wildfirechat.push.PushMessageType; +import cn.wildfirechat.push.Utility; import com.oppo.push.server.Notification; import com.oppo.push.server.Result; import com.oppo.push.server.Sender; @@ -77,27 +78,12 @@ public class OppoPush { /** * 以下参数必填项 */ - String title; - if (pushMessage.pushMessageType == PushMessageType.PUSH_MESSAGE_TYPE_FRIEND_REQUEST) { - if (StringUtils.isEmpty(pushMessage.senderName)) { - title = "好友请求"; - } else { - title = pushMessage.senderName + " 请求加您为好友"; - } - } else { - if (StringUtils.isEmpty(pushMessage.senderName)) { - title = "消息"; - } else { - title = pushMessage.senderName; - } - } - - if(pushMessage.pushMessageType == PushMessageType.PUSH_MESSAGE_TYPE_SECRET_CHAT) { - pushMessage.pushContent = "您收到一条密聊消息"; - } + String[] arr = Utility.getPushTitleAndContent(pushMessage); + String title = arr[0]; + String body = arr[1]; notification.setTitle(title); - notification.setContent(pushMessage.pushContent); + notification.setContent(body); /** * 以下参数非必填项, 如果需要使用可以参考OPPO push服务端api文档进行设置 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 2bdce21..dc2c301 100644 --- a/src/main/java/cn/wildfirechat/push/android/vivo/VivoPush.java +++ b/src/main/java/cn/wildfirechat/push/android/vivo/VivoPush.java @@ -2,6 +2,7 @@ package cn.wildfirechat.push.android.vivo; import cn.wildfirechat.push.PushMessage; import cn.wildfirechat.push.PushMessageType; +import cn.wildfirechat.push.Utility; import com.vivo.push.sdk.notofication.Message; import com.vivo.push.sdk.notofication.Result; import com.vivo.push.sdk.server.Sender; @@ -50,33 +51,16 @@ public class VivoPush { Result resultMessage = null; try { - if (pushMessage.isHiddenDetail) { - pushMessage.pushContent = "您收到一条新消息"; - } - String title; - if (pushMessage.pushMessageType == PushMessageType.PUSH_MESSAGE_TYPE_FRIEND_REQUEST) { - if (StringUtils.isEmpty(pushMessage.senderName)) { - title = "好友请求"; - } else { - title = pushMessage.senderName + " 请求加您为好友"; - } - } else { - if (StringUtils.isEmpty(pushMessage.senderName)) { - title = "消息"; - } else { - title = pushMessage.senderName; - } - } - if(pushMessage.pushMessageType == PushMessageType.PUSH_MESSAGE_TYPE_SECRET_CHAT) { - pushMessage.pushContent = "您收到一条密聊消息"; - } + String[] arr = Utility.getPushTitleAndContent(pushMessage); + String title = arr[0]; + String body = arr[1]; Sender senderMessage = new Sender(mConfig.getAppSecret(), authToken); Message.Builder builder = new Message.Builder() .regId(pushMessage.getDeviceToken())//该测试手机设备订阅推送后生成的regId
 .notifyType(3) .title(title) - .content(pushMessage.pushContent) + .content(body) .timeToLive(1000) .skipType(1) .networkType(-1) 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 cc3dbd3..8d247d6 100644 --- a/src/main/java/cn/wildfirechat/push/android/xiaomi/XiaomiPush.java +++ b/src/main/java/cn/wildfirechat/push/android/xiaomi/XiaomiPush.java @@ -3,6 +3,7 @@ package cn.wildfirechat.push.android.xiaomi; import cn.wildfirechat.push.PushMessage; import cn.wildfirechat.push.PushMessageType; +import cn.wildfirechat.push.Utility; import com.google.gson.Gson; import com.xiaomi.xmpush.server.Constants; import com.xiaomi.xmpush.server.Message; @@ -52,11 +53,15 @@ public class XiaomiPush { //撤回或者删除消息,需要更新远程通知,暂未实现 return; } else { //normal or friend + String[] arr = Utility.getPushTitleAndContent(pushMessage); + String title = arr[0]; + String body = arr[1]; + long timeToLive = 600 * 1000;//10 min message = new Message.Builder() .payload(new Gson().toJson(pushMessage)) - .title("新消息提醒") - .description(pushMessage.pushContent) + .title(title) + .description(body) .notifyType(NOTIFY_TYPE_ALL) .restrictedPackageName(pushMessage.getPackageName()) .passThrough(0) diff --git a/src/main/java/cn/wildfirechat/push/ios/ApnsServer.java b/src/main/java/cn/wildfirechat/push/ios/ApnsServer.java index a5eabe7..e99fcd4 100644 --- a/src/main/java/cn/wildfirechat/push/ios/ApnsServer.java +++ b/src/main/java/cn/wildfirechat/push/ios/ApnsServer.java @@ -2,14 +2,13 @@ package cn.wildfirechat.push.ios; import cn.wildfirechat.push.PushMessage; import cn.wildfirechat.push.PushMessageType; +import cn.wildfirechat.push.Utility; import com.turo.pushy.apns.*; import com.turo.pushy.apns.metrics.micrometer.MicrometerApnsClientMetricsListener; import com.turo.pushy.apns.util.ApnsPayloadBuilder; import com.turo.pushy.apns.util.SimpleApnsPushNotification; 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; @@ -23,8 +22,6 @@ import javax.annotation.PostConstruct; import java.io.File; import java.io.IOException; import java.util.Calendar; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; import static java.lang.System.exit; @@ -108,197 +105,113 @@ public class ApnsServer { } public void pushMessage(PushMessage pushMessage) { - ApnsClient service; - String sound = mConfig.alert; + 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) { - pushContent = "通话邀请"; - sound = mConfig.voipAlert; - hiddenDetail = false; - } else if(pushMessage.pushMessageType == PushMessageType.PUSH_MESSAGE_TYPE_VOIP_BYE) { - pushContent = "通话结束"; - sound = null; - hiddenDetail = false; - } else if(pushMessage.pushMessageType == PushMessageType.PUSH_MESSAGE_TYPE_VOIP_ANSWER) { - 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_SECRET_CHAT) { - pushContent = "您收到一条密聊消息"; - } else if(pushMessage.pushMessageType != PushMessageType.PUSH_MESSAGE_TYPE_NORMAL) { - LOG.error("not support push message type:{}", pushMessage.pushMessageType); + if (pushMessage.pushMessageType == PushMessageType.PUSH_MESSAGE_TYPE_VOIP_INVITE) { + sound = mConfig.voipAlert; + } else if(pushMessage.pushMessageType == PushMessageType.PUSH_MESSAGE_TYPE_VOIP_BYE || pushMessage.pushMessageType == PushMessageType.PUSH_MESSAGE_TYPE_VOIP_ANSWER) { + sound = null; + } else if(pushMessage.pushMessageType == PushMessageType.PUSH_MESSAGE_TYPE_RECALLED || pushMessage.pushMessageType == PushMessageType.PUSH_MESSAGE_TYPE_DELETED) { + sound = null; + long messageId = getMessageId(pushMessage); + if(messageId > 0) { + collapseId = messageId + ""; } - + } else if(pushMessage.pushMessageType != PushMessageType.PUSH_MESSAGE_TYPE_NORMAL && pushMessage.pushMessageType != PushMessageType.PUSH_MESSAGE_TYPE_SECRET_CHAT) { + LOG.error("not support push message type:{}", pushMessage.pushMessageType); + } int badge = pushMessage.getUnReceivedMsg(); - if (badge <= 0) { - badge = 1; - } + if (badge <= 0) { + badge = 1; + } - String title; - String body; - //todo 这里需要加上语言的处理,客户端会上报自己的语言,在DeviceInfo那个类中 -// if (pushMessage.language == "zh_CN") { -// -// } else if(pushMessage.language == "US_EN") { -// -// } - if (pushMessage.convType == 1) { - title = pushMessage.targetName; - if (StringUtils.isEmpty(title)) { - title = "群聊"; - } + String[] arr = Utility.getPushTitleAndContent(pushMessage); + String title = arr[0]; + String body = arr[1]; - if (StringUtils.isEmpty(pushMessage.senderName)) { - body = pushContent; - } else { - body = pushMessage.senderName + ":" + pushContent; - } + final ApnsPayloadBuilder payloadBuilder = new ApnsPayloadBuilder(); + payloadBuilder.setAlertBody(body); + payloadBuilder.setAlertTitle(title); + payloadBuilder.setBadgeNumber(badge); + payloadBuilder.setSound(sound); + JSONObject jsonObject = new JSONObject(); + jsonObject.put("sender", pushMessage.sender); + jsonObject.put("convType", pushMessage.convType); + jsonObject.put("convTarget", pushMessage.target); + jsonObject.put("convLine", pushMessage.line); + jsonObject.put("contType", pushMessage.cntType); + jsonObject.put("pushData", pushMessage.pushData); + payloadBuilder.addCustomProperty("wfc", jsonObject); - if (hiddenDetail) { - body = "你收到一条新消息"; //Todo 需要判断当前语言 - } + Calendar c = Calendar.getInstance(); + ApnsPushNotification pushNotification; - if (pushMessage.mentionedType == 1) { - if (StringUtils.isEmpty(pushMessage.senderName)) { - body = "有人在群里@了你"; - } else { - body = pushMessage.senderName + "在群里@了你"; - } - } else if(pushMessage.mentionedType == 2) { - if (StringUtils.isEmpty(pushMessage.senderName)) { - body = "有人在群里@了大家"; - } else { - body = pushMessage.senderName + "在群里@了大家"; - } - } + if (!mConfig.voipFeature || pushMessage.pushMessageType != PushMessageType.PUSH_MESSAGE_TYPE_VOIP_INVITE) { + if (pushMessage.getPushType() == IOSPushType.IOS_PUSH_TYPE_DISTRIBUTION) { + service = productSvc; } else { - if (pushMessage.pushMessageType == PushMessageType.PUSH_MESSAGE_TYPE_FRIEND_REQUEST) { - if (StringUtils.isEmpty(pushMessage.senderName)) { - title = "好友请求"; - } else { - title = pushMessage.senderName + " 请求加您为好友"; - } - } else { - if (StringUtils.isEmpty(pushMessage.senderName)) { - title = "消息"; - } else { - title = pushMessage.senderName; - } - } - - if (hiddenDetail) { - body = "你收到一条新消息"; //Todo 需要判断当前语言 - } else { - body = pushContent; - } + service = developSvc; } - - final ApnsPayloadBuilder payloadBuilder = new ApnsPayloadBuilder(); - payloadBuilder.setAlertBody(body); - payloadBuilder.setAlertTitle(title); - payloadBuilder.setBadgeNumber(badge); - payloadBuilder.setSound(sound); - JSONObject jsonObject = new JSONObject(); - jsonObject.put("sender", pushMessage.sender); - jsonObject.put("convType", pushMessage.convType); - jsonObject.put("convTarget", pushMessage.target); - jsonObject.put("convLine", pushMessage.line); - jsonObject.put("contType", pushMessage.cntType); - jsonObject.put("pushData", pushMessage.pushData); - payloadBuilder.addCustomProperty("wfc", jsonObject); - - Calendar c = Calendar.getInstance(); - ApnsPushNotification pushNotification; - - if (!mConfig.voipFeature || pushMessage.pushMessageType != PushMessageType.PUSH_MESSAGE_TYPE_VOIP_INVITE) { - if (pushMessage.getPushType() == IOSPushType.IOS_PUSH_TYPE_DISTRIBUTION) { - service = productSvc; - } else { - service = developSvc; - } - if(pushMessage.pushMessageType != PushMessageType.PUSH_MESSAGE_TYPE_VOIP_INVITE || 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, collapseId); - } else { - c.add(Calendar.MINUTE, 1); //voip通知,使用普通推送 - payloadBuilder.setContentAvailable(true); - payloadBuilder.addCustomProperty("voip", true); - 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, collapseId); - } - } else { - if (pushMessage.getPushType() == IOSPushType.IOS_PUSH_TYPE_DISTRIBUTION) { - service = productVoipSvc; - } else { - service = developVoipSvc; - } - c.add(Calendar.MINUTE, 1); + if(pushMessage.pushMessageType != PushMessageType.PUSH_MESSAGE_TYPE_VOIP_INVITE || StringUtils.isEmpty(pushMessage.getVoipDeviceToken())) { + c.add(Calendar.MINUTE, 10); //普通推送 String payload = payloadBuilder.buildWithDefaultMaximumLength(); - pushNotification = new SimpleApnsPushNotification(pushMessage.voipDeviceToken, pushMessage.packageName + ".voip", payload, c.getTime(), DeliveryPriority.IMMEDIATE, PushType.VOIP, collapseId); + 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); + payloadBuilder.addCustomProperty("voip", true); + 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, collapseId); } + } else { + if (pushMessage.getPushType() == IOSPushType.IOS_PUSH_TYPE_DISTRIBUTION) { + service = productVoipSvc; + } else { + service = developVoipSvc; + } + c.add(Calendar.MINUTE, 1); + String payload = payloadBuilder.buildWithDefaultMaximumLength(); + pushNotification = new SimpleApnsPushNotification(pushMessage.voipDeviceToken, pushMessage.packageName + ".voip", payload, c.getTime(), DeliveryPriority.IMMEDIATE, PushType.VOIP, collapseId); + } SimpleApnsPushNotification simpleApnsPushNotification = (SimpleApnsPushNotification)pushNotification; - LOG.info("CollapseId:{}", simpleApnsPushNotification.getCollapseId()); + LOG.info("CollapseId:{}", simpleApnsPushNotification.getCollapseId()); - if (service == null) { - LOG.error("Service not exist!!!!"); - return; - } + if (service == null) { + LOG.error("Service not exist!!!!"); + return; + } - final PushNotificationFuture> - sendNotificationFuture = service.sendNotification(pushNotification); - sendNotificationFuture.addListener(new GenericFutureListener>>() { - @Override - public void operationComplete(Future> future) throws Exception { - // When using a listener, callers should check for a failure to send a - // notification by checking whether the future itself was successful - // since an exception will not be thrown. - if (future.isSuccess()) { - final PushNotificationResponse pushNotificationResponse = - sendNotificationFuture.getNow(); - if(!pushNotificationResponse.isAccepted()) { - LOG.error("apns push failure: {}", pushNotificationResponse.getRejectionReason()); - } else { - LOG.info("push success: {}", pushNotificationResponse.getApnsId().toString()); - LOG.info("token invalidate timestamp: {}", pushNotificationResponse.getTokenInvalidationTimestamp()); - } - } else { - // Something went wrong when trying to send the notification to the - // APNs gateway. We can find the exception that caused the failure - // by getting future.cause(). - future.cause().printStackTrace(); - LOG.error("apns push failure: {}", future.cause().getLocalizedMessage()); - } + final PushNotificationFuture> sendNotificationFuture = service.sendNotification(pushNotification); + sendNotificationFuture.addListener(future -> { + // When using a listener, callers should check for a failure to send a + // notification by checking whether the future itself was successful + // since an exception will not be thrown. + if (future.isSuccess()) { + final PushNotificationResponse pushNotificationResponse = + sendNotificationFuture.getNow(); + if(!pushNotificationResponse.isAccepted()) { + LOG.error("apns push failure: {}", pushNotificationResponse.getRejectionReason()); + } else { + LOG.info("push success: {}", pushNotificationResponse.getApnsId().toString()); + LOG.info("token invalidate timestamp: {}", pushNotificationResponse.getTokenInvalidationTimestamp()); } - }); + } else { + // Something went wrong when trying to send the notification to the + // APNs gateway. We can find the exception that caused the failure + // by getting future.cause(). + future.cause().printStackTrace(); + LOG.error("apns push failure: {}", future.cause().getLocalizedMessage()); + } + }); } }