我正在建立一个共享扩展程序,接受任何内容作为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>