57 lines
2.0 KiB
Swift
57 lines
2.0 KiB
Swift
import SwiftUI
|
|
import Defaults
|
|
|
|
final class ShareController: ExtensionController {
|
|
override func run(_ context: NSExtensionContext) async throws -> [NSExtensionItem] {
|
|
var urls: [URL] = []
|
|
var string: String?
|
|
|
|
for attachment in context.attachments {
|
|
if attachment.hasItemConforming(to: .url) {
|
|
do {
|
|
let url = try await attachment.loadItem(ofClass: NSURL.self) as URL
|
|
if url.isFileURL {
|
|
urls.append(url)
|
|
} else {
|
|
string = url.absoluteString
|
|
}
|
|
} catch {
|
|
print("Failed to load URL: \(error)")
|
|
}
|
|
} else {
|
|
print("This attachment type are not supported yet")
|
|
}
|
|
}
|
|
|
|
if let text = context.textContent.body {
|
|
string = text
|
|
}
|
|
|
|
if urls.isEmpty && string == nil {
|
|
context.cancel()
|
|
return []
|
|
}
|
|
|
|
/// - SeeAlso: [``Shared/createBookmarkForFile(at:)``](x-source-tag://create-bookmark-func)
|
|
let bookmarks: [Data] = urls.compactMap { createBookmarkForFile(at: $0) }
|
|
|
|
// Save the file bookmarks to a shared UserDefaults
|
|
// This is Apple's recommended way to share data from App Extension to the Containing App
|
|
// See: https://developer.apple.com/library/archive/documentation/General/Conceptual/ExtensibilityPG/ExtensionScenarios.html#//apple_ref/doc/uid/TP40014214-CH21-SW6
|
|
Defaults[.pendingFiles].append(contentsOf: bookmarks)
|
|
|
|
if let string {
|
|
Defaults[.pendingStrings].append(string)
|
|
}
|
|
|
|
// Launch localsend app if it's not running
|
|
let localsendAppURL = getParentAppURL()
|
|
launchAppIfNeeded(appURL: localsendAppURL)
|
|
|
|
// Close the share extension
|
|
context.completeRequest(returningItems: [], completionHandler: nil)
|
|
|
|
return []
|
|
}
|
|
}
|