我设置了深层链接,当我的应用程序位于前台或后台时,它在两种情况下都会触发以下回调。现在我有 Splash View Controller、Login View Controller 和 Tabbarviewcontroller。我希望当用户来到 Tabbarviewcontroller 然后决定目标视图控制器时,在启动或登录中发生的所有身份验证都应该工作相同并且在成功登录时。我已经尝试过通知、用户默认值,但它们没有像我想要的那样工作。我想在两种情况下处理这种情况:背景/前景。
func application(_: UIApplication, continue userActivity: NSUserActivity, restorationHandler _: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
guard userActivity.activityType == NSUserActivityTypeBrowsingWeb,
let url = userActivity.webpageURL else {
return false
}
handleUniversalLink(url: url)
return true
}
private func handleUniversalLink(url: URL) {
UniversalLinkManager.sharedManager.handleUniversalLink(url: url)
}
------------------------------------------------------------------------------------------------------------------------
import Foundation
class UniversalLinkManager {
static let sharedManager = UniversalLinkManager()
func handleUniversalLink(url: URL) {
var queryParams: [String: String?] = [:]
if let components = NSURLComponents(url: url, resolvingAgainstBaseURL: true),
let params = components.queryItems {
for param in params {
queryParams[param.name] = param.value
}
}
UserDefaults.standard.set("test", forKey: "serviceInfo")
}
}
我发现这个问题的解决方案是这样的:
1 - 声明我们将发布的通知:
extension Notification.Name {
static let AppLoadingCompleted = Notification.Name(rawValue: "AppLoadingCompleted")
}
2 - 当主视图控制器出现时发布此通知。
var isFirstAppear = true
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
if isFirstAppear {
NotificationCenter.default.post(name: .AppLoadingCompleted, object: nil, userInfo: nil)
isFirstAppear = false
}
}
3 - 设置 SceneDelegate 来观察此通知。您可以在
willConnectTo
函数中执行此操作:
NotificationCenter.default.addObserver(self, selector: #selector(appLoadingCompleted), name: .AppLoadingCompleted, object: nil)
4 - 在 sceneDelegate 中声明
@objc appLoadingCompleted
函数。它将在应用程序完全加载后调用。
5 - 剩下的就很简单了。您应该在 sceneDelegate 中声明
pendingUniversalLink
,然后在 willConnectTo
或 continue
函数中收到它时设置它。当您的主视图控制器出现时,将调用 appLoadingCompleted
,您可以执行之后的操作。