为何createUser方法会触发AppDelegate中的addStateDidChangeListener方法?
在AppDelegate中实现启动时根据登录状态跳转页面
我来帮你完善这段代码,实现App启动时自动判断用户登录状态,跳转到对应的界面。下面是完整的实现方案,包含Firebase初始化、登录状态判断和界面跳转的逻辑:
@UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { // 初始化Firebase(确保已正确集成Firebase并添加GoogleService-Info.plist) FirebaseApp.configure() // 初始化window并设置为可见(适配iOS 13以下版本,iOS 13+若使用SceneDelegate可调整逻辑) window = UIWindow(frame: UIScreen.main.bounds) window?.makeKeyAndVisible() // 判断用户登录状态:这里以Firebase Auth为例,你也可以替换为自定义的登录标记(如UserDefaults) let isUserLoggedIn = Auth.auth().currentUser != nil // 自定义存储示例:let isUserLoggedIn = UserDefaults.standard.bool(forKey: "userHasLoggedIn") // 根据登录状态设置根视图控制器 let rootViewController: UIViewController if isUserLoggedIn { // 实例化你的主标签栏控制器(替换为你项目中实际的类名) rootViewController = TabBarController() // 如果是从Storyboard加载: // rootViewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "MainTabBarVC") } else { // 实例化欢迎界面控制器(替换为你项目中实际的类名) rootViewController = WelcomeViewController() // 如果是从Storyboard加载: // rootViewController = UIStoryboard(name: "Welcome", bundle: nil).instantiateViewController(withIdentifier: "WelcomeVC") } window?.rootViewController = rootViewController return true } // 若你的项目支持iOS 13+的SceneDelegate,需额外处理场景连接逻辑 // func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration { // return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role) // } }
关键细节说明:
- Firebase集成:确保你已经通过CocoaPods或Swift Package Manager集成了Firebase Auth,并且将
GoogleService-Info.plist添加到项目中。 - 登录状态判断:如果不用Firebase Auth,你可以用
UserDefaults存储登录状态标记(比如用户登录成功后设置UserDefaults.standard.set(true, forKey: "userHasLoggedIn"),退出时设为false)。 - iOS 13+适配:如果你的项目使用了
SceneDelegate(Xcode 11及以上创建的默认项目),需要将登录判断的逻辑移到SceneDelegate的scene(_:willConnectTo:options:)方法中,替换window的根视图控制器逻辑。 - 视图控制器实例化:如果你的控制器是通过Storyboard创建的,记得替换代码中的实例化方式为从Storyboard加载的代码,并确保Storyboard中设置了正确的控制器标识符。
内容的提问来源于stack exchange,提问作者Agung
相关产品推荐
相关产品推荐

