如何将 JSON 令牌保存到用户默认值,然后在不同的视图中使用它?斯威夫特 4

Posted

技术标签:

【中文标题】如何将 JSON 令牌保存到用户默认值,然后在不同的视图中使用它?斯威夫特 4【英文标题】:How to save a JSON token to User Defaults and then use it in a different view? Swift 4 【发布时间】:2019-02-24 05:45:22 【问题描述】:

我现在已经搜索了 2 天(我链接了我在下面使用的线程),但到目前为止没有任何效果。我的代码如下,用于序列化 api 发回的数据并尝试使用 Swift 4 将其保存在用户默认值中。

do
                let token = try JSONSerialization.jsonObject(with: data!, options: [])
                print(token)
                UserDefaults.standard.set(token, forKey: "savedToken")


            catch
                if httpResponse.statusCode == 401
                      Helper.showAlert(viewController: self, title: "Oops", message: "Username or Password Incorrect")
                
                print(error)
            
         else if let error = error 
            Helper.showAlert(viewController: self, title: "Well Damn", message: "Ay chief we have no idea what just happened but it didn't work")
            print(error)
        

当我尝试检索我认为存储在键“savedToken”中的数据时,

let tokenData = UserDefaults.standard.object(forKey: "savedToken")

我让它在控制台中打印 tokenData,它显示为 nil。我尝试了thread 中的方法,它仍然说它是零。我确实必须从答案中删除“if”命令,以便我可以使用该值。这是我正在使用的代码,需要保存的令牌;

        let tokenData = UserDefaults.standard.object(forKey: "savedToken")
    let areaHeaders = [
        "Authorization": "token \(tokenData)", // <-- this is where I need the token.
        "Content-Type": "application/x-www-form-urlencoded",
        "anonym": "true",
        "cache-control": "no-cache",
        "Postman-Token": "0017837d-5229-46a3-98ff-58fe3aa09df9"
    ]

    let areaData = NSMutableData(data: "undefined=undefined".data(using: String.Encoding.utf8)!)

    let areaRequest = NSMutableURLRequest(url: NSURL(string: "http://localhost:8000/areas/sample/")! as URL,
                                      cachePolicy: .useProtocolCachePolicy,
                                      timeoutInterval: 10.0)
    areaRequest.httpMethod = "GET"
    areaRequest.allHTTPHeaderFields = areaHeaders
    areaRequest.httpBody = areaData as Data

    let areaSession = URLSession.shared
    let areaDataTask = areaSession.dataTask(with: areaRequest as URLRequest, completionHandler:  (data, response, error) -> Void in
        if let data = data 
            do
                let postData = try JSONSerialization.jsonObject(with: data, options: [])
                print(postData)

            catch
                print(error)
            

         else 
            let httpResponse = response as? HTTPURLResponse
            print(httpResponse)

        
    )
    areaDataTask.resume()

此时我完全迷失了。我也累了this method。我要做的就是将返回的数据保存为如下所示; 到用户默认值或我可以轻松检索它的地方。

【问题讨论】:

你确定JSON序列化成功了吗?代码没有落入 catch 块? 再加上UserDefaults.standard.object(forKey: "savedToken"),你将获得Optional的价值。 【参考方案1】:

我想出了如何做到这一点,我想我会分享我是如何做到的。 我首先为令牌创建了一个结构体;

struct token: Decodable 
    let token: String!

然后我通过这样做解码并保存了令牌;

let JSONFromServer = try JSONSerialization.jsonObject(with: data, options: [])
let decoder = JSONDecoder()
                let tokenArray = try decoder.decode(token.self, from: data)
                print(tokenArray.token)
                UserDefaults.standard.set(tokenArray.token, forKey: "savedToken")

然后我可以通过使用来提取令牌

let savedToken = UserDefaults.standard.object(forKey: "savedToken") 

并且为了使用该对象并通过执行此操作删除包含在let 中的“可选”部分;

"Authorization": "token \(self.tokenData ?? "nope")",

?? 删除数据的可选部分,只留下令牌本身。

【讨论】:

以上是关于如何将 JSON 令牌保存到用户默认值,然后在不同的视图中使用它?斯威夫特 4的主要内容,如果未能解决你的问题,请参考以下文章

如何在swift中将json数组保存和检索到用户默认值?

如何保存响应 JSON 数组并在 swift 中使用用户默认值进行检索

UserDefaults 混淆了数据

如何添加到当前存储在用户默认值 Swift 4 中的数字

如何在没有参数的情况下快速将类保存到用户默认值

在 JSON.Net 中处理不存在的 JSON 令牌如何返回默认值而不是抛出异常