URL kann mit SwiftUI nicht geladen werden, sondern nur mit einem ViewController

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • URL kann mit SwiftUI nicht geladen werden, sondern nur mit einem ViewController

    Hallo,

    ich möchte eine Seite auf meinem internen Server aufrufen, die über einen DynDNS-Dienst erreichbar ist: ####.selfhost.eu. (Zum Test verrate ich die echte Adresse gern über PN)
    Für diese Seite haben wir ein eigenes Zertifikat erstellt, im Schlüsselbund gespeichert und damit den Zugang über Safari erfolgreich getestet.
    Auch eine Test-App mit einem ViewController und einer WKWebView funktioniert problemlos, nachdem ich den Code und die info.plist etwas erweitert habe (s.u.).

    Leider soll die App aber mit SwiftUI erstellt werden (und ich muss zugeben, dass das für mich Neuland ist) und genau da hapert es.

    Ich habe zwar im Internet den grundsätzlichen Weg gefunden und kann alle möglichen Seiten aufrufen, aber nicht diese eigene.
    Stattdessen kommt die Fehlermeldung:
    [Process] 0x7fb03f01e620 - [pageProxyID=6, webPageID=7, PID=5058] WebPageProxy::didFailProvisionalLoadForFrame: frameID=3, isMainFrame=1, domain=NSURLErrorDomain, code=-1200, isMainFrame=1

    Prinzipiell machen beide Apps ja eigentlich dasselbe, nur dass der ViewController in der Swift-Version über <UIViewRepresentable> bereitgestellt wird.

    Ich erkenne keinen Grund, warum die Version mit SwiftUI nicht funktioniert und hoffe sehr, ihr könnt helfen.

    Beide info.plists sind identisch:
    [Blockierte Grafik: https://acut-edv.com/dkl/Screenshot info_plist.png]

    Code mit ViewController:

    Quellcode

    1. import UIKit
    2. import WebKit
    3. let server = "https://#####.selfhost.eu:9999"
    4. let url = URL(string: server)
    5. let myRequest = URLRequest(url: url!)
    6. class ViewController: UIViewController, WKNavigationDelegate {
    7. @IBOutlet weak var webView: WKWebView!
    8. override func viewDidLoad() {
    9. super.viewDidLoad()
    10. webView.navigationDelegate = self
    11. webView.allowsBackForwardNavigationGestures = true
    12. webView.allowsLinkPreview = true
    13. webView.load(myRequest)
    14. }
    15. func webView(_ webView: WKWebView, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) {
    16. guard let serverTrust = challenge.protectionSpace.serverTrust else {
    17. completionHandler(.cancelAuthenticationChallenge, nil)
    18. return
    19. }
    20. let exceptions = SecTrustCopyExceptions(serverTrust)
    21. SecTrustSetExceptions(serverTrust, exceptions)
    22. completionHandler(.useCredential, URLCredential(trust: serverTrust));
    23. }
    24. }
    Alles anzeigen


    Code mit SwiftUI:


    Quellcode

    1. import SwiftUI
    2. import WebKit
    3. let server = "https://#####.selfhost.eu:9999"
    4. let url = URL(string: server)
    5. let myRequest = URLRequest(url: url!)
    6. struct WebView: UIViewRepresentable {
    7. let request: URLRequest
    8. private var myWebView: WKWebView
    9. init(request: URLRequest) {
    10. // Minimaler Frame, weil sonst ein Warnhinweis in der Konsole kommt!
    11. self.myWebView = WKWebView(frame: CGRect(x: 0.0, y: 0.0, width: 0.1, height: 0.1))
    12. self.request = request
    13. }
    14. func makeUIView(context: Context) -> WKWebView {
    15. return myWebView
    16. }
    17. func updateUIView(_ uiView: WKWebView, context: Context) {
    18. uiView.navigationDelegate = context.coordinator
    19. uiView.allowsBackForwardNavigationGestures = true
    20. uiView.allowsLinkPreview = true
    21. uiView.load(request)
    22. }
    23. func makeCoordinator() -> Coordinator {
    24. Coordinator(self)
    25. }
    26. class Coordinator: NSObject, WKNavigationDelegate {
    27. let parent: WebView
    28. init(_ parent: WebView) {
    29. self.parent = parent
    30. }
    31. func webView(_ webView: WKWebView, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) {
    32. guard let serverTrust = challenge.protectionSpace.serverTrust else {
    33. completionHandler(.cancelAuthenticationChallenge, nil)
    34. return
    35. }
    36. let exceptions = SecTrustCopyExceptions(serverTrust)
    37. if !SecTrustSetExceptions(serverTrust, exceptions) {
    38. print("SecTrustSetExceptions failed!")
    39. }
    40. if !SecTrustEvaluateWithError(serverTrust, nil) {
    41. print("SecTrustEvaluateWithError failed!")
    42. }
    43. completionHandler(.useCredential, URLCredential(trust: serverTrust));
    44. }
    45. }
    46. }
    47. struct ContentView: View {
    48. let request: URLRequest = myRequest
    49. var body: some View {
    50. WebView(request: request)
    51. .edgesIgnoringSafeArea(.all)
    52. }
    53. }
    Alles anzeigen

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Gibbsnich ()