如何将 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的主要内容,如果未能解决你的问题,请参考以下文章