当用户登录时,我将一些值存储到userDefaults中,并在主屏幕上检查用户是否已经登录。使用userDefaults或其他任何方法检查用户登录状态是否是个好主意。
如果一条数据不敏感(例如,默认字体大小),请将其存储在NSUserDefaults中。
如果需要保护其免受随意监听(例如,用户密码)的影响,请将其存储在钥匙串中。
如果它需要对用户安全(例如,注册代码),则需要滚动自己的加密,然后将数据存储在任何您喜欢的位置。
在普通的iPhone和iPad中,它可以安全地存储在UserDeafaults
中,但在越狱设备中,可以轻松获取这些数据。这就是为什么首选将敏感数据存储到Keychain中。
是的,您可以在Userdefaults中保存访问令牌或用户ID,并检查用户是否登录。如果用户已经登录,则用于导航到主页或任何其他用户。您可以在Appdelegate中编写导航代码。
是的,UserDefaults是存储不大的信息的最佳方式。您可以将用户首选项存储在UserDefaults中。
通常,在AppDelegate中使用didFinishLaunching方法,您可以执行以下操作:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
if UserDefaults.standard.value(forKey: "userId") != nil {
/// etc.
}
return true
}
我宁愿建议使用Keychain而不是UserDefaults。
钥匙串是一个加密容器,用于存放多个应用程序和安全服务的密码。 Apple Inc.在Mac OS和iOS中使用钥匙串作为密码管理系统。
话虽如此,所有敏感信息都应该发送到Keychain。 根据您每次检查用户状态的观点,这是正确的方法。移动应用程序通常不会每次显示登录屏幕,除非它是像银行业务那样的关键应用程序。
var isUserLoggedIn: Bool {
return UserDefaults.standard.value(forKey: "userDetail") != nil
}
var currentUser : [String:Any] {
set{
guard let unwrappedKey = newValue else{
return
}
UserDefaults.standard.set(unwrappedKey, forKey: "userDetail")
UserDefaults.standard.synchronize()
} get {
guard let userDict = UserDefaults.standard.object(forKey:"userDetail") else {
return nil
}
return userDict
}
}
func removeCurrentUser(){
if UserDefaults.standard.value(forKey: "userDetail") != nil {
UserDefaults.standard.removeObject(forKey: "userDetail")
UserDefaults.standard.synchronize()
}
}
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
if isUserLoggedIn {
//etc..
}
return true
}
现在,您可以使用isUserLoggedIn
属性检查用户是否登录。您还可以创建用户模型类。