TEAM LICENSES: Save money and learn new skills through a Hacking with Swift+ team license >>

SOLVED: WEBVIEW DOES NOT SHOW CHANGES

Forums > SwiftUI

Hi again!

Please, I have embeded webpages in the app to make it easier to update and such. But, whenever I update the website that is embeded and publish it, I can't see the changes in the app until I uninstall and reinstall the app.

Can anyone kindly help me?

Many thanks.

This is the code I use for the Webview:

   struct Webview: UIViewControllerRepresentable {
        let url: URL
        func makeUIViewController(context: Context) -> WebviewController {
            let webviewController = WebviewController()
            let request = URLRequest(url: self.url, cachePolicy: .returnCacheDataElseLoad)
            webviewController.webview.load(request)
            return webviewController
        }
        func updateUIViewController(_ webviewController: WebviewController, context: Context) {
            //
        }
    }

    class WebviewController: UIViewController, WKNavigationDelegate {
        lazy var webview: WKWebView = WKWebView()
        lazy var progressbar: UIProgressView = UIProgressView()
        deinit {
            self.webview.removeObserver(self, forKeyPath: "estimatedProgress")
            self.webview.scrollView.removeObserver(self, forKeyPath: "contentOffset")
        }
        override func viewDidLoad() {
            super.viewDidLoad()
            self.webview.navigationDelegate = self
            self.view.addSubview(self.webview)
            self.webview.frame = self.view.frame
            self.webview.translatesAutoresizingMaskIntoConstraints = false
            self.view.addConstraints([
                self.webview.topAnchor.constraint(equalTo: self.view.topAnchor),
                self.webview.bottomAnchor.constraint(equalTo: self.view.bottomAnchor),
                self.webview.leadingAnchor.constraint(equalTo: self.view.leadingAnchor),
                self.webview.trailingAnchor.constraint(equalTo: self.view.trailingAnchor),
            ])
            self.webview.addSubview(self.progressbar)
            self.setProgressBarPosition()
            webview.scrollView.addObserver(self, forKeyPath: "contentOffset", options: .new, context: nil)
            self.progressbar.progress = 0.1
            webview.addObserver(self, forKeyPath: "estimatedProgress", options: .new, context: nil)
        }
        func setProgressBarPosition() {
            self.progressbar.translatesAutoresizingMaskIntoConstraints = false
            self.webview.removeConstraints(self.webview.constraints)
            self.webview.addConstraints([
                self.progressbar.topAnchor.constraint(equalTo: self.webview.topAnchor, constant: self.webview.scrollView.contentOffset.y * -1),
                self.progressbar.leadingAnchor.constraint(equalTo: self.webview.leadingAnchor),
                self.progressbar.trailingAnchor.constraint(equalTo: self.webview.trailingAnchor),
            ])
        }
        // MARK: - Web view progress
        override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
            switch keyPath {
            case "estimatedProgress":
                if self.webview.estimatedProgress >= 1.0 {
                    UIView.animate(withDuration: 0.3, animations: { () in
                        self.progressbar.alpha = 0.0
                    }, completion: { finished in
                        self.progressbar.setProgress(0.0, animated: false)
                    })
                } else {
                    self.progressbar.isHidden = false
                    self.progressbar.alpha = 1.0
                    progressbar.setProgress(Float(self.webview.estimatedProgress), animated: true)
                }
            case "contentOffset":
                self.setProgressBarPosition()
            default:
                super.observeValue(forKeyPath: keyPath, of: object, change: change, context: context)
            }
        }
    }

   

Anyone to help, please?

   

Not something I have actually done, so factor that in. Looking at the code, I see you have a cachePolicy to return the cached data, so my assumption would be that the page you are loading is cached by iOS and you're getting that back. Have you tried changing the cache policy to always fetch... may not be an ideal solution but would be a good test to see if thats the problem.

   

I see... I have been thinking of the cache too... should I just leave it as,

let request = URLRequest(url: self.url)

   

Hacking with Swift is sponsored by Blaze.

SPONSORED Still waiting on your CI build? Speed it up ~3x with Blaze - change one line, pay less, keep your existing GitHub workflows. First 25 HWS readers to use code HACKING at checkout get 50% off the first year. Try it now for free!

Reserve your spot now

Sponsor Hacking with Swift and reach the world's largest Swift community!

Reply to this topic…

You need to create an account or log in to reply.

All interactions here are governed by our code of conduct.

 
Unknown user

You are not logged in

Log in or create account
 

Link copied to your pasteboard.