C

cb109

Mitglied

Zuletzt aktiv vor 5 Wochen

  1. vor 5 Wochen
    j M Y, g:ia \G\M\TO
    C cb109 schrieb in Universal Link > WKWebView.

    Ich konnte mein Problem lösen, indem ich im AppDelegate das NotificationCenter nutze um mit dem ViewController zu kommunizieren, anscheinend gibt es dort dann keine Race Condition mit der View und alles klappt wie erwünscht. Im ViewController setze ich einen Callback der die URL des Universal Links vom AppDelegate ausliest und in der webView lädt.

  2. j M Y, g:ia \G\M\TO
    C cb109 beginnt die Unterhaltung Universal Link > WKWebView.

    Moin zusammen,

    ich hab eine einfache iOS App die unsere Webapplikation in einer WKWebView lädt, d.h. beim Start der App wird programmatisch eine WKWebView erzeugt und initial eine Standard-URL geladen.

    Ich habe nun Universal Links eingerichtet, d.h. eine apple-app-site-association Datei auf unserem Server deployed und ein entsprechedes Entitlement im XCode Projekt eingerichtet - das tut soweit auch, ein Klick z.B. im Mailprogramm bietet meine App als Alternative zu Safari zum Öffnen an.

    Hier ist der relevante Code:

    // AppDelegate.swift
    
    @UIApplicationMain
    class AppDelegate: UIResponder, UIApplicationDelegate {
    
        var vc = ViewController()
        var window: UIWindow?
    
        func application(_ application: UIApplication, 
                                     continue userActivity: NSUserActivity, 
                                     restorationHandler: @escaping ([Any]? -> Void) -> Bool {
            if userActivity.activityType == NSUserActivityTypeBrowsingWeb {
                vc.loadUrlInWebView(url: userActivity.webPageUrl!)
            }
            return true
        }
    }
    
    
    // ViewController.swift
    
    class ViewController: UIViewController, WKUIDelegate, WKNavigationDelegate {
    
        var webView: WKWebView!
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            webView = WKWebView(frame: .zero, configuration: WKWebViewConfiguration())
            webView?.uiDelegate = self
            webView?.navigationDelegate = self
            view = webView
    
            let url = NSURL(string: "https://whatever.com/app")
            loadUrlInWebView(url)
        }
    
        func loadUrlInWebView() {
            loadViewIfNeeded()
            
            request = NSURL(Request(url: url! as URL)
            webView.loadRequest(request as URLRequest)
        }
    }

    Mein Problem ist Folgendes: Ich möchte dass innerhalb der App nun exakt die URL in der WKWebView geladen wird, die der User angeklickt hat, *nicht* die Standard URL. Aktuell versuche ich das, indem ich im AppDelegate eine Referenz auf den rootViewController hole und dort in einem Funktionsaufruf die URL des Universal Links übergebe.

    Wenn ich das einfach so mache schmiert mir die App ab, vermutlich weil die webView bei Aufruf durch den appDelegate noch nicht/nicht mehr geladen ist? Wenn ich ein loadViewIfNeeded() davor hänge läuft alles durch und angeblich wird die URL geladen, optisch ändert sich jedoch nichts und die Standard-URL bleibt die aktuelle Seite. Vielleicht erzeuge ich implizit eine zweite webView?

    Ich möchte im Grunde nur die Universal Link URL in die WKWebView durchschleifen, vermutlich mache ich das einfach auf die falsche Art und Weise. Bin für jeden Tipp dankbar!

    Grüße

  3. j M Y, g:ia \G\M\TO
    C cb109 ist dem Forum beigetreten.