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>

0 ответов

Другие вопросы по тегам