我尝试不使用Firebase保持用户登录。我查找了不同的帖子,除了使用firebase之外,找不到正确的方法。
@IBAction func LoginTapped(_ sender: Any) {
let authService = AuthenticationService()
emailTextfield.resignFirstResponder()
passwordTextfield.resignFirstResponder()
authService.loginUser(email: email, password: password) { (isManager) in
if let isManager = isManager {
let storyboard = UIStoryboard(name: "Main", bundle: nil)
DispatchQueue.main.async {
var viewController:UIViewController
if isManager{
viewController = storyboard.instantiateViewController(identifier: "managerEntryViewController")
}else{
viewController = storyboard.instantiateViewController(identifier: "clientEntryViewController")
}
viewController.modalPresentationStyle = .fullScreen
self.present(viewController, animated: true)
}
} else {
DispatchQueue.main.async {
self.alertError()
}
}
}
}
在AuthenticationService()中,已经创建了为已经登录的用户创建令牌的功能。我想在令牌是否有效的位置创建逻辑。
fileprivate func saveToken(token: String) {
UserDefaults.standard.set(token, forKey: NetworkConstants.tokenKey)
}
当前的登录功能使用“ authService”作为与后端通信以传递电子邮件和密码的方式。在用户不使用Firebase进入Xcode主屏幕之后,是否可以保持用户登录状态?或者它需要在后端完成。 让我知道您是否需要其他说明!我很高兴澄清!
答案 0 :(得分:1)
您可以使用UserDefaults
存储一个值,该值对应于告诉您用户已登录。这是在UserDefaults
中存储值的方法。
设置:
UserDefaults.standard.set(true, forKey: "isLoggedIn")
检索:
let isLoggedIn = UserDefaults.standard.bool(forKey: "isLoggedIn")
答案 1 :(得分:1)
1。创建助手类:
class UserHelper: NSObject {
private static let userDefault = UserDefaults.standard
public static var USER_TOKEN: TokenModel? {
get {
if let data = userDefault.value(forKey: "USER_TOKEN")as Data {
let _token = try? PropertyListDecoder().decode(TokenModel.self, from: data)
return _token
}
return nil
}
set {
userDefault.set(try? PropertyListEncoder().encode(newValue), forKey: "USER_TOKEN")
}
}
public static var USER: UserModel? {
get {
if let data = userDefault.object(forKey: "USER") as? Data {
let _user = try? PropertyListDecoder().decode(UserModel.self, from: data)
return _user
}
return nil
}
set {
guard let value = newValue else {
return
}
if let data = try? PropertyListEncoder().encode(value) {
userDefault.set(data, forKey: "USER")
}
}
}
public static func removeAll() {
userDefault.removePersistentDomain(forName: Bundle.main.bundleIdentifier!)
userDefault.synchronize()
}
}
2。用法:
保存对象
let data: UserModel = YOUR_DATA
UserHelper.USER = data
检索对象
if let user = UserHelper.USER {
print("name of user = ", user.name)
}
删除对象
UserHelper.removeAll()
3。型号:
struct UserModel: Codable {
let id: Int
let name: String
let email: String
private enum CodingKeys: String, CodingKey {
case id, name, email
}
init(from decoder: Decoder) throws {
let container = decoder.container(keyedBy: CodingKeys.self)
id = try container.decode(Int.self, forKey: .id)
name = try container.decode(String.self, forKey: .name)
email = try container.decode(String.self, forKey: .email)
}
}
struct TokenModel: Codable {
let access_token: String
let token_type: String
enum CodingKeys: String, CodingKey {
case access_token
case token_type
}
init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
access_token = try container.decode(String.self, forKey: .access_token)
token_type = try container.decode(String.self, forKey: .token_type)
}
}