πŸ”
AppSec & Pentest
Mobile
Mobile
  • Mobile
  • Pentesting Methodology
  • Programming
    • Аналитика
      • Some Papers
      • ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ²/ΠΊΠ»ΡŽΡ‡Π΅ΠΉ ΠΈ Ρ‚ΠΏ
      • Twitter ads
      • Branch.IO
      • Adjust
      • Amplitude Analytics
      • Paypal for Business
      • Emarsys
      • MobileAppTracker
      • AppsFlyer
        • About
        • Настройка Π°ΠΊΠΊΠ°ΡƒΠ½Ρ‚Π°
        • ИсслСдованиС ΠΊΠΎΠ΄Π°
        • Examples
      • Fabric
      • Mixpanel Analytics
      • Facebook ads
      • Yandex
      • Firebase SDK
        • Intro
        • ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹
        • Firebase Cloud Messaging
        • ΠšΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹
          • Firebase
          • FirebaseABTesting
          • FirebaseAnalytics[Interop]
          • FirebaseAppDistribution
          • FirebaseAuth[Interop]
          • FirebaseCore
          • FirebaseCoreDiagnostics[Interop]
          • FirebaseCrashlytics
          • FirebaseDatabase
          • FirebaseDynamicLinks
          • FirebaseFirestore[Swift]
          • FirebaseFunctions
          • FirebaseInAppMessaging
          • FirebaseInstallations
          • FirebaseInstanceID
          • FirebaseMessaging
          • FirebaseRemoteConfig
          • FirebaseStorage[Swift]
          • GoogleDataTransport
          • GoogleDataTransportCCTSupport
          • GoogleUtilities
          • GoogleUtilitiesComponents
      • Crashlytics
      • GTM: Google Tag Manager
      • Google Maps
      • Google Analytics
      • Flurry
      • HockeyApp
    • iOS
      • ΠœΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Ρ‹
      • iOS: SSL Pinning
      • ЯП
        • Swift
          • VIPER (Architecture)
          • ΠžΠ±Ρ‰Π΅Π΅
          • UI
          • ΠŸΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ
          • Swift Style Guide
        • Swift Security
          • ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ уязвимостСй
      • Frameworks and Libraries
        • [Pentest] App extensions
          • About
          • Extension types
          • Static Analys
          • Dynamic Analys
        • [Pentest] App Notifications
        • Async
        • Π‘DP
        • Core
        • Cryptography
        • Jailbreak Detection
        • Network
          • AFNetworking
          • Alamofire
          • HTTP Requests
        • Other
        • Push
        • RxSwift
        • Store Data
        • UI
          • SwiftUI
          • WebView in iOS App
          • UI
        • VPN Detection
      • XCode
        • Build Project
        • Build Project via Command Line
        • Install IPA
        • Templates
      • Π”Ρ€ΡƒΠ³ΠΈΠ΅ инструмСнты
        • mint
      • БистСмы зависимостСй ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ²
        • Carthage
        • CocoaPods
      • Troubleshooting
    • Android
      • АрхитСктура Android прилоТСния
        • АрхитСктура Kotlin-прилоТСния
        • Π Π°Π·Π½ΠΈΡ†Π° ΠΌΠ΅ΠΆΠ΄Ρƒ Android Library, Android APP ΠΈ Java Library
        • Basic
          • Activities
          • Broadcast Receivers
          • Content Providers
          • Custom URL Schemes
          • Intents
          • Notifications
          • PendingIntents
          • Permissions
          • Services
          • Android WebView
      • ЯП
        • Java
          • Bundle
        • Kotlin
          • Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π² Intent
          • Call Native Functions
      • Frameworks
        • AndroidX
        • LiveData
        • Lifecycle
        • Background Tasks
          • DownloadManager
          • AlarmManager
          • Foreground Services (ΠΈΠ»ΠΈ просто Services)
          • WorkManager
        • Room
        • Data binding
          • Basic
        • NDK
          • Install and Build
          • OpenSSL
          • libgit2 build
        • Navigation
        • Π Π°Π±ΠΎΡ‚Π° с изобраТСниями
          • Glide
        • Video/Audio
          • Communications
            • Jitsi
        • JS Engines
          • FB: Hermes
          • Duktape
        • DI: Dependency Injection
          • Π—Π°Ρ‡Π΅ΠΌ?
          • koin
          • kodein
          • dagger2
        • Retrofit / OkHTTP
          • Intro
          • Example Usage
            • Parse error body
            • ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² запросов
            • Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° модуля
            • HttpApi
            • ControllerApi
          • SSLPinning
        • Google Play Authorization
      • Automating build (android in docker)
      • Android Studio
        • Build Project
        • БоставныС части ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°
      • Π’Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ
        • LeakCanary
        • Mocking
        • Настройка Ρ€Π΅Π·Π΅Ρ€Π²Π½ΠΎΠ³ΠΎ копирования
        • Remote Method Invocation
        • bundletool (aab -> apk)
      • ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ
        • Kotlin
      • API levels & NDK Version
    • PWA
    • Hybrid App
      • Frameworks
        • Frameworks List
        • Electron
        • React Native
      • Google Web Toolkit
      • Dart/Flutter
      • Kotlin
      • Game Develope
    • Π Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΠΈ
      • Π₯Ρ€Π°Π½Π΅Π½ΠΈΠ΅ PIN-ΠΊΠΎΠ΄Π° ΠΈ ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ
      • Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° прилоТСния для людСй с ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½Ρ‹ΠΌΠΈ возмоТностями
      • Secure Networking on iOS
    • AirWatch MDM
    • Π”ΠΈΡΡ‚Ρ€ΠΈΠ±ΡŒΡŽΡ†ΠΈΡ
      • AppCenter
      • App Store
      • App Store Connect
      • AppTester
      • Crashlytics
      • Cydia
      • Diawi
      • Google Play
      • Hockey App
      • TestFairy
      • TestFlight
      • Transporter.app
      • Firebase AppDistribution
  • Forensic
    • Bluetooth
    • NFC
    • GSM
    • SIM-cards
    • iOS
      • Π˜Π½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΈ скрипты
        • Π—Π°Π±ΠΎΡ€ ΡΠΊΡ€ΠΈΠ½ΡˆΠΎΡ‚ΠΎΠ² с Ρ‚Π΅Π»Π΅Ρ„ΠΎΠ½Π°
        • otool
        • lipo
        • plist reader
        • backup reader
        • libimobiledevice
        • Cydia Impactor
        • App Signature
      • АрхитСктура ОБ
        • Π¨ΠΈΡ„Ρ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ
        • АрхитСктура iOS прилоТСния
        • iBoot
        • Secure Enclave (SEP)
        • Π‘Ρ€Π°ΡƒΠ·Π΅Ρ€Ρ‹
      • Ѐайловая систСма
        • Π“Π΄Π΅ Ρ‡Ρ‚ΠΎ хранится
        • ΠœΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³ Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмы
      • Create/Decrypt Backup
      • IPA dump
        • Frida IPA dump
        • iOS 11 ΠΈ Π²Ρ‹ΡˆΠ΅
        • МладшС iOS 10
      • Jailbreak
      • DFU Ρ€Π΅ΠΆΠΈΠΌ (Ρ€Π΅ΠΆΠΈΠΌ восстановлСния ΠΈ обновлСния)
    • Android
      • Ѐайловая систСма
        • Android KeyStore
      • ΠžΠ±Ρ‰Π°Ρ информация ΠΎ систСмС: ΠŸΠΎΠ»Π΅Π·Π½Ρ‹Π΅ Ρ‚ΡƒΠ»Π·Ρ‹ ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹
      • ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ подписи apk
      • Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΈ восстановлСниС Ρ€Π΅Π·Π΅Ρ€Π²Π½ΠΎΠΉ ΠΊΠΎΠΏΠΈΠΈ
      • ΠŸΠ°ΠΌΡΡ‚ΡŒ процСссов
      • Root
        • Common
        • A/B-Ρ€Π°Π·Π΄Π΅Π»Ρ‹
        • Su
        • TWRP
  • Pentest
    • Уязвимости ΠΈ Атаки
      • Изи Π±Π°Π³ΠΈ
      • Common
      • iOS
      • Android
      • AppLinks
      • Auth
        • Biometrics bypass
        • PIN Bruteforce
        • Π’ΠΈΠΏΠΈΡ‡Π½Ρ‹Π΅ ошибки Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ SMS-Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ
      • USSD Attack
      • Java Object Deserialization
      • Lack of binary protection (anti-debugging) controls
      • Disabled security features in binary libraries
      • Lack of exploit mitigations (e.g. PIE, ARC, or stack canaries)
      • Path disclosure in the binary
      • Runtime hacking exploits (e.g. exploits that are only possible in a jailbroken environment)
      • Snapshot/pasteboard leakage
      • User data stored unencrypted in the file system and/or external storage
      • Android Task Hijacking
      • WebView
        • Check list
        • Example Web View XSS in iOS app
        • CVE-2020-6506: uXSS in Android WebView
    • ΠšΠ΅ΠΉΡΡ‹
      • ΠžΠ±Ρ‰ΠΈΠ΅
        • Firebase
        • ΠŸΡ€ΠΎ сниффинг Ρ‚Ρ€Π°Ρ„ΠΈΠΊΠ° HTTP2/gRPC
        • Dump memory
      • Android
        • Simple Library RCE for Android
        • Π—Π°ΠΊΠΈΠ½ΡƒΡ‚ΡŒ GApps Π½Π° эмулятор
        • Android Dependency Check
        • Π—Π°ΠΏΡ€Π΅Ρ‚ ΡΠΊΡ€ΠΈΠ½ΡˆΠΎΡ‚Π° ΠΈ Π΄Π΅Ρ‚Π΅ΠΊΡ‚ овСрлСя
        • Disable/Delete any app w/o root
      • iOS
        • App Transport Security
        • Info.plist
        • Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π»ΠΎΠ³ΠΈ
        • Установка IPA-ΠΎΠ±Ρ€Π°Π·Π° Π½Π° iOS Π±Π΅Π· XCode, Cydia Impactor
        • Π‘ΠΎΡ€ΡŒΠ±Π° со ΡΠΊΡ€ΠΈΠ½ΡˆΠΎΡ‚Π°ΠΌΠΈ
        • Π‘Π»ΡŽΡ€ΠΈΠ½Π³ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ Π² ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Π΅ ΠΎΠΊΠΎΠ½
        • Установка нСподписанных IPA
      • Hybrid Apps
        • Flutter SDK: RE/Capture Traffic
    • Bug Bounty
    • Настройка окруТСния
      • SASTs
      • Frida & Objection
      • Pentest WebView
      • iOS
        • Platform
        • Network
          • Π—Π°ΠΏΠΈΡΡŒ Ρ‚Ρ€Π°Ρ„Ρ„ΠΈΠΊΠ° iOS
          • iOS SSL Unpinning
      • Android
        • Reverse Engineering
        • Platform
        • Network
          • Π—Π°ΠΏΠΈΡΡŒ Ρ‚Ρ€Π°Ρ„ΠΈΠΊΠ° Android
          • Android: SSL Unpinning
    • Mitigations
    • Books & Papers
    • Companies & People & Blogs
    • Π˜Π½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΈ скрипты
      • ΠšΠΎΠΌΠ±Π°ΠΉΠ½Ρ‹
      • Android
        • grep: Π˜Π·Π²Π»Π΅Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΈΠ· APK
        • Π‘ΠΎΠ»Π΅Π΅ ΠΌΠ΅Π½Π΅Π΅
        • Бтарая хСрня
          • Drozer
          • Π Π°Π·Π½ΠΎΠ΅
      • iOS
        • SAST
          • ipanema
          • iblessing
        • meetle
        • Static Analys with Frida
        • iFunBox
        • iOS Binary Analysis
        • needle
        • idb
        • ios emulator
        • passionfruit
        • Grapefruit ("NG passionfruit")
        • XPC Sniffing
        • SAST in MobSF
        • Поиск ΠΏΠΎ Ρ„Π°ΠΉΠ»Π°ΠΌ
      • hybrid app
        • Cordova
        • Xamarin
        • Electron
      • FBFlipper
      • truegaze
  • Reverse Engineering
    • Android
      • Tools
        • Decompilers
        • TODO: Androguard
        • TODO: AndroPyTool
        • TODO: LIEF-project
        • TODO: MobSF
        • JADX
        • dex2jar
        • Diff APKs, JARs,..
        • APKiD
        • enjarify
        • adb/fastboot
          • Install
          • Usage
          • Troubleshooting
          • На Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅ΠΌ Π²Π»ΠΈΡΡ‚ΡŒ Ρ‡Π΅Ρ€Π΅Π· adb (Π² поисках сСрвисов)
        • DexCalibur
      • ΠžΠ±ΡŠΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒ нСсколько JAR
      • Build AOSP in Docker
      • ΠŸΠ°Ρ‚Ρ‡ΠΈΠ½Π³
      • Поиск ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… строк Π² Smali
      • Π—Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ frida
    • iOS
      • CVEs
      • Tools
        • iRET
        • xcrun
        • otool: check binary encryption
      • ΠŸΠ°Ρ‚Ρ‡ΠΈΠ½Π³
      • Start iOS Debug Server
      • iOS Audio Framework
      • Facebook SDK
      • Swift
      • Attack Secure Boot of SEP
      • iOS Kernel Firmware
    • Tools
      • frida
        • Установка
        • Frida CLI
        • Запуск скриптов
        • ΠžΠ±Ρ‰ΠΈΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ (JS API)
        • Frida Projects
        • ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹
          • ΠœΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Ρ‹
          • Android
          • iOS
          • Unity/Mono
          • ΠžΠ±Ρ‰Π΅Π΅
            • Π’Ρ‹Π²ΠΎΠ΄ Callstack
            • ΠŸΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚ инструкции ΠΏΠΎ ΡΠΌΠ΅Ρ‰Π΅Π½ΠΈΡŽ
            • ΠŸΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ
            • ΠŸΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΠΎ ΡΠΌΠ΅Ρ‰Π΅Π½ΠΈΡŽ (sub_*)
      • objection
      • luject
      • emulators
    • ΠšΠ΅ΠΉΡΡ‹
      • Hybrid App
        • Intro
        • Hermes
        • Xamarin
        • React Native
        • Unity
        • Debug Hybrid App
    • Π‘Ρ‚Π°Ρ‚ΡŒΠΈ
  • Administration
    • Π˜Π½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚Ρ‹
      • Android
        • uiautomatorviewer
        • jobb
        • archquery
        • apkanalyzer
        • avdmanager
        • emulator
        • perfetto
        • monkeyrunner
        • Настройка окруТСния
        • sdkmanager
Powered by GitBook
On this page
  • WKWebView
  • WKWebView in SwiftUI Example

Was this helpful?

  1. Programming
  2. iOS
  3. Frameworks and Libraries
  4. UI

WebView in iOS App

WKWebView

webView = WKWebView(...)
webView.uiDelegate = self  // Π΄ΠΎΠ»ΠΆΠ΅Π½ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ viewDidLoad()

...
override func viewDidLoad() {
    super.viewDidLoad()
    
    let myURL = URL(string:"https://www.apple.com")
    let myRequest = URLRequest(url: myURL!)
    webView.load(myRequest)
}}

WKWebView in SwiftUI Example

TestSwiftApp.swift

//
//  TestSwiftAppApp.swift
//  TestSwiftApp
//

import SwiftUI
import WebKit

@main
struct TestSwiftAppApp: App {
    let persistenceController = PersistenceController.shared

    var body: some Scene {
        WindowGroup {
            ContentView()
                .environment(\.managedObjectContext, persistenceController.container.viewContext)
            
        }
    }
    
}

ContentView.swift

import SwiftUI
import WebKit

struct ContentView: View {
    @ObservedObject var webViewStateModel: WebViewStateModel = WebViewStateModel()
    var body: some View {
        
        NavigationView {
            LoadingView(isShowing: .constant(webViewStateModel.loading)) { //loading logic taken from https://stackoverflow.com/a/56496896/9838937
                //Add onNavigationAction if callback needed
                WebView(url: URL.init(string: "https://www.google.com")!, webViewStateModel: self.webViewStateModel)
            }
            .navigationBarTitle(Text(webViewStateModel.pageTitle), displayMode: .inline)
            .navigationBarItems(trailing:
                Button("Last Page") {
                    self.webViewStateModel.goBack.toggle()
                }.disabled(!webViewStateModel.canGoBack)
            )
        
     }
        
    }
}

struct ActivityIndicator: UIViewRepresentable {

    @Binding var isAnimating: Bool
    let style: UIActivityIndicatorView.Style

    func makeUIView(context: UIViewRepresentableContext<ActivityIndicator>) -> UIActivityIndicatorView {
        return UIActivityIndicatorView(style: style)
    }

    func updateUIView(_ uiView: UIActivityIndicatorView, context: UIViewRepresentableContext<ActivityIndicator>) {
        isAnimating ? uiView.startAnimating() : uiView.stopAnimating()
    }
}

struct LoadingView<Content>: View where Content: View {

    @Binding var isShowing: Bool
    var content: () -> Content

    var body: some View {
        GeometryReader { geometry in
            ZStack(alignment: .center) {

                self.content()
                    .disabled(self.isShowing)
                    .blur(radius: self.isShowing ? 3 : 0)

                VStack {
                    Text("Loading...")
                    ActivityIndicator(isAnimating: .constant(true), style: .large)
                }
                .frame(width: geometry.size.width / 2,
                       height: geometry.size.height / 5)
                .background(Color.secondary.colorInvert())
                .foregroundColor(Color.primary)
                .cornerRadius(20)
                .opacity(self.isShowing ? 1 : 0)

            }
        }
    }

}


struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

///// Implementaton
class WebViewStateModel: ObservableObject {
    @Published var pageTitle: String = "Web View"
    @Published var loading: Bool = false
    @Published var canGoBack: Bool = false
    @Published var goBack: Bool = false
}

struct WebView: View {
     enum NavigationAction {
           case decidePolicy(WKNavigationAction,  (WKNavigationActionPolicy) -> Void) //mendetory
           case didRecieveAuthChallange(URLAuthenticationChallenge, (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) //mendetory
           case didStartProvisionalNavigation(WKNavigation)
           case didReceiveServerRedirectForProvisionalNavigation(WKNavigation)
           case didCommit(WKNavigation)
           case didFinish(WKNavigation)
           case didFailProvisionalNavigation(WKNavigation,Error)
           case didFail(WKNavigation,Error)
       }
       
    @ObservedObject var webViewStateModel: WebViewStateModel
    
    private var actionDelegate: ((_ navigationAction: WebView.NavigationAction) -> Void)?
    
    
    let uRLRequest: URLRequest
    
    
    var body: some View {
        
        WebViewWrapper(webViewStateModel: webViewStateModel,
                       action: actionDelegate,
                       request: uRLRequest)
    }
    /*
     if passed onNavigationAction it is mendetory to complete URLAuthenticationChallenge and decidePolicyFor callbacks
    */
    init(uRLRequest: URLRequest, webViewStateModel: WebViewStateModel, onNavigationAction: ((_ navigationAction: WebView.NavigationAction) -> Void)?) {
        self.uRLRequest = uRLRequest
        self.webViewStateModel = webViewStateModel
        self.actionDelegate = onNavigationAction
    }
    
    init(url: URL, webViewStateModel: WebViewStateModel, onNavigationAction: ((_ navigationAction: WebView.NavigationAction) -> Void)? = nil) {
        self.init(uRLRequest: URLRequest(url: url),
                  webViewStateModel: webViewStateModel,
                  onNavigationAction: onNavigationAction)
    }
}

/*
  A weird case: if you change WebViewWrapper to struct cahnge in WebViewStateModel will never call updateUIView
 */

final class WebViewWrapper : UIViewRepresentable {
    @ObservedObject var webViewStateModel: WebViewStateModel
    let action: ((_ navigationAction: WebView.NavigationAction) -> Void)?
    
    let request: URLRequest
      
    init(webViewStateModel: WebViewStateModel,
    action: ((_ navigationAction: WebView.NavigationAction) -> Void)?,
    request: URLRequest) {
        self.action = action
        self.request = request
        self.webViewStateModel = webViewStateModel
    }
    
    
    func makeUIView(context: Context) -> WKWebView  {
        let view = WKWebView()
        let tests = "<script>Test</script>"
        view.navigationDelegate = context.coordinator
        view.loadHTMLString("Test \(tests) string", baseURL: nil)
        // view.load(request)
        return view
    }
      
    func updateUIView(_ uiView: WKWebView, context: Context) {
        if uiView.canGoBack, webViewStateModel.goBack {
            uiView.goBack()
            webViewStateModel.goBack = false
        }
    }
    
    func makeCoordinator() -> Coordinator {
        return Coordinator(action: action, webViewStateModel: webViewStateModel)
    }
    
    final class Coordinator: NSObject {
        @ObservedObject var webViewStateModel: WebViewStateModel
        let action: ((_ navigationAction: WebView.NavigationAction) -> Void)?
        
        init(action: ((_ navigationAction: WebView.NavigationAction) -> Void)?,
             webViewStateModel: WebViewStateModel) {
            self.action = action
            self.webViewStateModel = webViewStateModel
        }
        
    }
}

extension WebViewWrapper.Coordinator: WKNavigationDelegate {
    func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
        
        if action == nil {
            decisionHandler(.allow)
        } else {
            action?(.decidePolicy(navigationAction, decisionHandler))
        }
    }
    
    func webView(_ webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!) {
        webViewStateModel.loading = true
        action?(.didStartProvisionalNavigation(navigation))
    }
    
    func webView(_ webView: WKWebView, didReceiveServerRedirectForProvisionalNavigation navigation: WKNavigation!) {
        action?(.didReceiveServerRedirectForProvisionalNavigation(navigation))

    }
    
    func webView(_ webView: WKWebView, didFailProvisionalNavigation navigation: WKNavigation!, withError error: Error) {
        webViewStateModel.loading = false
        webViewStateModel.canGoBack = webView.canGoBack
        action?(.didFailProvisionalNavigation(navigation, error))
    }
    
    func webView(_ webView: WKWebView, didCommit navigation: WKNavigation!) {
        action?(.didCommit(navigation))
    }
    
    func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
        webViewStateModel.loading = false
        webViewStateModel.canGoBack = webView.canGoBack
        if let title = webView.title {
            webViewStateModel.pageTitle = title
        }
        action?(.didFinish(navigation))
    }
    
    func webView(_ webView: WKWebView, didFail navigation: WKNavigation!, withError error: Error) {
        webViewStateModel.loading = false
        webViewStateModel.canGoBack = webView.canGoBack
        action?(.didFail(navigation, error))
    }
    
    func webView(_ webView: WKWebView, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) {
        
        if action == nil  {
            completionHandler(.performDefaultHandling, nil)
        } else {
            action?(.didRecieveAuthChallange(challenge, completionHandler))
        }
        
    }
}
PreviousSwiftUINextUI

Last updated 3 years ago

Was this helpful?