import MobileCoreServices import Social import UniformTypeIdentifiers import UIKit private let schemePrefix = "ShareMedia" private let userDefaultsKey = "ShareKey" private let userDefaultsMessageKey = "ShareMessageKey" private let appGroupIdKey = "AppGroupId" private struct SharedMediaFile: Codable { let path: String let mimeType: String? let thumbnail: String? let duration: Double? let message: String? let type: SharedMediaType } private enum SharedMediaType: String, Codable, CaseIterable { case image case video case text case file case url var typeIdentifier: String { if #available(iOS 14.0, *) { switch self { case .image: return UTType.image.identifier case .video: return UTType.movie.identifier case .text: return UTType.text.identifier case .file: return UTType.fileURL.identifier case .url: return UTType.url.identifier } } switch self { case .image: return kUTTypeImage as String case .video: return kUTTypeMovie as String case .text: return kUTTypeText as String case .file: return kUTTypeFileURL as String case .url: return kUTTypeURL as String } } } final class ShareViewController: SLComposeServiceViewController { private var hostAppBundleIdentifier = "" private var appGroupId = "" private var sharedMedia: [SharedMediaFile] = [] private let group = DispatchGroup() private var didFinishLoadingAttachments = false override func viewDidLoad() { super.viewDidLoad() loadIdentifiers() } override func isContentValid() -> Bool { true } override func didSelectPost() { appendContentTextIfNeeded() saveAndRedirect(message: contentText) } override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) guard !didFinishLoadingAttachments else { return } didFinishLoadingAttachments = true loadAttachments() } override func configurationItems() -> [Any]! { [] } private func loadIdentifiers() { let shareExtensionIdentifier = Bundle.main.bundleIdentifier ?? "" if let lastDotIndex = shareExtensionIdentifier.lastIndex(of: ".") { hostAppBundleIdentifier = String(shareExtensionIdentifier[..