如何临时保存解析的JSON数据?

时间:2015-08-24 01:51:50

标签: json swift storage

在我的应用程序中,我已成功对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)")
 }

1 个答案:

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

}