From 13af28899fe2131a88ee06a3aa82efa892e193c9 Mon Sep 17 00:00:00 2001 From: Francesc Bruguera Date: Sat, 17 Aug 2024 23:00:16 +0200 Subject: [PATCH 1/3] Add support for starting a Live Activity with input-push-token on iOS 18 --- .../pushy/apns/util/ApnsPayloadBuilder.java | 23 +++++++++++++++++-- .../apns/util/ApnsPayloadBuilderTest.java | 9 ++++++++ 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/pushy/src/main/java/com/eatthepath/pushy/apns/util/ApnsPayloadBuilder.java b/pushy/src/main/java/com/eatthepath/pushy/apns/util/ApnsPayloadBuilder.java index 7b4083e55..ea0e8973e 100644 --- a/pushy/src/main/java/com/eatthepath/pushy/apns/util/ApnsPayloadBuilder.java +++ b/pushy/src/main/java/com/eatthepath/pushy/apns/util/ApnsPayloadBuilder.java @@ -82,6 +82,7 @@ public abstract class ApnsPayloadBuilder { private boolean preferStringRepresentationForAlerts = false; private LiveActivityEvent event = null; + private Integer inputPushToken = null; private Instant timestamp = null; @@ -131,6 +132,7 @@ public abstract class ApnsPayloadBuilder { private static final String ATTRIBUTES_TYPE_KEY = "attributes-type"; private static final String ATTRIBUTES_KEY = "attributes"; private static final String CONTENT_STATE_KEY = "content-state"; + private static final String INPUT_PUSH_TOKEN_KEY = "input-push-token"; public static final String[] EMPTY_STRING_ARRAY = new String[0]; @@ -769,7 +771,7 @@ public ApnsPayloadBuilder addCustomProperty(final String key, final Object value * * @return a reference to this payload builder * - * @see #setAttributes(Map) + * @see #setAttributes(Map) * @see * Construct the payload that starts a Live Activity * @see ActivityKit - ActivityAttributes @@ -789,7 +791,7 @@ public ApnsPayloadBuilder setAttributesType(final String attributesType) { * * @return a reference to this payload builder * - * @see #setAttributesType(String) + * @see #setAttributesType(String) * @see * Construct the payload that starts a Live Activity * @see ActivityKit - ContentState @@ -856,6 +858,19 @@ public ApnsPayloadBuilder setTimestamp(final Instant timestamp) { return this; } + /** + *

Sets the flag to wake up the app and receive a push token to send updates to the started Live Activity.

+ * + * @return a reference to this payload builder + * + * @see + * Starting and updating Live Activities with ActivityKit push notifications + */ + public ApnsPayloadBuilder setInputPushToken() { + this.inputPushToken = 1; + return this; + } + /** *

Sets a dismissal timestamp for Live Activity notifications. According to Apple's documentation:

* @@ -964,6 +979,10 @@ protected Map buildPayloadMap() { aps.put(STALE_DATE_KEY, this.staleDate.getEpochSecond()); } + if (this.inputPushToken != null) { + aps.put(INPUT_PUSH_TOKEN_KEY, this.inputPushToken); + } + final Map alert = new HashMap<>(); { if (this.alertBody != null) { diff --git a/pushy/src/test/java/com/eatthepath/pushy/apns/util/ApnsPayloadBuilderTest.java b/pushy/src/test/java/com/eatthepath/pushy/apns/util/ApnsPayloadBuilderTest.java index ff9a4815e..8aecb650f 100644 --- a/pushy/src/test/java/com/eatthepath/pushy/apns/util/ApnsPayloadBuilderTest.java +++ b/pushy/src/test/java/com/eatthepath/pushy/apns/util/ApnsPayloadBuilderTest.java @@ -726,6 +726,15 @@ void testAddContentStateProperty() { assertEquals(subMap, serializedContentState.get(keyForMapValue)); } + @Test + void setInputPushToken() { + this.builder.setInputPushToken(); + + final Map aps = this.extractApsObjectFromPayloadString(this.builder.build()); + + assertEquals(1L, aps.get("input-push-token")); + } + @SuppressWarnings("unchecked") private Map extractApsObjectFromPayloadString(final String payloadString) { final Map payload; From fff89a6c66660e4c26e09384e90553d12556828f Mon Sep 17 00:00:00 2001 From: Francesc Bruguera Date: Fri, 13 Sep 2024 15:21:55 +0200 Subject: [PATCH 2/3] Update API to allow for setting true/false --- .../eatthepath/pushy/apns/util/ApnsPayloadBuilder.java | 8 ++++---- .../pushy/apns/util/ApnsPayloadBuilderTest.java | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pushy/src/main/java/com/eatthepath/pushy/apns/util/ApnsPayloadBuilder.java b/pushy/src/main/java/com/eatthepath/pushy/apns/util/ApnsPayloadBuilder.java index ea0e8973e..57c883961 100644 --- a/pushy/src/main/java/com/eatthepath/pushy/apns/util/ApnsPayloadBuilder.java +++ b/pushy/src/main/java/com/eatthepath/pushy/apns/util/ApnsPayloadBuilder.java @@ -82,7 +82,7 @@ public abstract class ApnsPayloadBuilder { private boolean preferStringRepresentationForAlerts = false; private LiveActivityEvent event = null; - private Integer inputPushToken = null; + private Boolean inputPushToken = null; private Instant timestamp = null; @@ -866,8 +866,8 @@ public ApnsPayloadBuilder setTimestamp(final Instant timestamp) { * @see * Starting and updating Live Activities with ActivityKit push notifications */ - public ApnsPayloadBuilder setInputPushToken() { - this.inputPushToken = 1; + public ApnsPayloadBuilder setInputPushToken(final boolean inputPushToken) { + this.inputPushToken = inputPushToken; return this; } @@ -980,7 +980,7 @@ protected Map buildPayloadMap() { } if (this.inputPushToken != null) { - aps.put(INPUT_PUSH_TOKEN_KEY, this.inputPushToken); + aps.put(INPUT_PUSH_TOKEN_KEY, this.inputPushToken ? 1 : 0); } final Map alert = new HashMap<>(); diff --git a/pushy/src/test/java/com/eatthepath/pushy/apns/util/ApnsPayloadBuilderTest.java b/pushy/src/test/java/com/eatthepath/pushy/apns/util/ApnsPayloadBuilderTest.java index 8aecb650f..749dbcff4 100644 --- a/pushy/src/test/java/com/eatthepath/pushy/apns/util/ApnsPayloadBuilderTest.java +++ b/pushy/src/test/java/com/eatthepath/pushy/apns/util/ApnsPayloadBuilderTest.java @@ -728,7 +728,7 @@ void testAddContentStateProperty() { @Test void setInputPushToken() { - this.builder.setInputPushToken(); + this.builder.setInputPushToken(true); final Map aps = this.extractApsObjectFromPayloadString(this.builder.build()); From cfe4fb4f7a7ab5b8e0045ae75cc2d8750aa86ad3 Mon Sep 17 00:00:00 2001 From: Francesc Bruguera Date: Fri, 13 Sep 2024 15:28:15 +0200 Subject: [PATCH 3/3] Update javadoc --- .../eatthepath/pushy/apns/util/ApnsPayloadBuilder.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/pushy/src/main/java/com/eatthepath/pushy/apns/util/ApnsPayloadBuilder.java b/pushy/src/main/java/com/eatthepath/pushy/apns/util/ApnsPayloadBuilder.java index 57c883961..55a5158bc 100644 --- a/pushy/src/main/java/com/eatthepath/pushy/apns/util/ApnsPayloadBuilder.java +++ b/pushy/src/main/java/com/eatthepath/pushy/apns/util/ApnsPayloadBuilder.java @@ -859,8 +859,12 @@ public ApnsPayloadBuilder setTimestamp(final Instant timestamp) { } /** - *

Sets the flag to wake up the app and receive a push token to send updates to the started Live Activity.

- * + * Sets the flag to control whether the OS wakes up the app and delivers a push token to send updates to the + * started Live Activity. It is only respected in iOS 18 and later. Older versions provide a new push token + * by default. + + * @param inputPushToken Flag to decide whether the app is provided a push token to update the Live Activity + * @return a reference to this payload builder * * @see