[SWIFT] WKNavigationDelegate-Entscheidungspolitik für Navigationaction-Lösung beim Aufruf nach dem Laden der Seite

Einführung

In webView (_: entscheidendPolicyFor: entscheidungshandler :) wird es aufgerufen, wenn die erste Seite von WKWebView geladen wird oder wenn der Benutzer auf den Link tippt. Ich werde. Durch Zugriff auf WKNavigationAction können Sie daher die URLRequest abrufen und verarbeiten, ob die Seite geladen werden soll.

Warum ist der Titel ** die Lösung, wenn er nach dem Laden der Seite mit WKNavigationDelegate-entscheidend für die Navigation ** aufgerufen wird? Kann nur vor dem Laden und später in WebPage-Übergängen nach dem Laden der Seite aufgerufen werden

Wenn Sie beispielsweise zu einer YouTube-Videoseite wechseln, wird diese nach dem Laden der Seite aufgerufen, und Apple ruft sie vor dem Laden der Seite auf.

Lösung

Der Grund, warum es nach dem Laden aufgerufen wird, ist wahrscheinlich, dass wenn die zu ladende URL eine relative URL ist, sie nicht vor dem Laden, sondern nach dem Laden der Seite aufgerufen wird.

Wenn Sie beispielsweise auf die YouTube-Videoseite tippen, wird diese vor dem Laden des Videos aufgerufen

python


import UIKit
import WebKit

class ViewController: UIViewController {

    @IBOutlet weak var webView: WKWebView!
    
    private var _observers = [NSKeyValueObservation]()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        webView.navigationDelegate = self
        webView.load(URLRequest(url: URL(string:"https://www.youtube.com/")!))
        
        _observers.append(webView.observe(\.url, options: [.new, .old]){ [weak self] _,change in
            guard let newValue = change.newValue, let oldValue = change.oldValue else { return }
            guard let newURL = newValue, let oldURL = oldValue else { return }
            
            if newURL != oldURL {
                //Ich möchte vor dem Laden mit Delegate sprechen. Reload nur, wenn die Seite nach dem Laden von Delegate aufgerufen wird
                if newURL.absoluteString.contains("/watch"){
                    self?.webView.load(URLRequest(url: newURL))
                }
            }
        })
    }
}

extension ViewController: WKNavigationDelegate {
    func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
        decisionHandler(.allow)
    }
}

Überprüfen Sie daher jedes Mal, wenn die webView-URL auf diese Weise geändert wird, die URL. Wenn sie sich von der alten unterscheidet (im Fall eines Seitenübergangs), laden Sie sie erneut mit einem absoluten Pfad und webView (_: entscheidendPolicyFor: entscheidungshandler :) Fang mit.

Zusammenfassung

Jetzt funktioniert es wie beabsichtigt, aber es ist eine gewalttätige Lösung. Wenn Sie eine bessere Lösung kennen, würde ich mich freuen, wenn Sie einen Kommentar abgeben könnten.

Vielen Dank

Referenzlink

wkwebview-decidepolicyfor-gets-called-after-page-loaded

Recommended Posts

WKNavigationDelegate-Entscheidungspolitik für Navigationaction-Lösung beim Aufruf nach dem Laden der Seite
Eine Lösung, wenn Sie auch nach dem Bundle-Update wiederholt dazu aufgefordert werden