javascriptswiftuiwebview

SwiftUI - Hidden some information from a website on webview


I'm new on Swift UI, I creating an app for my company, I create an webView to show some news on the app homepage, I getting it from our website, but I want to hide some menus and other things to make it more clean, but I don't how even to start it, my app can show the "raw" webpage, if you guys can help me will be awesome

that's my code

import SwiftUI
import WebKit

struct Home: View {
    @State private var showWebView = false
    private let urlString: String = "https://mywebsite"

    @Binding var showMenu: Bool


    var body: some View {
   
        VStack{
                
            HStack{
                WebViewHome(url: URL(string: urlString)!).frame(height: .infinity)
            }
            .padding([.top],0)
        
         Spacer()
        }
    }
}

struct WebViewHome: UIViewRepresentable{
    var url: URL

    func makeUIView(context: Context) -> WKWebView {
        let prefs = WKWebpagePreferences()
        prefs.allowsContentJavaScript = true
    
        let config = WKWebViewConfiguration()
        config.defaultWebpagePreferences = prefs
        return WKWebView()
    }

    func updateUIView(_ uiView: WKWebView, context: Context) {
        let request  = URLRequest(url: url)
        uiView.load(request)
    
    }
  
}

Solution

  • Inject JavaScript into the webpage to manipulate the DOM. You need to know the CSS selectors of the elements you want to hide:

    struct WebViewHome: UIViewRepresentable {
      var url: URL
      var js: String = """
        document.querySelector('selector').style.display='none';
        document.querySelector('another-selector').style.display='none';
        // Add more selectors
      """
      func makeUIView(context: Context) -> WKWebView {
        let prefs = WKWebpagePreferences()
        prefs.allowsContentJavaScript = true
        let config = WKWebViewConfiguration()
        config.defaultWebpagePreferences = prefs
        let webView = WKWebView(frame: .zero, configuration: config)
        webView.navigationDelegate = context.coordinator
        return webView
      }
      func updateUIView(_ uiView: WKWebView, context: Context) {
        let request = URLRequest(url: url)
        uiView.load(request)
      }
      func makeCoordinator() -> Coordinator {
        Coordinator(self)
      }
        class Coordinator: NSObject, WKNavigationDelegate {
        var parent: WebViewHome
        init(_ parent: WebViewHome) {
          self.parent = parent
        }
        func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
          webView.evaluateJavaScript(parent.js, completionHandler: nil)
        }
      }
    }