有谁知道用应该显示单个页面的 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 的深层链接的最佳方法是什么?我很欣赏一些例子。
提前致谢。
两种处理方式:
对于您希望在处理 deeplink 时呈现的 ViewController 设置一个初始化程序,该初始化程序采用 deeplink 中包含的信息。并设置您需要设置的任何内容来处理该信息(您似乎已经完成了)。现在在您的 handleIncomingDynamicLink()
中实例化我们提到的 ViewController 并使其呈现。您将如何让它自己呈现取决于您设置的导航逻辑。
AppDelegate 接收 link-> 处理它->实例化 VC 并呈现它-> 相应地做事
在您的 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 以了解如何获取最顶层的视图控制器
有没有人有处理深层链接的好主意? 我想将需要来自 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 的深层链接的最佳方法是什么?我很欣赏一些例子。
提前致谢。
两种处理方式:
对于您希望在处理 deeplink 时呈现的 ViewController 设置一个初始化程序,该初始化程序采用 deeplink 中包含的信息。并设置您需要设置的任何内容来处理该信息(您似乎已经完成了)。现在在您的
handleIncomingDynamicLink()
中实例化我们提到的 ViewController 并使其呈现。您将如何让它自己呈现取决于您设置的导航逻辑。AppDelegate 接收 link-> 处理它->实例化 VC 并呈现它-> 相应地做事
在您的
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 以了解如何获取最顶层的视图控制器