SwiftUI + WKWebView Странное WKNavigationDelegate Поведение - PullRequest
0 голосов
/ 21 марта 2020

Я довольно новичок в Swift и поиграл с SwiftUI и WKWebView и обнаружил странную проблему.

Я пытаюсь настроить WkWebView в swiftUI с WKNavigationDelegate, главным образом для его решенияеляPolicyFor navigationAction: WKNavigationAction.

Для большинства сайтов код работает как израсходованный. Однако при дальнейшем тестировании я обнаружил, что для таких сайтов, как cnet .com, когда установлен делегат, сайт не загружается.

Код, который я тестировал, приведен ниже.

```

class WebViewModel: ObservableObject {
    @Published var link: String
    @Published var didFinishLoading: Bool = false

    init (link: String) {
        self.link = link
    }
}

struct SwiftUIWebView: UIViewRepresentable {
    @ObservedObject var viewModel: WebViewModel

    var webView = WKWebView()


    func makeUIView(context: UIViewRepresentableContext<SwiftUIWebView>) -> WKWebView {


        self.webView.navigationDelegate = context.coordinator //->some sites only load when this is not set!!!
        if let url = URL(string: viewModel.link) {
            self.webView.load(URLRequest(url: url))
            self.webView.allowsBackForwardNavigationGestures = false  
        }
        return self.webView
    }

    func updateUIView(_ uiView: WKWebView, context: UIViewRepresentableContext<SwiftUIWebView>) {
        print("view!!!!!-2")
        return
    }

    //model can be expanded to have a list of allowed websites and 

navigation rules.
        class Coordinator: NSObject, WKNavigationDelegate {
            //private var viewModel: WebViewModel -> this line was the culprit.
@ObservedObject var viewModel: WebViewModel //->this line fixed the issue


        init(_ viewModel: WebViewModel) {
            self.viewModel = viewModel
        }

        deinit {
            print("view gone")
        }

        func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
            print("WebView: navigation finished \(self.viewModel.link)")
            self.viewModel.didFinishLoading = true
            print(self.viewModel.didFinishLoading)
        }


        func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
            if let host = navigationAction.request.url?.host {
                let urlString = self.viewModel.link
                let url = URL(string: urlString)
                let allowedHost = url?.host

                if host == allowedHost {
                    decisionHandler(.allow)
                    return
                } else {
                    decisionHandler(.cancel)
                }
            }else {
                decisionHandler(.cancel)
            }
            //
            //decisionHandler(.allow)
        }
    }

    func makeCoordinator() -> SwiftUIWebView.Coordinator {
        Coordinator(viewModel)
    }
}



struct ContentView: View {

    @ObservedObject var model = WebViewModel(link: "https://www.cnet.com") -> //only loads when delegate is disabled
    @ObservedObject var model = WebViewModel(link: "https://www.google.com") -> //works with delegate 


    var body: some View {
         SwiftUIWebView(viewModel: model)
    }
}

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

```

Для сайтов, которые не работают с делегатом, didFini sh fun c никогда не срабатывает.

Я искал в Интернете другие способы заставить работать swiftUI и WkWebkit, но каждый раз, когда я сталкиваюсь с этой проблемой на некоторых сайтах.

Кроме того, для некоторых сайтов после 30 с лишним лет эта ошибка появляется up:

Не удалось сообщить о сервисе com.apple.WebKit.Networking: 113: Не удалось найти указанный сервис.

Я пытался искать везде, где мог, и ничего не нашел. Это сводит меня с ума. Если кто-то может мне помочь, я был бы благодарен.

Спасибо,

...