如何仅在 userdefaults 密钥不存在时显示登录屏幕?

How to present login screen only when a userdefaults key doesn't exist?

我正在尝试开发一个应用程序(仍在学习中),我在其中显示一个需要用户名和密码的登录屏幕 - 然后转到 Web 服务进行身份验证和 returns 访问令牌。

然后将访问令牌存储在 userdefaults 中,然后呈现一个新的视图控制器,它可以访问受保护的数据。

我的问题是,当我关闭我的应用程序时 - 强制关闭,然后它要求重新登录。

因为我的登录视图控制器是初始视图控制器,所以我添加了一个检查以查看访问令牌是否存在于 userdefaults 中,并显示允许访问受保护数据的新视图控制器。现在我的问题是登录屏幕总是在我的安全视图控制器后面打开,所以当从头开始打开应用程序时,您可以在它显示安全视图控制器之前短暂地看到登录视图控制器。

理想情况下,我将如何处理这个问题,当用户默认密钥存在时,初始视图控制器是否设置为安全视图控制器 - 但是这样做我将如何处理注销功能,因为我需要 'pop' 到根视图控制器并清除用户默认值,但是由于登录屏幕不在视图层次结构中,所以我不能 return 到这个?如果它在注销时显示登录视图控制器,那么安全视图控制器仍然存在于登录视图控制器下。

抱歉,这有点啰嗦,只是想描述我遇到的问题。

谢谢

你只需要在Appdelegate.swiftapplication(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?)方法中判断即可。

但前提是你要手动操作window:

在您的 info.plist 中删除此行:

然后在您的 AppDelegate.swift 中您可以手动设置 window:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.

    self.window = UIWindow.init(frame: UIScreen.main.bounds)

    let sb:UIStoryboard = UIStoryboard.init(name: "Main", bundle: nil)

    let isLogin:Bool = UserDefaults.standard.bool(forKey: "isLogin")
    if isLogin {

        let vc2 = sb.instantiateViewController(withIdentifier: "ViewController2")

        self.window?.rootViewController = vc2
    }else {
        let vc1 = sb.instantiateViewController(withIdentifier: "ViewController")
        self.window?.rootViewController = vc1
    }

    self.window?.makeKeyAndVisible()

    return true
}

而在你的ViewController.swift(你可以把它当作LoginVc):

override func viewDidLoad() {
    super.viewDidLoad()

    /* add userdefaults */

    UserDefaults.standard.set(true, forKey: "isLogin")
    UserDefaults.standard.synchronize()

}