Skip to content

Commit 2bfef20

Browse files
committed
Handle images from URLs
1 parent 95522d0 commit 2bfef20

File tree

5 files changed

+41
-9
lines changed

5 files changed

+41
-9
lines changed

Modules/ShareContents/Sources/Extensions/NSItemProviderExtensions.swift

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,12 @@ import Foundation
55
import UniformTypeIdentifiers
66

77
extension NSItemProvider {
8+
func contains(_ uniformType: UTType) -> Bool {
9+
return registeredContentTypes.contains {
10+
$0.conforms(to: uniformType)
11+
}
12+
}
13+
814
@MainActor func loadData(for uniformType: UTType) async throws -> Data {
915
return try await withCheckedThrowingContinuation { continuation in
1016
_ = loadDataRepresentation(for: uniformType) { data, error in
@@ -18,4 +24,18 @@ extension NSItemProvider {
1824
}
1925
}
2026
}
27+
28+
@MainActor func loadItem<ItemClass: NSItemProviderReading & Sendable>(for uniformType: UTType) async throws -> ItemClass {
29+
return try await withCheckedThrowingContinuation { continuation in
30+
_ = loadObject(ofClass: ItemClass.self) { maybeItem, error in
31+
if let item = maybeItem as? ItemClass {
32+
continuation.resume(returning: item)
33+
} else if let error {
34+
continuation.resume(throwing: error)
35+
} else {
36+
continuation.resume(throwing: ShareError.cannotLoadData)
37+
}
38+
}
39+
}
40+
}
2141
}

Modules/ShareContents/Sources/MobileExtensionInputHandler.swift

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -43,19 +43,29 @@ import BarcPurchasing
4343
throw ShareError.noInputProviders
4444
}
4545

46-
let imageProviders = inputProviders.filter { inputProvider in
47-
inputProvider.registeredContentTypes.contains { type in
48-
type.conforms(to: .image)
49-
}
50-
}
51-
guard let imageProvider = imageProviders.first else {
46+
guard let imageProvider = inputProviders.first(where: { inputProvider in
47+
inputProvider.contains(.image) || inputProvider.contains(.url)
48+
}) else {
5249
throw ShareError.noImageProviders
5350
}
5451

55-
let data = try await imageProvider.loadData(for: .image)
56-
let cgImage = try CGImage.image(from: data)
52+
let cgImage = try await loadImage(from: imageProvider)
5753
guard let codeValue = try await imageReader.codeValue(in: cgImage) else { throw ShareError.noCodeInImage }
5854
return codeValue
5955
}
56+
57+
private func loadImage(from imageProvider: NSItemProvider) async throws -> CGImage {
58+
let data: Data
59+
if imageProvider.contains(.image) {
60+
data = try await imageProvider.loadData(for: .image)
61+
} else if imageProvider.contains(.url) {
62+
let url: NSURL = try await imageProvider.loadItem(for: .url)
63+
(data, _) = try await URLSession.shared.data(from: url as URL)
64+
} else {
65+
throw ShareError.unexpectedContentType
66+
}
67+
68+
return try CGImage.image(from: data)
69+
}
6070
}
6171
#endif

Modules/ShareContents/Sources/ShareError.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,5 +11,6 @@ enum ShareError: Error {
1111
case noImageProviders
1212
case noInputProviders
1313
case notImplementedOnPlatform
14+
case unexpectedContentType
1415
case userIsNotUnleashed
1516
}

Modules/WidgetContents/Sources/CodeDisplayView.swift

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@ struct CodeDisplayView: View {
3232

3333
@ViewBuilder
3434
private var codeShape: some View {
35-
let _ = print("code \(code.name) has value: \(String(describing: code.value))")
3635
switch code.value {
3736
case .code128, .code39, .codabar, .ean:
3837
BarcodeShape()

Products/Share/Info.plist

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@
2020
<dict>
2121
<key>NSExtensionActivationRule</key>
2222
<dict>
23+
<key>NSExtensionActivationSupportsWebURLWithMaxCount</key>
24+
<integer>1</integer>
2325
<key>NSExtensionActivationSupportsImageWithMaxCount</key>
2426
<integer>1</integer>
2527
</dict>

0 commit comments

Comments
 (0)