Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/121.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios swift UserDefault中缺少登录凭据_Ios_Swift_Userdefaults - Fatal编程技术网

Ios swift UserDefault中缺少登录凭据

Ios swift UserDefault中缺少登录凭据,ios,swift,userdefaults,Ios,Swift,Userdefaults,我有一个使用RESTAPI进行身份验证的应用程序。我现在面临的问题是,我也将用户的令牌保存在UserDefaults和username中,因为这是获取用户详细信息所需的两个主要参数。因此,如果用户关闭了应用程序,那么当他重新打开应用程序时,他应该仍然能够查看其配置文件,但是配置文件返回空的详细信息。这是我的UserDefaults代码 let defaults = UserDefaults.standard var isLoggedIn : Bool { get {

我有一个使用RESTAPI进行身份验证的应用程序。我现在面临的问题是,我也将用户的令牌保存在UserDefaults和username中,因为这是获取用户详细信息所需的两个主要参数。因此,如果用户关闭了应用程序,那么当他重新打开应用程序时,他应该仍然能够查看其配置文件,但是配置文件返回空的详细信息。这是我的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)
}
我还想补充一点,当我使用postman运行api时,我得到的响应是“详细信息”:“签名已过期。”因此我必须在标题中输入新令牌,以便它再次显示用户详细信息

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()
已被弃用

我建议将密钥存储为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()
已被弃用。

不要使用
value(forKey:)
。使用
对象(forKey:)
。如果是
字符串
,请使用
字符串(forKey:)
。凭据不应使用UserDefaults,而应使用Keychain。关于您的问题,@rmaddy是否已将值强制转换为字符串,因此使用字符串意味着您可以共享整个UserDataService,尤其是Instance,而不使用
值(forKey:)
。使用
对象(forKey:)
。如果是
字符串
,请使用
字符串(forKey:)
。凭据不应使用UserDefaults,而应使用Keychain。关于你的问题,@rmaddy,trickI已经将值转换为string,所以使用string意味着你可以共享整个UserDataService,尤其是instanceSorry,但我不太理解你的答案。特别是阅读你不需要阅读,因为你的问题只是关心实施。嗨,请你帮我看一下问题。对不起,我不太明白你的答案。特别是阅读你不需要阅读,因为你的问题是你只关心实施。嗨,请你帮我看一下这个问题好吗