Я довольно новичок в 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: Не удалось найти указанный сервис.
Я пытался искать везде, где мог, и ничего не нашел. Это сводит меня с ума. Если кто-то может мне помочь, я был бы благодарен.
Спасибо,