Fix share sheet extension not working with Apple News

Closes #375
This commit is contained in:
Shadowfacts 2023-05-12 22:00:00 -04:00
parent 2d8e2f0824
commit a9a9bfebeb
2 changed files with 34 additions and 25 deletions

View File

@ -8,6 +8,8 @@
<dict> <dict>
<key>NSExtensionActivationRule</key> <key>NSExtensionActivationRule</key>
<dict> <dict>
<key>NSExtensionActivationSupportsText</key>
<true/>
<key>NSExtensionActivationSupportsImageWithMaxCount</key> <key>NSExtensionActivationSupportsImageWithMaxCount</key>
<integer>4</integer> <integer>4</integer>
<key>NSExtensionActivationSupportsMovieWithMaxCount</key> <key>NSExtensionActivationSupportsMovieWithMaxCount</key>

View File

@ -71,36 +71,43 @@ class ShareViewController: UIViewController {
private func getDraftConfigurationFromExtensionContext() async -> (String, [DraftAttachment]) { private func getDraftConfigurationFromExtensionContext() async -> (String, [DraftAttachment]) {
guard let extensionContext, guard let extensionContext,
let inputItem = (extensionContext.inputItems as? [NSExtensionItem])?.first, let inputItem = (extensionContext.inputItems as? [NSExtensionItem])?.first else {
let itemProvider = inputItem.attachments?.first else {
return ("", []) return ("", [])
} }
if let url: NSURL = await getObject(from: itemProvider) { var text: String = ""
if let title = inputItem.attributedTitle ?? inputItem.attributedContentText { var url: URL?
return ("\n\n\(title.string)\n\(url.absoluteString ?? "")", []) var attachments: [DraftAttachment] = []
} else {
return ("\n\n\(url.absoluteString ?? "")", [])
}
} else if let text: NSString = await getObject(from: itemProvider) {
return ("\n\n\(text)", [])
} else if let attributedContent = inputItem.attributedContentText {
return ("\n\n\(attributedContent.string)", [])
} else {
let attachments = await withTaskGroup(of: DraftAttachment?.self, returning: [DraftAttachment].self) { group in
for provider in inputItem.attachments! {
group.addTask { @MainActor in
await self.getObject(from: provider)
}
}
return await group.reduce(into: [], { partialResult, result in for itemProvider in inputItem.attachments ?? [] {
if let result { if let attached: NSURL = await getObject(from: itemProvider) {
partialResult.append(result) if url == nil {
} url = attached as URL
}) }
} else if let s: NSString = await getObject(from: itemProvider) {
if text.isEmpty {
text = s as String
}
} else if let attachment: DraftAttachment = await getObject(from: itemProvider) {
attachments.append(attachment)
} }
return ("", attachments)
} }
if text.isEmpty,
let s = inputItem.attributedTitle ?? inputItem.attributedContentText {
text = s.string
}
if let url {
if !text.isEmpty {
text += "\n"
}
text += url.absoluteString
}
if !text.isEmpty {
text = "\n\n\(text)"
}
return (text, attachments)
} }
private func getObject<T: NSItemProviderReading>(from itemProvider: NSItemProvider) async -> T? { private func getObject<T: NSItemProviderReading>(from itemProvider: NSItemProvider) async -> T? {