apple_kit

Apple-native services for Radroots iOS and macOS apps
git clone https://radroots.dev/git/apple_kit.git
Log | Files | Refs | README | LICENSE

commit b97ae3f40ed259af0349398708f15c4e3337b7b9
parent 4f19a57db6cd4a2c6743c6d2c7ff89d4c7c9f395
Author: triesap <tyson@radroots.org>
Date:   Wed, 17 Jun 2026 20:41:43 -0700

apple-kit: expose background session event handling

Add the background URLSession event callback to the shared background transfer contract and test fake so app runtimes can bridge iOS lifecycle events without owning transfer execution.

Diffstat:
MSources/RadrootsKit/RadrootsBackgroundTransfer.swift | 11+++++++++++
MSources/RadrootsKitTesting/RadrootsBackgroundTransferTesting.swift | 14++++++++++++++
2 files changed, 25 insertions(+), 0 deletions(-)

diff --git a/Sources/RadrootsKit/RadrootsBackgroundTransfer.swift b/Sources/RadrootsKit/RadrootsBackgroundTransfer.swift @@ -175,6 +175,10 @@ public protocol RadrootsBackgroundTransfer: Sendable { func cancel(_ identifier: RadrootsBackgroundTransferIdentifier) async throws func snapshot(for identifier: RadrootsBackgroundTransferIdentifier) async throws -> RadrootsBackgroundTransferSnapshot? func snapshots() async throws -> [RadrootsBackgroundTransferSnapshot] + func handleEventsForBackgroundURLSession( + identifier: String, + completionHandler: @escaping @Sendable () -> Void + ) async } public protocol RadrootsBackgroundTransferFileResolver: Sendable { @@ -287,6 +291,13 @@ public struct RadrootsUnavailableBackgroundTransfer: RadrootsBackgroundTransfer, public func snapshots() async throws -> [RadrootsBackgroundTransferSnapshot] { throw RadrootsBackgroundTransferError.unavailable(reason) } + + public func handleEventsForBackgroundURLSession( + identifier: String, + completionHandler: @escaping @Sendable () -> Void + ) async { + completionHandler() + } } public enum RadrootsBackgroundTransferValidation { diff --git a/Sources/RadrootsKitTesting/RadrootsBackgroundTransferTesting.swift b/Sources/RadrootsKitTesting/RadrootsBackgroundTransferTesting.swift @@ -32,6 +32,7 @@ public actor RadrootsFakeBackgroundTransfer: RadrootsBackgroundTransfer { private var enqueueOutcome: Result<Void, RadrootsBackgroundTransferError> private var enqueuedRequestsValue: [RadrootsBackgroundTransferRequest] private var cancelledIdentifiersValue: [RadrootsBackgroundTransferIdentifier] + private var handledBackgroundEventIdentifiersValue: [String] private let updatedAt: Date public init( @@ -43,6 +44,7 @@ public actor RadrootsFakeBackgroundTransfer: RadrootsBackgroundTransfer { self.enqueueOutcome = enqueueOutcome self.enqueuedRequestsValue = [] self.cancelledIdentifiersValue = [] + self.handledBackgroundEventIdentifiersValue = [] self.updatedAt = updatedAt } @@ -114,6 +116,14 @@ public actor RadrootsFakeBackgroundTransfer: RadrootsBackgroundTransfer { try await store.loadSnapshots() } + public func handleEventsForBackgroundURLSession( + identifier: String, + completionHandler: @escaping @Sendable () -> Void + ) async { + handledBackgroundEventIdentifiersValue.append(identifier) + completionHandler() + } + public var enqueuedRequests: [RadrootsBackgroundTransferRequest] { enqueuedRequestsValue } @@ -121,4 +131,8 @@ public actor RadrootsFakeBackgroundTransfer: RadrootsBackgroundTransfer { public var cancelledIdentifiers: [RadrootsBackgroundTransferIdentifier] { cancelledIdentifiersValue } + + public var handledBackgroundEventIdentifiers: [String] { + handledBackgroundEventIdentifiersValue + } }