Skip to content

Commit 1c40307

Browse files
authored
Merge branch 'main' into main
2 parents fc6ff07 + 813ab2c commit 1c40307

File tree

3 files changed

+38
-2
lines changed

3 files changed

+38
-2
lines changed

Sources/APNSCore/LiveActivity/APNSLiveActivityNotification.swift

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@ public struct APNSLiveActivityNotification<ContentState: Encodable & Sendable>:
104104
/// - timestamp: Timestamp when sending notification
105105
/// - dismissalDate: Timestamp when to dismiss live notification when sent with `end`, if in the past
106106
/// dismiss immediately
107+
/// - staleDate: Timestamp when the notification is marked as stale
107108
public init(
108109
expiration: APNSNotificationExpiration,
109110
priority: APNSPriority,
@@ -113,17 +114,20 @@ public struct APNSLiveActivityNotification<ContentState: Encodable & Sendable>:
113114
alert: APNSAlertNotificationContent? = nil,
114115
timestamp: Int,
115116
dismissalDate: APNSLiveActivityDismissalDate = .none,
117+
staleDate: Int? = nil,
116118
apnsID: UUID? = nil
117119
) {
118120
self.init(
119121
expiration: expiration,
120122
priority: priority,
121123
topic: appID + ".push-type.liveactivity",
124+
apnsID: apnsID,
122125
contentState: contentState,
123126
event: event,
124127
alert: alert,
125128
timestamp: timestamp,
126-
dismissalDate: dismissalDate
129+
dismissalDate: dismissalDate,
130+
staleDate: staleDate
127131
)
128132
}
129133

@@ -143,6 +147,7 @@ public struct APNSLiveActivityNotification<ContentState: Encodable & Sendable>:
143147
/// - timestamp: Timestamp when sending notification
144148
/// - dismissalDate: Timestamp when to dismiss live notification when sent with `end`, if in the past
145149
/// dismiss immediately
150+
/// - staleDate: Timestamp when the notification is marked as stale
146151
public init(
147152
expiration: APNSNotificationExpiration,
148153
priority: APNSPriority,
@@ -152,13 +157,15 @@ public struct APNSLiveActivityNotification<ContentState: Encodable & Sendable>:
152157
event: APNSLiveActivityNotificationEvent,
153158
alert: APNSAlertNotificationContent? = nil,
154159
timestamp: Int,
155-
dismissalDate: APNSLiveActivityDismissalDate = .none
160+
dismissalDate: APNSLiveActivityDismissalDate = .none,
161+
staleDate: Int? = nil
156162
) {
157163
self.aps = APNSLiveActivityNotificationAPSStorage(
158164
timestamp: timestamp,
159165
event: event.rawValue,
160166
contentState: contentState,
161167
dismissalDate: dismissalDate.dismissal,
168+
staleDate: staleDate,
162169
alert: alert
163170
)
164171
self.apnsID = apnsID

Sources/APNSCore/LiveActivity/APNSLiveActivityNotificationAPSStorage.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,25 +18,29 @@ struct APNSLiveActivityNotificationAPSStorage<ContentState: Encodable & Sendable
1818
case event = "event"
1919
case contentState = "content-state"
2020
case dismissalDate = "dismissal-date"
21+
case staleDate = "stale-date"
2122
case alert = "alert"
2223
}
2324

2425
var timestamp: Int
2526
var event: String
2627
var contentState: ContentState
2728
var dismissalDate: Int?
29+
var staleDate: Int?
2830
var alert: APNSAlertNotificationContent?
2931

3032
init(
3133
timestamp: Int,
3234
event: String,
3335
contentState: ContentState,
3436
dismissalDate: Int?,
37+
staleDate: Int?,
3538
alert: APNSAlertNotificationContent? = nil
3639
) {
3740
self.timestamp = timestamp
3841
self.contentState = contentState
3942
self.dismissalDate = dismissalDate
43+
self.staleDate = staleDate
4044
self.event = event
4145
self.alert = alert
4246
}

Tests/APNSTests/LiveActivity/APNSLiveActivityNotificationTests.swift

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,31 @@ final class APNSLiveActivityNotificationTests: XCTestCase {
4949
XCTAssertEqual(jsonObject1, jsonObject2)
5050
}
5151

52+
func testEncodeUpdateStale() throws {
53+
let notification = APNSLiveActivityNotification(
54+
expiration: .immediately,
55+
priority: .immediately,
56+
appID: "test.app.id",
57+
contentState: State(),
58+
event: .update,
59+
timestamp: 1_672_680_658,
60+
staleDate: 1_672_680_800)
61+
62+
let encoder = JSONEncoder()
63+
let data = try encoder.encode(notification)
64+
65+
let expectedJSONString = """
66+
{"aps":{"event":"update","content-state":{"string":"Test","number":123},"timestamp":1672680658,
67+
"stale-date":1672680800}}
68+
"""
69+
70+
let jsonObject1 = try JSONSerialization.jsonObject(with: data) as! NSDictionary
71+
let jsonObject2 =
72+
try JSONSerialization.jsonObject(with: expectedJSONString.data(using: .utf8)!)
73+
as! NSDictionary
74+
XCTAssertEqual(jsonObject1, jsonObject2)
75+
}
76+
5277
func testEncodeUpdateAlert() throws {
5378
let notification = APNSLiveActivityNotification(
5479
expiration: .immediately,

0 commit comments

Comments
 (0)