用户进入主屏幕后不使用Firebase保持用户登录

时间:2020-07-20 22:17:29

标签: ios swift authentication logging

我尝试不使用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主屏幕之后,是否可以保持用户登录状态?或者它需要在后端完成。 让我知道您是否需要其他说明!我很高兴澄清!

2 个答案:

答案 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)
        }
   }