Как сохранить токен JSON в пользовательских настройках по умолчанию, а затем использовать его в другом представлении?Swift 4 - PullRequest
0 голосов
/ 24 февраля 2019

Я искал 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)
        }

Когда я пытаюсь получить данные, которые я думал, были сохранены в ключе"saveToken",

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

У меня есть вывод tokenData в консоль и там написано ноль.Я попробовал метод в этом потоке , и он все еще говорит, что это ноль.Мне пришлось удалить команду «если» из ответа, чтобы я мог использовать значение.Это код, который я использую, который требует сохраненный токен;

        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()

Я полностью потерян в этот момент.Я тоже устал этот метод тоже.Все, что я пытаюсь сделать, - это сохранить возвращенные данные, которые выглядят следующим образом: printed json data in consol, в настройки пользователя по умолчанию или что-то, где я могу легко получить их.

1 Ответ

0 голосов
/ 22 марта 2019

Я понял, как это сделать, и подумал, что поделюсь, как я это сделал.Я сначала начал с создания структуры для токена как таковой:

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")",

?? удаляет необязательную часть данных и просто оставляет сам токен.

...