在我的应用程序中,我已成功对Web API进行POST调用,并从JSON获取访问令牌及其到期时间。
现在我想保存访问令牌,这是我正在解析的JSON中的一个对象。但是,我想暂时保存它。意思是,用户需要重新登录才能获得另一个访问令牌才能使用该应用程序。
我已阅读有关核心数据的资料,但所有资料都使用永久存储空间。我也看过锁匠,但我也不认为这是暂时存储的。
请帮忙!有什么方法可供选择?
这是我使用的已解析JSON,我需要访问令牌,如下所示:
var json = NSJSONSerialization.JSONObjectWithData(data, options: .MutableContainers, error: &err) as? NSDictionary
if let parseJSON = json {
var token = parseJSON["access_token"] as? String
println("token: \(token)")
}
答案 0 :(得分:1)
在我看来,您只想在应用运行时存储此访问令牌。如果应用程序已关闭,那么您希望用户重新登录,从而获得新令牌?如果是这种情况,那么我只需使用变量来存储它,例如在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)
}
}
}