Учетные данные для входа отсутствуют в swift UserDefaults - PullRequest
0 голосов
/ 29 мая 2018

У меня есть приложение, которое использует api rest для аутентификации.Проблема, с которой я сейчас сталкиваюсь, заключается в том, что я сохраняю токен пользователя в своих UserDefaults и имя пользователя, потому что это два основных параметра, необходимых для получения сведений о пользователе.таким образом, если приложение закрыто пользователем, он все равно должен иметь возможность просматривать его профиль при открытии приложения, но вместо этого профиль возвращает пустые данные.это коды UserDefaults, которые у меня есть

let defaults = UserDefaults.standard

var isLoggedIn : Bool {

    get {
        return defaults.bool(forKey: LOGGED_IN_KEY)
    }
    set {
        defaults.set(newValue, forKey: LOGGED_IN_KEY)
    }
}

//Auth Token

var authToken: String {
    get {
        return defaults.value(forKey: TOKEN_KEY) as? String ?? ""
    }
    set {
        defaults.set(newValue, forKey: TOKEN_KEY)
    }
}

var userUsername: String {
    get {
        return defaults.value(forKey: USERNAME_KEY) as? String ?? ""
    }
    set {
        defaults.set(newValue, forKey: USERNAME_KEY)
    }
}

Я понятия не имею, почему он не получает данные пользователя.

Мой второй вопрос: когда я выхожу из системы, все данные пользователя очищаются, как и ожидалось, но в тот момент, когда я пытаюсь войти в систему с другим пользователем, authToken нового пользователя и детали выводятся на консоль, но пользовательпрофиль возвращает профиль предыдущего человека.что не должно быть.мой код показан ниже

func logoutUser() -> Void {
    pk = 0
    username = ""
    email = ""
    firstName = ""
    lastName = ""
    AuthService.instance.isLoggedIn = false
    AuthService.instance.authToken = ""
    AuthService.instance.userUsername = ""

}

@IBAction func logoutPressed(_ sender: Any) {
    UserDataService.instance.logoutUser()
    dismiss(animated: true, completion: nil)
}

Я также хотел бы добавить, что когда я запускаю API, используя почтальон, я получаю ответ, "detail": "Signature has expired.", поэтому мне пришлось ввести новый токен в заголовок, чтобы он отображалданные пользователя снова

1 Ответ

0 голосов
/ 29 мая 2018
enum SettingKeys: String {
    case authToken
    //...
}

struct Settings {

    static var authToken: String? {
        get { return UserDefaults.standard.string(forKey: SettingKeys.authToken.rawValue) }
        set(value) { UserDefaults.standard.set(value, forKey: SettingKeys.authToken.rawValue) }
    }

    static func deleteAll(exclude: [SettingKeys] = []) {
        var saveKeys = exclude.map({ $0.rawValue })
        for key in UserDefaults.standard.dictionaryRepresentation().keys {
            if !saveKeys.contains(key) {
                UserDefaults.standard.removeObject(forKey: key)
            }
        }
    }
}

Я рекомендую хранить ключи как Enum, потому что тогда вы можете использовать его следующим образом:

//Read
if let token = Settings.authToken {
    //do something
}

//Write
Settings.authToken = "123456"

//Delete settings
Settings.deleteAll()

//or choose what to leave
Settings.deleteAll(exclude: [.authToken])

И стоит отметить, что defaults.synchronize() устарело.

...