-3
votes

Comment charger un fichier CSS dans Bundle pour une URL spécifiée dans WKWebView?

J'ai un wkwebview . La page Web charge la plupart de son fichier CSS de CDN. Mais, il y a ce grand fichier CSS fréquemment utilisé que je voudrais le mettre dans l'ensemble de l'application afin que WebView charge plus rapidement. Est-ce que quelqu'un sait comment charger de paquet?

Un exemple simple. Une page Web doit charger un fichier sur https://cdn.example.com/style.css . Au lieu de le charger des serveurs de fichiers, je souhaite rediriger la demande ( https://cdn.example.com/style.css ) afin qu'il puisse répondre au contenu styles.css. dans le paquet ou même du cache de disque.

Je ne veux pas insérer le fichier CSS. Je veux rediriger certaines fichiers CSS à mon URL de fichier local à la place.

Une version Swift sera géniale.

merci.


8 commentaires

Dupliqué possible de Insérez CSS dans HTML chargé dans UIWebView / WKWebView


pas ce que je veux


Bonjour Pouvez-vous ajouter un fichier CSS à l'aide de URL Link


@Jaywantkhedkar non, c'est trop délicat ainsi fragile alors j'ai abandonné.


Je suis la même approche mais non trouvé de solution, c'est du travail lorsque nous ajoutons un fichier CSS en paquet et l'accédez comme, laissez path = bundle.main.path (Forresource: "style", de "CSS")


@Jaywantkhedkar Si vous réussissez enfin à trouver une bonne solution, veuillez la collecter dans ce fil. Merci.


@ 0xa6a, oui sûr, je vais partager avec vous,


@ 0xa6a, enfin je craque, je n'abandonnai jamais, j'ai ajouté la réponse détaillée, s'il vous plaît laissez-moi savoir que cela fonctionne pour vous, si c'est le travail, veuillez accepter la réponse, cela aidera également à d'autres.


3 Réponses :


0
votes

Créer un fichier style.css comme ci-dessous et faites glisser-déposer dans votre répertoire de projet xxx pré>

Ajouter le code source ci-dessous dans la vue UIViewController () P>

  lazy var webView: WKWebView = {
    guard
      let path = Bundle.main.path(forResource: "style", ofType: "css"),
      let cssString = try? String(contentsOfFile: path).components(separatedBy: .newlines).joined()
      else {
        return WKWebView()
    }

    let source = """
    var style = document.createElement('style');
    style.innerHTML = '\(cssString)';
    document.head.appendChild(style);
    """

    let userScript = WKUserScript(source: source,
                                  injectionTime: .atDocumentEnd,
                                  forMainFrameOnly: true)

    let userContentController = WKUserContentController()
    userContentController.addUserScript(userScript)

    let configuration = WKWebViewConfiguration()
    configuration.userContentController = userContentController

    let webView = WKWebView(frame: self.view.frame,
                            configuration: configuration)
    return webView
  }()


0 commentaires

0
votes

Vous pouvez précharger votre code HTML à une chaîne, injecter le contenu de votre CSS local à l'intérieur de certaines balises de style et indiquez enfin que la chaîne modifiée dans votre WKWebView.

ci-dessous, vous verrez une solution de travail, vous devez juste avoir besoin de Faites glisser un fichier appelé inject.css à l'intérieur de votre projet. Ce fichier contient le style que vous souhaitez appliquer. P>

Assurez-vous que vous avez une WKWebView appelée WebView et un bouton connecté aux points de vente pour effectuer les travaux de solution suivants (cette solution nécessite probablement un refactoring): P>

import UIKit
import WebKit

class ViewController: UIViewController {
  @IBOutlet weak var webView: WKWebView!

  @IBAction func loadStuffTapped(_ sender: Any) {

    injectCssAndShow(url: "https://www.wikipedia.org/")

  }

  // this one loads the css from your bundle
  func loadCss()->String? {
    if let filepath = Bundle.main.path(forResource: "inject", ofType: "css") {
      do {
        let contents = try String(contentsOfFile: filepath)
        print(contents)
        return contents
      } catch {
        // contents could not be loaded
      }
    } else {
      // inject.css not found!
    }
    return nil
  }

// this (kind of bloated...) function loads the orignal html, injects your css and shows the modified version inside of your WKWebview
  func injectCssAndShow(url: String) {

    let request = NSMutableURLRequest(url: NSURL(string: url)! as URL,
                                      cachePolicy: .useProtocolCachePolicy,
                                      timeoutInterval: 10.0)
    request.httpMethod = "GET"

    let session = URLSession.shared
    let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
      if (error != nil) {
        print(error as Any)
      } else {
        let htmlString = String(decoding: data ?? Data(), as: UTF8.self)

        DispatchQueue.main.async {

          let result = htmlString.range(of: "<title>",
                                        options: NSString.CompareOptions.literal,
                                        range: htmlString.startIndex..<htmlString.endIndex,
                                        locale: nil)

          if let range = result {
            let start = range.lowerBound
            let injection = self.loadCss() ?? ""
            let modifiedHtml = "\(htmlString[htmlString.startIndex..<start]) <style>\(injection)</style> \(htmlString[start..<htmlString.endIndex])"
            self.webView.loadHTMLString(modifiedHtml, baseURL: URL.init(string: url))
          }
        }
      }
    })

    dataTask.resume()

  }
}


0 commentaires

1
votes

J'ai le même problème, luttez-vous beaucoup à résoudre le problème, de trouver enfin une solution et cela a fonctionné comme un charme! Pour moi,

Je veux appliquer CSS à l'aide de l'URL à l'aide de l'adresse de fichier CSS de l'URL, P>

suivez les étapes, strong> p>

  1. Donnez votre lien de fichier CSS Laisser par exemple, P> XXX PRE> LI> ol>

    2.Change JavaScript strong> code d'injection style fort> à link strong> Comme ci-dessous code, P>

           let userScript = WKUserScript(source: source,
                                          injectionTime: .atDocumentEnd,
                                          forMainFrameOnly: true)
    
            let userContentController = WKUserContentController()
            userContentController.addUserScript(userScript)
    
            let configuration = WKWebViewConfiguration()
            configuration.userContentController = userContentController
    
            self.webView = WKWebView(frame: self.documentDiscriptionView.bounds,
                                     configuration: configuration)
            self.webView.navigationDelegate = self
            self.webView.scrollView.isScrollEnabled = false
            self.webView.scrollView.bounces = false
    
            self.webView.isOpaque = false
            self.webView.backgroundColor = UIColor.clear
            self.webView.scrollView.backgroundColor = UIColor.clear
    
            self.self.webViewContainerView.addSubview( self.webView)
    


2 commentaires

Mais vous n'avez pas chargé le fichier CSS de Bundle. Ce que je veux, c'est d'utiliser les fichiers de mon ensemble au lieu de demander à distance de la télécommande, de sorte que la vision Web peut espérer charger plus rapidement. Je crois que la partie de la solution comprendra comment capturer les demandes de WebView pour charger le fichier CSS et comment tordre la requête pour arrêter de demander un serveur distant pour le fichier et renvoyer le fichier à partir du paquet.


Dans votre cas, utilisez une solution @pranay, je pensais que vous souhaitez charger le fichier CSS de Server distant.