如何仅在 userdefaults 密钥不存在时显示登录屏幕?
How to present login screen only when a userdefaults key doesn't exist?
我正在尝试开发一个应用程序(仍在学习中),我在其中显示一个需要用户名和密码的登录屏幕 - 然后转到 Web 服务进行身份验证和 returns 访问令牌。
然后将访问令牌存储在 userdefaults 中,然后呈现一个新的视图控制器,它可以访问受保护的数据。
我的问题是,当我关闭我的应用程序时 - 强制关闭,然后它要求重新登录。
因为我的登录视图控制器是初始视图控制器,所以我添加了一个检查以查看访问令牌是否存在于 userdefaults 中,并显示允许访问受保护数据的新视图控制器。现在我的问题是登录屏幕总是在我的安全视图控制器后面打开,所以当从头开始打开应用程序时,您可以在它显示安全视图控制器之前短暂地看到登录视图控制器。
理想情况下,我将如何处理这个问题,当用户默认密钥存在时,初始视图控制器是否设置为安全视图控制器 - 但是这样做我将如何处理注销功能,因为我需要 'pop' 到根视图控制器并清除用户默认值,但是由于登录屏幕不在视图层次结构中,所以我不能 return 到这个?如果它在注销时显示登录视图控制器,那么安全视图控制器仍然存在于登录视图控制器下。
抱歉,这有点啰嗦,只是想描述我遇到的问题。
谢谢
你只需要在Appdelegate.swift
的application(_ 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()
}
我正在尝试开发一个应用程序(仍在学习中),我在其中显示一个需要用户名和密码的登录屏幕 - 然后转到 Web 服务进行身份验证和 returns 访问令牌。
然后将访问令牌存储在 userdefaults 中,然后呈现一个新的视图控制器,它可以访问受保护的数据。
我的问题是,当我关闭我的应用程序时 - 强制关闭,然后它要求重新登录。
因为我的登录视图控制器是初始视图控制器,所以我添加了一个检查以查看访问令牌是否存在于 userdefaults 中,并显示允许访问受保护数据的新视图控制器。现在我的问题是登录屏幕总是在我的安全视图控制器后面打开,所以当从头开始打开应用程序时,您可以在它显示安全视图控制器之前短暂地看到登录视图控制器。
理想情况下,我将如何处理这个问题,当用户默认密钥存在时,初始视图控制器是否设置为安全视图控制器 - 但是这样做我将如何处理注销功能,因为我需要 'pop' 到根视图控制器并清除用户默认值,但是由于登录屏幕不在视图层次结构中,所以我不能 return 到这个?如果它在注销时显示登录视图控制器,那么安全视图控制器仍然存在于登录视图控制器下。
抱歉,这有点啰嗦,只是想描述我遇到的问题。
谢谢
你只需要在Appdelegate.swift
的application(_ 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()
}