1

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

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

我的问题是,当我关闭我的应用程序 - 强制关闭时,它会要求再次登录。

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

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

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

谢谢

4

1 回答 1

3

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

但前提是你应该手动操作窗口:

删除你的这一行info.plist在此处输入图像描述

然后在你的AppDelegate.swift你可以手动设置你的窗口:

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()

}
于 2017-01-26T02:09:42.727 回答