iOS共享扩展-从url提取图像

iOS共享扩展-从url提取图像,ios,swift,ios-extensions,Ios,Swift,Ios Extensions,我正在构建一个共享扩展,它可以接受任何东西作为URL,例如Safari网页或其他共享URL的应用程序(例如Coursera) 如果可能的话,我想尝试将图像与URL关联,即使共享应用程序没有明确地将图像公开为其共享类型之一 如果我以Coursera的一篇文章为例,然后使用Pinterest快速共享图片加载。由于这是Coursera的原生应用程序,我注意到它们共享文本和url 为了尝试获取此图像,我必须找到public.url类型的提供程序,然后将此url加载到WKWebView并分配scriptH

我正在构建一个共享扩展,它可以接受任何东西作为URL,例如Safari网页或其他共享URL的应用程序(例如Coursera)

如果可能的话,我想尝试将图像与URL关联,即使共享应用程序没有明确地将图像公开为其共享类型之一

如果我以Coursera的一篇文章为例,然后使用Pinterest快速共享图片加载。由于这是Coursera的原生应用程序,我注意到它们共享文本和url

为了尝试获取此图像,我必须找到public.url类型的提供程序,然后将此url加载到WKWebView并分配scriptHandler。等待url的导航完成。然后计算一个javascript字符串,该字符串提取图像并使用这些值调用脚本处理程序上的postMessage(我还尝试从evaluateJavascriptString返回值)。这使我的分机看起来很慢。e、 g

let provider = urlProvider as! NSItemProvider // 

        provider.loadItem(forTypeIdentifier: kUTTypeURL as String, options: nil) { (item, error) in

           if let url = item as? NSURL {

                let contentController = WKUserContentController()

                contentController.add(self, name: ScriptNames.GetImage.rawValue)
                let config = WKWebViewConfiguration()
                config.userContentController = contentController
                self.wv = WKWebView(frame: CGRect(x:0,y:0,width:0,height:0), configuration: config)
                self.wv?.navigationDelegate = self
                let req = URLRequest(url: url as URL)
                self.wv?.load(req)
                }
        }

   func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
        webView.evaluateJavaScript(jsString, completionHandler: { (result, error) in
       //check for error other wise result actually calls userContentController
  })


    func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
//get returned image urls
}
最后,我必须从这些URL创建一个数据对象,并从数据实例化一个UIImage,然后将其显示回collectionView单元格中

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! Cell
    let src:String = data[indexPath.row]
    print(src)
    cell.backgroundColor = .red
    DispatchQueue.global().async {

        let url = URL(string: src)
        let imgdata = try!  Data(contentsOf: url!)
        DispatchQueue.main.async {
            cell.imageView.image = UIImage(data: imgdata)
        }

    }
    return cell
}
我知道这里的数据调用可以使用许多框架中的一个进行缓存,但Pinterest的性能似乎仍然要慢得多。我想知道他们是否真的将URL传递到自己的服务器端,并在那里执行任何检索图像的功能

我研究过使用NSExtensionJavaScriptPreprocessingFile,但它似乎只在Safari中运行,而不在共享url的本机应用程序中运行

有没有更好的方法来优化这一点

在我的plist中,我的allowed items已设置为以下值-我想知道这是否需要一个自定义谓词

  <key>NSExtensionActivationRule</key>
        <dict>
            <key>NSExtensionActivationSupportsWebURLWithMaxCount</key>
            <integer>1</integer>
            <key>NSExtensionActivationSupportsWebPageWithMaxCount</key>
            <integer>1</integer>
            <key>NSExtensionActivationSupportsImageWithMaxCount</key>
            <integer>1</integer>
            <key>NSExtensionActivationSupportsText</key>
            <integer>1</integer>
        </dict>
NSExtensionActivationRule
NSExtensionActivationSupportsWebUrWithMaxCount
1.
NSExtensionActivationSupportsWebPageWithMaxCount
1.
NSExtensionActivationSupportsImageWithMaxCount
1.
NSExtensionActivationSupportsText
1.

你现在用
开始三段,我不明白你的问题。你是说你的扩展工作正常,但是太慢了?多慢?一般来说,如果您正在同步下载媒体内容(如任何
UIImage
),可能是(您没有发布此部分的代码),那么下载速度会很慢。异步加载媒体(请参见
GCD
ie.
DispatchQueue.global.async{
因此,我添加了用于加载图像的代码,最初我不是异步加载的,虽然这提高了性能,但在检索这些图像时,它仍然比Pinterest应用程序慢3-4秒images@TommyBs,这是怎么解决的-你找到更快的方法了吗谢谢这个?我最后写了我自己的我们b获取url并查找图像并将其返回到我的应用程序的服务您现在用
开始三段,我不理解您的问题。您是说您的扩展工作正常,但太慢了吗?有多慢?通常,如果您同步下载媒体内容(如任何
UIImage
),您可能会这样做(您没有发布此部分的代码),则速度会很慢。异步加载媒体(请参阅
GCD
ie.
DispatchQueue.global.async){
因此,我添加了用于加载图像的代码,最初我不是异步加载的,虽然这提高了性能,但在检索这些图像时,它仍然比Pinterest应用程序慢3-4秒images@TommyBs,这是怎么解决的-你找到更快的方法了吗谢谢这个?我最后写了我自己的我们b获取url并查找图像并将其返回到我的应用程序的服务