iOS Share Extension - извлекать изображения из URL
Я нахожусь в процессе создания расширения общего ресурса, которое принимает что-либо в качестве URL-адреса, например веб-страницу Safari или другое приложение с общим URL-адресом (например, Coursera)
Я хочу попробовать связать изображение с URL-адресом, если это вообще возможно, даже если приложение для совместного использования явно не отображает изображение в качестве одного из его типов общего ресурса.
если я возьму статью от Coursera в качестве примера, а затем использую Pinterest, чтобы поделиться изображениями, загружаются довольно быстро. Поскольку это родное приложение Coursera, я заметил, что они делятся текстом и URL.
Чтобы попытаться получить изображения для этого, мне нужно найти провайдера типа public.url, затем загрузить этот URL в WKWebView и назначить scriptHandler. Дождитесь завершения навигации по URL. Затем оцените строку javascript, которая извлекает изображения и вызывает postMessage в моем обработчике сценариев с этими значениями (я также попытался просто вернуть значения из valuJavascriptString). Это делает мое расширение очень медленным. например
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
}
Затем, наконец, мне нужно создать объект Data из этих 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-адрес.
Есть ли лучший способ оптимизировать это?
В моем списке разрешенных элементов было указано следующее - мне интересно, понадобится ли для этого пользовательский предикат
<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>