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:
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 {