[SWIFT] Solution WKNavigationDelegate-decidepolicyfornavigationaction lorsqu'elle est appelée après le chargement de la page

introduction

Dans webView (_: decidePolicyFor: decisionHandler :), il est appelé lorsque la page initiale est chargée par WKWebView ou lorsque l'utilisateur appuie sur le lien. Je vais. Par conséquent, en accédant à WKNavigationAction, vous pouvez obtenir l'URLRequest et décider de charger la page.

Alors, pourquoi le titre ** est-il la solution lorsqu'il est appelé après le chargement de la page avec WKNavigationDelegate-decidepolicyfornavigationaction **? Dans webView (_: decidePolicyFor: decisionHandler :), si vous chargez simplement avec viewdidload etc. Ne peut être appelé qu'avant le chargement et plus tard dans les transitions WebPage après le chargement de la page

Par exemple, si vous passez à une page vidéo YouTube, elle sera appelée après le chargement de la page et Apple l'appellera avant le chargement de la page.

Solution

La raison pour laquelle il est appelé après le chargement est probablement que si l'URL à charger est une URL relative, elle ne sera pas appelée avant le chargement, mais après le chargement de la page.

Par exemple, lorsque vous appuyez sur la page vidéo YouTube, elle sera appelée avant de charger la vidéo

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 {
                //Je veux attraper avec Delegate avant de charger Recharger uniquement lorsque la page est appelée par Delegate après le chargement
                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)
    }
}

Ainsi, chaque fois que l'URL webView est modifiée de cette manière, vérifiez l'URL, et si elle est différente de l'ancienne (dans le cas de la transition de page), chargez à nouveau avec un chemin absolu et webView (_: decidePolicyFor: decisionHandler :) Attrapez avec.

Sommaire

Maintenant, cela fonctionne comme prévu, mais c'est une solution violente. Si vous connaissez une meilleure solution, je vous serais reconnaissant si vous pouviez commenter.

Merci beaucoup

Lien de référence

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

Recommended Posts

Solution WKNavigationDelegate-decidepolicyfornavigationaction lorsqu'elle est appelée après le chargement de la page
Une solution lorsque vous êtes invité à plusieurs reprises même après la mise à jour du bundle