Skip to content

Commit 98977dc

Browse files
nan-licursoragent
andauthored
fix: [SDK-4814] Live Activities Confirmed Receipts exceeding Delivered count (#1681)
Co-authored-by: Cursor <cursoragent@cursor.com>
1 parent 8ca9bcc commit 98977dc

4 files changed

Lines changed: 173 additions & 111 deletions

File tree

iOS_SDK/OneSignalSDK/OneSignalLiveActivities/Source/Executors/OSLiveActivitiesExecutor.swift

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -115,11 +115,12 @@ class StartRequestCache: RequestCache {
115115
}
116116

117117
class ReceiveReceiptsRequestCache: RequestCache {
118-
// Keep receive receipts requests for up to 30 days.
119-
static let OneMonthInSeconds = TimeInterval(60 * 60 * 24 * 30)
118+
// Sent receipts are kept as dedup markers, so bound retention: an active activity re-emits for at most
119+
// ~12h on relaunch, and updates arrive over the network, so a day covers dedup and retries without piling up.
120+
static let OneDayInSeconds = TimeInterval(60 * 60 * 24)
120121

121122
init() {
122-
super.init(cacheKey: OS_LIVE_ACTIVITIES_EXECUTOR_RECEIVE_RECEIPTS_KEY, ttl: ReceiveReceiptsRequestCache.OneMonthInSeconds)
123+
super.init(cacheKey: OS_LIVE_ACTIVITIES_EXECUTOR_RECEIVE_RECEIPTS_KEY, ttl: ReceiveReceiptsRequestCache.OneDayInSeconds)
123124
}
124125
}
125126

@@ -141,10 +142,11 @@ class OSLiveActivitiesExecutor: OSPushSubscriptionObserver {
141142

142143
// The live activities request dispatch queue, serial. This synchronizes access to `updateTokens` and `startTokens`.
143144
private var requestDispatch: OSDispatchQueue
144-
private var pollIntervalSeconds = 30
145+
private var pollIntervalSeconds: Int
145146

146-
init(requestDispatch: OSDispatchQueue) {
147+
init(requestDispatch: OSDispatchQueue, pollIntervalSeconds: Int = 30) {
147148
self.requestDispatch = requestDispatch
149+
self.pollIntervalSeconds = pollIntervalSeconds
148150
}
149151

150152
func start() {
@@ -184,7 +186,7 @@ class OSLiveActivitiesExecutor: OSPushSubscriptionObserver {
184186
}
185187
}
186188

187-
private func pollPendingRequests() {
189+
func pollPendingRequests() {
188190
OneSignalLog.onesignalLog(.LL_VERBOSE, message: "OneSignal.LiveActivities pollPendingRequests")
189191

190192
self.requestDispatch.asyncAfterTime(deadline: .now() + .seconds(pollIntervalSeconds)) { [weak self] in

iOS_SDK/OneSignalSDK/OneSignalLiveActivities/Source/OneSignalLiveActivitiesManagerImpl.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -334,7 +334,7 @@ public class OneSignalLiveActivitiesManagerImpl: NSObject, OSLiveActivities {
334334
Task {
335335
for await content in activity.contentUpdates {
336336
// Don't track a live activity started / updated "in app" without a notification
337-
if let notificationId = activity.content.state.onesignal?.notificationId {
337+
if let notificationId = content.state.onesignal?.notificationId {
338338
OneSignalLiveActivitiesManagerImpl.addReceiveReceipts(notificationId: notificationId, activityType: "\(activityType)", activityId: activity.attributes.onesignal.activityId)
339339
}
340340
}

iOS_SDK/OneSignalSDK/OneSignalLiveActivities/Source/Requests/OSRequestLiveActivityReceiveReceipts.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,8 @@ class OSRequestLiveActivityReceiveReceipts: OneSignalRequest, OSLiveActivityRequ
3636
var activityType: String
3737
var activityId: String
3838
var requestSuccessful: Bool
39-
var shouldForgetWhenSuccessful: Bool = true
39+
// Kept after success so the persisted cache suppresses re-sends across relaunches.
40+
var shouldForgetWhenSuccessful: Bool = false
4041

4142
func prepareForExecution() -> Bool {
4243
guard let appId = OneSignalIdentifiers.currentAppId else {

0 commit comments

Comments
 (0)