有谁知道用应该显示单个页面的 id 来处理深层链接吗?

Does anyone have good idea to handle the deeplink with the id which is supposed to show the single page?

有没有人有处理深层链接的好主意? 我想将需要来自 HomeViewcontroller 的 id(或者任何东西都可以)的单个页面视图推送到具有我从深层链接获得的 id 的单个页面。

我目前的情况是,我可以通过如下方式在AppDelegate文件中获取deeplink和里面的id。

func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([Any]?) -> Void) -> Bool {
    if let incomingURL = userActivity.webpageURL {
        let linkHandled = DynamicLinks.dynamicLinks()!.handleUniversalLink(incomingURL) { [weak self](dynamiclink, error) in
            guard let strongSelf = self else { return }
            if let dynamiclink = dynamiclink, let _ = dynamiclink.url {
                strongSelf.handleIncomingDynamicLink(dynamicLink: dynamiclink)
            }
        }
        return linkHandled
    }
    return false
}

func handleIncomingDynamicLink(dynamicLink: DynamicLink) {
    guard let pathComponents = dynamicLink.url?.pathComponents else {
        return
    }

    if pathComponents.count > 1 {

        for (i, value) in pathComponents.enumerated() {
            if i == 1 {
                // define whether the deeplink is for topic or post
                UserDefaults.standard.set(value, forKey: "deepLinkType")
                print(value)
            } else if i == 2 {
                UserDefaults.standard.set(value, forKey: "deepLinkId")
                print(value)
            }
        }
    }

}

然后在HomeViewController中viewDidAppear

        if (self.isViewLoaded && (self.view.window != nil)) {
        let us = UserDefaults.standard

        if let deepLinkType = us.string(forKey: "deepLinkType"), let deepLinkId = us.string(forKey: "deepLinkId"){

            us.removeObject(forKey: "deepLinkType")
            us.removeObject(forKey: "deepLinkId")

            if deepLinkType == "topic" {

                let storyboard = UIStoryboard(name: "Topic", bundle: nil)
                let nextVC = storyboard.instantiateViewController(withIdentifier: "SingleKukaiVC") as! TopicViewController
                nextVC.topicKey = deepLinkId

                self.navigationController?.pushViewController(nextVC, animated: true)

            } else if deepLinkType == "post" {

            }
        }
    }

当应用程序既不在前台也不在后台时,这工作正常我的意思是如果它没有被实例化。但是,当应用程序被实例化时,这不起作用,因为不会读取 viewDidAppear。如果用户打开了另一个视图,甚至 HomeViewController 本身也不会被调用。

所以我的问题是,处理具有单页 ID 的深层链接的最佳方法是什么?我很欣赏一些例子。

提前致谢。

两种处理方式:

  1. 对于您希望在处理 deeplink 时呈现的 ViewController 设置一个初始化程序,该初始化程序采用 deeplink 中包含的信息。并设置您需要设置的任何内容来处理该信息(您似乎已经完成了)。现在在您的 handleIncomingDynamicLink() 中实例化我们提到的 ViewController 并使其呈现。您将如何让它自己呈现取决于您设置的导航逻辑。

    AppDelegate 接收 link-> 处理它->实例化 VC 并呈现它-> 相应地做事

  2. 在您的 handleIncomingDynamicLink() 中使用 NotificationCenter 到 post 包含信息的通知。在您的 ViewController 中为该通知添加一个观察者,并定义收到通知后您需要做的任何事情。

    AppDelegate 接收 link->处理它->触发通知->VC 侦听通知->相应地做事

不要编写代码来在 HomeViewController 中推送主题视图控制器。

在 App Delegate 的 handleIncomingDynamicLink 方法中,获取最顶层的视图控制器,然后创建视图控制器(如在您的代码中),然后从最顶层的视图控制器推送它。

Your code to create Topic View Controller:
let storyboard = UIStoryboard(name: "Topic", bundle: nil)
                let nextVC = storyboard.instantiateViewController(withIdentifier: "SingleKukaiVC") as! TopicViewController
                nextVC.topicKey = deepLinkId

检查 URL 以了解如何获取最顶层的视图控制器