iOS Share Extension - 从url中提取图像

时间:2017-04-06 21:38:51

标签: ios swift ios-extensions

我正在建立一个共享扩展程序,接受任何内容作为URL,例如Safari网页或其他共享URL的应用程序(例如Coursera)

我想尽可能尝试将图片与网址相关联,即使共享应用没有明确地将图片公开为其中一种共享类型。

如果我以Coursera中的文章为例,然后使用Pinterest快速分享图像加载。由于这是Coursera的原生应用程序,我注意到他们共享文本和网址。

为了尝试抓取图像,我必须找到public.url类型的提供程序,然后将此url加载到WKWebView并分配scriptHandler。等待网址的导航完成。然后评估一个提取图像的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创建一个Data对象,并从数据中实例化一个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中设置为以下内容 - 我想知道这是否需要自定义谓词

  <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>

0 个答案:

没有答案