diff --git a/ElementX.xcodeproj/project.pbxproj b/ElementX.xcodeproj/project.pbxproj index bd73a24e0..c9fca9538 100644 --- a/ElementX.xcodeproj/project.pbxproj +++ b/ElementX.xcodeproj/project.pbxproj @@ -9718,6 +9718,8 @@ PRODUCT_DISPLAY_NAME = "$(APP_DISPLAY_NAME)"; PRODUCT_NAME = ShareExtension; SDKROOT = iphoneos; + SWIFT_APPROACHABLE_CONCURRENCY = YES; + SWIFT_VERSION = 6.2; TARGETED_DEVICE_FAMILY = "1,2"; }; name = Debug; @@ -10005,6 +10007,8 @@ PRODUCT_DISPLAY_NAME = "$(APP_DISPLAY_NAME)"; PRODUCT_NAME = ShareExtension; SDKROOT = iphoneos; + SWIFT_APPROACHABLE_CONCURRENCY = YES; + SWIFT_VERSION = 6.2; TARGETED_DEVICE_FAMILY = "1,2"; }; name = Release; diff --git a/ElementX/Sources/Other/Extensions/NSItemProvider.swift b/ElementX/Sources/Other/Extensions/NSItemProvider.swift index ad81fe010..1681f5488 100644 --- a/ElementX/Sources/Other/Extensions/NSItemProvider.swift +++ b/ElementX/Sources/Other/Extensions/NSItemProvider.swift @@ -51,11 +51,6 @@ extension NSItemProvider { return nil } - guard let pngData = uiImage.pngData() else { - MXLog.error("Failed extracting PNG data out of the UIImage") - return nil - } - let filename = if let suggestedName = suggestedName as NSString?, // Suggestions are nice but their extension is `jpeg` let filename = (suggestedName.deletingPathExtension as NSString).appendingPathExtension(contentType.fileExtension) { @@ -64,14 +59,10 @@ extension NSItemProvider { "\(UUID().uuidString).\(contentType.fileExtension)" } - do { - return try FileManager.default.writeDataToTemporaryDirectory(data: pngData, - fileName: filename, - withinAppGroupContainer: withinAppGroupContainer) - } catch { - MXLog.error("Failed storing NSItemProvider data \(self) with error: \(error)") - return nil - } + return await Self.writePNGData(of: uiImage, + filename: filename, + withinAppGroupContainer: withinAppGroupContainer, + providerDescription: description) } private func generateURLForGenericData(_ contentType: PreferredContentType, withinAppGroupContainer: Bool) async -> URL? { @@ -108,12 +99,39 @@ extension NSItemProvider { "\(UUID().uuidString).\(contentType.fileExtension)" } + return await Self.writeData(shareData, + filename: filename, + withinAppGroupContainer: withinAppGroupContainer, + providerDescription: providerDescription) + } + + // The next 2 methods are static as NSItemProvider isn't Sendable. + + @concurrent private static func writePNGData(of image: UIImage, + filename: String, + withinAppGroupContainer: Bool, + providerDescription: String) async -> URL? { + guard let pngData = image.pngData() else { + MXLog.error("Failed extracting PNG data out of the UIImage") + return nil + } + + return await writeData(pngData, + filename: filename, + withinAppGroupContainer: withinAppGroupContainer, + providerDescription: providerDescription) + } + + @concurrent private static func writeData(_ data: Data, + filename: String, + withinAppGroupContainer: Bool, + providerDescription: String) async -> URL? { do { - return try FileManager.default.writeDataToTemporaryDirectory(data: shareData, + return try FileManager.default.writeDataToTemporaryDirectory(data: data, fileName: filename, withinAppGroupContainer: withinAppGroupContainer) } catch { - MXLog.error("Failed storing NSItemProvider data \(self) with error: \(error)") + MXLog.error("Failed storing NSItemProvider data \(providerDescription) with error: \(error)") return nil } } diff --git a/ShareExtension/SupportingFiles/target.yml b/ShareExtension/SupportingFiles/target.yml index 6eba6721f..59041f395 100644 --- a/ShareExtension/SupportingFiles/target.yml +++ b/ShareExtension/SupportingFiles/target.yml @@ -75,6 +75,8 @@ targets: MARKETING_VERSION: $(MARKETING_VERSION) CURRENT_PROJECT_VERSION: $(CURRENT_PROJECT_VERSION) DEVELOPMENT_TEAM: $(DEVELOPMENT_TEAM) + SWIFT_VERSION: 6.2 + SWIFT_APPROACHABLE_CONCURRENCY: YES sources: - path: ../Sources