I'm exporting CSV sheets from my CoreData entities, creating comma separated Strings, and appending them to exporting functions like this:
func dataExport(data: Student) -> [Any] {
let exportFilePath = NSTemporaryDirectory() + "student tutorships.csv"
let exportFileURL = URL(fileURLWithPath: exportFilePath)
FileManager.default.createFile(atPath: exportFilePath, contents: Data(), attributes: nil)
let fileHandle: FileHandle?
do {
fileHandle = try FileHandle(forWritingTo: exportFileURL)
} catch let error as NSError {
print("Error writing exporting file: \(error)")
fileHandle = nil
}
if let fileHandle = fileHandle {
let headers = "Date, Attendees, Topics, Conclussions\r\n"
let headersData = headers.data(using: .utf8, allowLossyConversion: false)!
fileHandle.write(headersData)
fileHandle.seekToEndOfFile()
//csvStudentTutorship is the creating-CSV function.
guard let csvData = data.csvStudentTutorships().data(using: .utf8, allowLossyConversion: false) else { return [] }
fileHandle.write(csvData)
fileHandle.closeFile()
let document = NSURL(fileURLWithPath: exportFilePath)
let fileToShare = [document]
return fileToShare
}
return []
}
This way, I get and array of type NSURL as output to be shared:
let fileToShare: [NSURL]
For sharing sheet to be presented in SwiftUI, I use an ActivityViewController with UIViewControllerRepresentable protocol:
import UIKit
import SwiftUI
struct ActivityViewController: UIViewControllerRepresentable {
var activityItems: [Any]
var applicationActivities: [UIActivity]? = nil
func makeUIViewController(context: UIViewControllerRepresentableContext<ActivityViewController>) -> UIActivityViewController {
let controller = UIActivityViewController(activityItems: activityItems, applicationActivities: applicationActivities)
return controller
}
func updateUIViewController(_ uiViewController: UIActivityViewController, context: Context) {
}
}
And I call an instance from my view with
.sheet(isPresented: $showingSharing) {
ActivityViewController(activityItems: studentTutorshipsExport(data: student), applicationActivities: nil)
}
All that is working correctly (many console messages, but working).
Now, I'm trying to get my app logo and the description of the sharing file with activityViewControllerLinkMetadata as described here: https://stackoverflow.com/questions/63886792/how-to-attach-an-image-icon-to-the-uiactivityviewcontroller and here https://developer.apple.com/documentation/uikit/uiactivityitemsource/3144571-activityviewcontrollerlinkmetada?language=swift.
But I can't make it work. If I pass the icon image from my origin view as "activityItems" parameter , only image appears, but I loose sharing document itself. I'm not sure if this is correct in SwiftUI. Any further ideas?