从Share Extension启动应用到特定的ViewController

问题描述

我的应用程序是关于图像编辑的,一旦从主图标启动,就会出现主屏幕(由ViewController.swift控制)。在这里,您有一个直接将您带到图库的按钮,选择了图像后,预览屏幕将显示为受PreviewViewController.swift控制。

好吧,现在我正在尝试实现共享扩展,以便将图像直接从图库发送到预览屏幕,但是到目前为止,我只在主屏幕中打开了主机应用程序...

ShareViewController.swift就像:

import UIKit
import MobileCoreServices

@objc(ShareViewController)
class ShareViewController: UIViewController {
        
    override func viewDidLoad() {
    super.viewDidLoad()
    
    self.handleSharedFile()
  }
    private func handleSharedFile() {
        let attachments = (self.extensionContext?.inputItems.first as? NSExtensionItem)?.attachments ?? []
        let contentType = kUTTypeData as String
        for provider in attachments {
            if provider.hasItemConformingToTypeIdentifier(contentType) {
                provider.loadItem(forTypeIdentifier: contentType,options: nil) { [uNowned self] (data,error) in
                    guard error == nil else { return }
               
                    if let url = data as? URL,let imageData = try? Data(contentsOf: url) {
                        let image = UIImage(data: imageData)
                        if let orientedImage = image?.updateImageOrientionUpSide() {
                            self.saveImageDocDirectory(image: orientedImage,imageName: "pickedImg.jpeg")
                        } else {
                            self.saveImageDocDirectory(image: UIImage(data: imageData)!,imageName: "pickedImg.jpeg")
                        }
                        
                        let url = URL(string: "ImagePickerFromSharing://ImageSharePhotoKey")
                        var responder = self as UIResponder?
                        let selectorOpenURL = sel_registerName("openURL:")
                        
                        while (responder != nil) {
                            if (responder?.responds(to: selectorOpenURL))! {
                                let _ = responder?.perform(selectorOpenURL,with: url)
                            }
                            responder = responder!.next
                        }
                        self.extensionContext!.completeRequest(returningItems: [],completionHandler: nil)
                    } else {
                        fatalError("Impossible to save image")
                    }
                }}
        }
    }
    
    func saveImageDocDirectory(image: UIImage,imageName: String) {
        let fileManager = FileManager.default
        let path = (NSSearchPathForDirectoriesInDomains(.documentDirectory,.userDomainMask,true)[0] as Nsstring).appendingPathComponent("tempImages")
        if !fileManager.fileExists(atPath: path) {
            try! fileManager.createDirectory(atPath: path,withIntermediateDirectories: true,attributes: nil)
        }
        let url = NSURL (string: path)
        let imagePath = url!.appendingPathComponent(imageName)
        let urlString: String = imagePath!.absoluteString
        let imageData = image.jpegData(compressionQuality: 1)
        fileManager.createFile(atPath: urlString,contents: imageData,attributes: nil)
    }
}

extension UIImage {
    //Extensión para evitar se roten las imágenes verticales al guardarse
    func updateImageOrientionUpSide() -> UIImage? {
        if self.imageOrientation == .up {
            return self
        }
        UIGraphicsBeginImageContextWithOptions(self.size,false,self.scale)
        self.draw(in: CGRect(x: 0,y: 0,width: self.size.width,height: self.size.height))
        if let normalizedImage:UIImage = UIGraphicsGetimageFromCurrentimageContext() {
            UIGraphicsEndImageContext()
            return normalizedImage
        }
        UIGraphicsEndImageContext()
        return nil
    }
}

然后在AppDelegate.swift中:

func application(
        _ app: UIApplication,open url: URL,options: [UIApplication.OpenURLOptionsKey : Any] = [:]
    ) -> Bool {

        ApplicationDelegate.shared.application(
            app,open: url,sourceApplication: options[UIApplication.OpenURLOptionsKey.sourceApplication] as? String,annotation: options[UIApplication.OpenURLOptionsKey.annotation]
        )
        
        if url.scheme == "ImagePickerFromSharing" {
            if url.host == "ImageSharePhotoKey" {
                    self.window = UIWindow(frame: UIScreen.main.bounds)
                    let storyboard = UIStoryboard(name: "Main",bundle: nil)
                    let vc = storyboard.instantiateViewController(withIdentifier: "previewViewController") as! ViewController
                    self.window?.rootViewController = vc
                    self.window?.makeKeyAndVisible()
            }
        }
        
        return true
    }

有人知道我要去哪里吗?

提前谢谢!

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)