apple_kit

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

commit 38c018d3f263f07cd3f6faffdbe063b4368b669f
parent 872f5554a694fe7e4da00c1d7841785bf1ab4a4d
Author: triesap <tyson@radroots.org>
Date:   Sun, 14 Jun 2026 13:12:20 -0700

capture: harden iOS picker build

- replace internal default presenter references with public overloads
- keep UIKit presentation helpers package-internal
- resolve Photos picker callback sendability
- verify AppleKit with swift test

Diffstat:
MSources/RadrootsKit/RadrootsAppleDocumentScanner.swift | 13+++++++++++--
MSources/RadrootsKit/RadrootsAppleMediaPicker.swift | 24+++++++++++++++++++-----
2 files changed, 30 insertions(+), 7 deletions(-)

diff --git a/Sources/RadrootsKit/RadrootsAppleDocumentScanner.swift b/Sources/RadrootsKit/RadrootsAppleDocumentScanner.swift @@ -19,10 +19,19 @@ public final class RadrootsAppleDocumentScanner: RadrootsDocumentScanner, @unche #if canImport(UIKit) public init( fileAccess: RadrootsAppleFileAccess, - callbackTimeout: TimeInterval = 120, - viewControllerProvider: @escaping RadrootsAppleViewControllerProvider = { + callbackTimeout: TimeInterval = 120 + ) { + self.fileAccess = fileAccess + self.callbackTimeout = callbackTimeout + self.viewControllerProvider = { try RadrootsAppleUIKitPresentation.activeViewController(service: "document scanner") } + } + + public init( + fileAccess: RadrootsAppleFileAccess, + callbackTimeout: TimeInterval = 120, + viewControllerProvider: @escaping RadrootsAppleViewControllerProvider ) { self.fileAccess = fileAccess self.callbackTimeout = callbackTimeout diff --git a/Sources/RadrootsKit/RadrootsAppleMediaPicker.swift b/Sources/RadrootsKit/RadrootsAppleMediaPicker.swift @@ -37,10 +37,21 @@ public final class RadrootsAppleMediaPicker: RadrootsMediaPicker, @unchecked Sen public init( fileAccess: RadrootsAppleFileAccess, fileManager: FileManager = .default, - callbackTimeout: TimeInterval = 120, - viewControllerProvider: @escaping RadrootsAppleViewControllerProvider = { + callbackTimeout: TimeInterval = 120 + ) { + self.fileAccess = fileAccess + self.fileManager = fileManager + self.callbackTimeout = callbackTimeout + self.viewControllerProvider = { try RadrootsAppleUIKitPresentation.activeViewController(service: "media picker") } + } + + public init( + fileAccess: RadrootsAppleFileAccess, + fileManager: FileManager = .default, + callbackTimeout: TimeInterval = 120, + viewControllerProvider: @escaping RadrootsAppleViewControllerProvider ) { self.fileAccess = fileAccess self.fileManager = fileManager @@ -301,6 +312,9 @@ private final class RadrootsApplePhotoPickerCoordinator: NSObject, PHPickerViewC finish(.failure(.transientFailure("media import could not resolve an image file representation"))) return } + let writer = writer + let destinationScope = request.destinationScope + let mediaTypeHint = mediaTypeHint(from: provider) provider.loadFileRepresentation(forTypeIdentifier: RadrootsAppleMediaPicker.imageTypeIdentifier()) { url, error in if let error { Task { @MainActor in @@ -317,12 +331,12 @@ private final class RadrootsApplePhotoPickerCoordinator: NSObject, PHPickerViewC let result: Result<RadrootsMediaAsset, RadrootsCaptureIntakeError> do { result = .success( - try self.writer.persistExternalImage( + try writer.persistExternalImage( sourceURL: url, source: .libraryImport, - destinationScope: self.request.destinationScope, + destinationScope: destinationScope, suggestedFilename: suggestedName, - mediaTypeHint: self.mediaTypeHint(from: provider) + mediaTypeHint: mediaTypeHint ) ) } catch {