// // ActionViewController.swift // Action Extension // // Created by Jiaqi Feng on 5/22/22. // import UIKit import MobileCoreServices import UniformTypeIdentifiers class ActionViewController: UIViewController { let hostAppBundleIdentifier = "com.jiaqi.hacki" let sharedKey = "ShareKey" var sharedText: [String] = [] let urlContentType = kUTTypeURL as String @IBOutlet weak var imageView: UIImageView! override func viewDidLoad() { super.viewDidLoad() } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) if let content = extensionContext!.inputItems[0] as? NSExtensionItem { if let contents = content.attachments { for (index, attachment) in (contents).enumerated() { handleUrl(content: content, attachment: attachment, index: index) } } } } private func handleUrl (content: NSExtensionItem, attachment: NSItemProvider, index: Int) { attachment.loadItem(forTypeIdentifier: urlContentType, options: nil) { [weak self] data, error in if error == nil, let item = data as? URL, let this = self { this.sharedText.append(item.absoluteString) // If this is the last item, save imagesData in userDefaults and redirect to host app if index == (content.attachments?.count)! - 1 { let userDefaults = UserDefaults(suiteName: "group.\(this.hostAppBundleIdentifier)") userDefaults?.set(this.sharedText, forKey: this.sharedKey) userDefaults?.synchronize() print(this.sharedText) this.redirectToHostApp() } } else { self?.dismissWithError() } } } private func dismissWithError() { print("[ERROR] Error loading data!") let alert = UIAlertController(title: "Error", message: "Error loading data", preferredStyle: .alert) let action = UIAlertAction(title: "Error", style: .cancel) { _ in self.dismiss(animated: true, completion: nil) } alert.addAction(action) present(alert, animated: true, completion: nil) extensionContext!.completeRequest(returningItems: [], completionHandler: nil) } private func redirectToHostApp() { let url = URL(string: "ShareMedia://dataUrl=\(sharedKey)#text") var responder = self as UIResponder? let selectorOpenURL = sel_registerName("openURL:") while (responder != nil) { if let application = responder as? UIApplication { application.performSelector(inBackground: selectorOpenURL, with: url) } responder = responder!.next } extensionContext!.completeRequest(returningItems: [], completionHandler: nil) } @IBAction func done() { // Return any edited content to the host app. // This template doesn't do anything, so we just echo the passed in items. self.extensionContext!.completeRequest(returningItems: self.extensionContext!.inputItems, completionHandler: nil) } }