点击“通用链接”,在我的应用内打开WKWebView

时间:2019-12-20 10:13:42

标签: ios swift4 wkwebview xcode11 ios-universal-links

我在Swift 4中创建了一个自制的PWA应用,以使用诸如Firebase和Notify之类的选项浏览我的网站
在Safari中打开网站或用户单击朋友共享的通用链接时,我需要打开我的应用程序。
我使用apple-app-site-association正确设置了网站,并且可以正常工作,当我在Safari中打开相对网址时,它向我显示了打开我的应用程序的提示。
但是问题是当我尝试在Safari中出现的提示之间打开应用程序时尝试处理通用链接时,我尝试使用了此链接(如Apple文档所说的universal-link

func application(_ application: UIApplication,
          continue userActivity: NSUserActivity,
          restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool{

要更改我的WKWebView,我使用了基于this答案的代码。
这是我的func continue中的AppDelegate代码,用于更改WebView网址:

if(userActivity.webpageURL != nil){
    g_url = userActivity.webpageURL // g_url is declared at top as 'var g_url: URL?'
    let notificationName = NSNotification.Name(rawValue: "updateUrl")
    NotificationCenter.default.post(name: notificationName, object: nil)
    return true
}else{
    return false
}

以下是在ViewController中设置网址的代码:

let appDelegate = UIApplication.shared.delegate as! AppDelegate
url = appDelegate.g_url

let notificationName = Notification.Name("updateUrl")
NotificationCenter.default.addObserver(self, selector: #selector(ViewController.updateUrl), name: notificationName, object: nil)

updateUrl()


updateUrl:     @objc func updateUrl(){

    let appDelegate = UIApplication.shared.delegate as! AppDelegate
    if(appDelegate.g_url != nil){
        url = appDelegate.g_url!
    }else{
        url = URL(string: "https://my.Site/Home")!
    }
    let request = URLRequest(url: url)
    MyWebView.load(request)

    MyWebView.navigationDelegate = self

当Safari调用应用程序时,WebView页面是最后一个打开的页面,如果是第一次打开,则为“主页”。
我需要了解是否错过了一些东西,或者是否应该使用其他东西来做这个

1 个答案:

答案 0 :(得分:0)

由于IOS 13的最新更新,代码无法正常工作。 AppDelegate 中的 continue 函数没有被调用,而是在 SceneDelegate 中添加了 continue 函数。 我使用旧模式获取url参数(仅适用于一个场景):

private(set) static var shared: SceneDelegate?
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
    guard let _ = (scene as? UIWindowScene) else { return }
    Self.shared = self
}

在我设置的ViewController代码中

let appDelegate = SceneDelegate.shared?.g_url

获取变量,并通过观察者调用更改

let notificationName = Notification.Name("updateUrl")
    NotificationCenter.default.addObserver(self, selector: #selector(ViewController.updateUrl), name: notificationName, object: nil)