Swift中实现登录后跳转DeepLink目标页面而非首页的方法
Swift中未登录用户登录后跳转DeepLink目标页面的实现方案
核心思路
先临时保存未登录时收到的DeepLink目标信息,等用户登录成功后,再根据保存的信息跳转到指定页面,而非默认首页。
具体实现步骤
1. 临时存储DeepLink参数
处理通知点击事件时,先判断用户登录状态:- 已登录:直接解析UserInfo跳转到目标页面;
- 未登录:把UserInfo里的DeepLink关键信息(比如目标页面标识、必要参数)存到
UserDefaults或自定义单例存储类中。
示例代码:
// 处理通知点击的方法 func handleNotificationTap(userInfo: [AnyHashable: Any]) { let isLoggedIn = UserDefaults.standard.bool(forKey: "isLoggedIn") guard !isLoggedIn else { // 已登录,直接跳转目标页面 navigateToTarget(from: userInfo) return } // 未登录,保存DeepLink信息 if let deepLinkData = userInfo["deepLink"] as? [String: Any] { UserDefaults.standard.set(deepLinkData, forKey: "pendingDeepLink") } // 跳转到登录页 let loginVC = LoginViewController() UIApplication.shared.keyWindow?.rootViewController?.present(loginVC, animated: true) }2. 登录成功后处理待跳转的DeepLink
在登录页面的登录成功回调里,检查是否有保存的待处理DeepLink:- 若存在:解析信息跳转到对应页面,跳转完成后清空存储的参数;
- 若不存在:正常跳转到首页。
示例代码:
// 登录成功的回调方法 func loginSuccess() { // 更新登录状态 UserDefaults.standard.set(true, forKey: "isLoggedIn") // 检查待处理的DeepLink if let pendingDeepLink = UserDefaults.standard.dictionary(forKey: "pendingDeepLink") { // 解析并跳转到目标页面 navigateToTarget(from: pendingDeepLink) // 清空存储,避免重复跳转 UserDefaults.standard.removeObject(forKey: "pendingDeepLink") } else { // 无待处理DeepLink,跳转到首页 let homeVC = HomeViewController() UIApplication.shared.keyWindow?.rootViewController = UINavigationController(rootViewController: homeVC) } }3. 统一跳转逻辑封装
把根据DeepLink信息跳转页面的逻辑封装成单独方法,方便复用:func navigateToTarget(from data: [String: Any]) { guard let target = data["target"] as? String else { return } switch target { case "inbox": let inboxVC = InboxViewController() // 根据你的导航架构调整跳转方式,比如push或替换根控制器 if let navVC = UIApplication.shared.keyWindow?.rootViewController as? UINavigationController { navVC.pushViewController(inboxVC, animated: true) } case "profile": let profileVC = ProfileViewController() // 其他页面跳转逻辑 default: // 默认跳首页 let homeVC = HomeViewController() UIApplication.shared.keyWindow?.rootViewController = UINavigationController(rootViewController: homeVC) } }
注意点
- 存储的DeepLink信息只保留必要的目标标识和参数,不要存敏感数据;
- 针对iOS 13+的SceneDelegate场景,需要在
sceneDidBecomeActive里也检查一次待处理DeepLink,避免App后台登录完成后无法触发跳转; - 跳转页面时要根据App的导航架构调整(比如导航栈push、替换根控制器或present),确保页面跳转逻辑符合App整体流程。
内容的提问来源于stack exchange,提问作者lauwis
相关产品推荐
相关产品推荐

