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:
Alles anzeigen
Code mit SwiftUI:
Alles anzeigen
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
- import UIKit
- import WebKit
- let server = "https://#####.selfhost.eu:9999"
- let url = URL(string: server)
- let myRequest = URLRequest(url: url!)
- class ViewController: UIViewController, WKNavigationDelegate {
- @IBOutlet weak var webView: WKWebView!
- override func viewDidLoad() {
- super.viewDidLoad()
- webView.navigationDelegate = self
- webView.allowsBackForwardNavigationGestures = true
- webView.allowsLinkPreview = true
- webView.load(myRequest)
- }
- func webView(_ webView: WKWebView, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) {
- guard let serverTrust = challenge.protectionSpace.serverTrust else {
- completionHandler(.cancelAuthenticationChallenge, nil)
- return
- }
- let exceptions = SecTrustCopyExceptions(serverTrust)
- SecTrustSetExceptions(serverTrust, exceptions)
- completionHandler(.useCredential, URLCredential(trust: serverTrust));
- }
- }
Code mit SwiftUI:
Quellcode
- import SwiftUI
- import WebKit
- let server = "https://#####.selfhost.eu:9999"
- let url = URL(string: server)
- let myRequest = URLRequest(url: url!)
- struct WebView: UIViewRepresentable {
- let request: URLRequest
- private var myWebView: WKWebView
- init(request: URLRequest) {
- // Minimaler Frame, weil sonst ein Warnhinweis in der Konsole kommt!
- self.myWebView = WKWebView(frame: CGRect(x: 0.0, y: 0.0, width: 0.1, height: 0.1))
- self.request = request
- }
- func makeUIView(context: Context) -> WKWebView {
- return myWebView
- }
- func updateUIView(_ uiView: WKWebView, context: Context) {
- uiView.navigationDelegate = context.coordinator
- uiView.allowsBackForwardNavigationGestures = true
- uiView.allowsLinkPreview = true
- uiView.load(request)
- }
- func makeCoordinator() -> Coordinator {
- Coordinator(self)
- }
- class Coordinator: NSObject, WKNavigationDelegate {
- let parent: WebView
- init(_ parent: WebView) {
- self.parent = parent
- }
- func webView(_ webView: WKWebView, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) {
- guard let serverTrust = challenge.protectionSpace.serverTrust else {
- completionHandler(.cancelAuthenticationChallenge, nil)
- return
- }
- let exceptions = SecTrustCopyExceptions(serverTrust)
- if !SecTrustSetExceptions(serverTrust, exceptions) {
- print("SecTrustSetExceptions failed!")
- }
- if !SecTrustEvaluateWithError(serverTrust, nil) {
- print("SecTrustEvaluateWithError failed!")
- }
- completionHandler(.useCredential, URLCredential(trust: serverTrust));
- }
- }
- }
- struct ContentView: View {
- let request: URLRequest = myRequest
- var body: some View {
- WebView(request: request)
- .edgesIgnoringSafeArea(.all)
- }
- }
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Gibbsnich ()