在我看来,您似乎只想在应用程序运行时存储此访问令牌。如果应用程序已关闭,那么您希望您的用户重新登录,从而获得一个新令牌?如果是这种情况,那么我会简单地使用一个变量来存储它,例如在 UserManager 单例类中,或者如果您愿意,也可以在您的应用委托中。
如果您想将此变量存储更长时间,例如如果即使应用程序已关闭,您也想存储它,那么我会使用 NSUserDefaults 来存储它。将它存储在 userDefaults 中的唯一问题是它不是很安全,因为这是一个任何人都可以读取的 plist。因此,出于这个原因,我不建议将其存储为字符串,而是将其存储为数据。
let defaults = NSUserDefaults.standardUserDefaults()
if token != nil {
let tokenData = token!.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)
defaults.setObject(tokenData, forKey: "accessToken")
}
随意将密钥“accessToken”更改为任何其他内容,甚至是随机的数字和数字字符串,因为这样您将通过混淆获得一些安全性。要从 NSUserDefaults 中检索访问令牌,请使用以下代码:
let defaults = NSUserDefaults.standardUserDefaults()
var token: String?
if let tokenData = defaults.objectForKey("accessToken") as? NSData {
token = NSString(data: tokenData, encoding: NSUTF8StringEncoding) as? String
}
使用这些技术,您可以继续创建一个可以为您完成所有这些工作的属性,这将使其使用起来更加方便:
//MARK: Variables
private var tokenKey = "asdfa4tet4qtqERfasfQW$Rwrwe" //Random characters to hide the key.
//MARK: Properties
var Token: String? {
get {
let defaults = NSUserDefaults.standardUserDefaults()
var token: String?
if let tokenData = defaults.objectForKey(self.tokenKey) as? NSData {
token = NSString(data: tokenData, encoding: NSUTF8StringEncoding) as? String
}
return token
}
set(token) {
let defaults = NSUserDefaults.standardUserDefaults()
if token != nil {
var tokenData = token!.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)
defaults.setObject(tokenData, forKey: self.tokenKey)
} else {
defaults.setObject(nil, forKey: self.tokenKey)
}
}
}