Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I detect when url of amp page changed with WKWebview

I'm developing simple web browser with WKWebview. I can detect when url changed at SPA like trello with custom Javascript.

That way will not work In amp page. (Accelerated Mobile Pages of Google) I tried put print("webView.url") to all of WKNavigationDelegate function But I couldn't detect change of amp page url.

But webView has amp page url , I'd like to save amp page url to local store.

like image 599
oxygen Avatar asked Dec 15 '17 10:12

oxygen


People also ask

How do I know if WKWebView is loaded?

To check if your WKWebView has loaded easily implement the following method: import WebKit import UIKit class ViewController: UIViewController, WKNavigationDelegate { let webView = WKWebView() func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!)

How do I debug WKWebView?

Debugging with WKWebViewOpen Safari and press ⌘+, to open Preference, under the Advanced tab, check “Show Develop menu in menu bar”. Not until we have the project build can we use the Safari debugger. The debugger is under Develop → Your simulator or device.

What is WKWebView?

Overview. A WKWebView object is a platform-native view that you use to incorporate web content seamlessly into your app's UI. A web view supports a full web-browsing experience, and presents HTML, CSS, and JavaScript content alongside your app's native views.

What is WKNavigationDelegate?

Methods for accepting or rejecting navigation changes, and for tracking the progress of navigation requests.


1 Answers

Same issue. Unfortunately WKWebView only fires its functions when a full page load happens.

So what we have to do instead is use Key Value Observing on the WebKit.url property.

Looks something like this:

import AVFoundation
import UIKit
import WebKit
import MediaPlayer

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

  override func viewDidLoad() {
    super.viewDidLoad()

    webView.navigationDelegate = self

    self.webView.addObserver(self, forKeyPath: "URL", options: .new, context: nil)
    self.webView.addObserver(self, forKeyPath: "estimatedProgress", options: .new, context: nil)

    self.webView.load(URLRequest(url: "https://google.com"))
  }

  override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
    if keyPath == #keyPath(WKWebView.url) {
      print("### URL:", self.webView.url!)
    }

    if keyPath == #keyPath(WKWebView.estimatedProgress) {
      // When page load finishes. Should work on each page reload.
      if (self.webView.estimatedProgress == 1) {
        print("### EP:", self.webView.estimatedProgress)
      }
    }
  }

Each additional navigation in the wkWebkitView should cause a new combo of "### URL" and "### EP" to fire off.

like image 95
Geuis Avatar answered Oct 17 '22 02:10

Geuis