我如何在IOS / Swift上持久登录令牌

时间:2016-05-19 03:16:19

标签: ios swift alamofire

我使用Alamofire在IOS / Swift端执行HTTP方法,而在服务器端我使用node.js / Express进行基于令牌的身份验证。

这是场景,用户点击登录然后它将使用Alamofire来呼叫 /auth/login url执行逻辑,然后服务器将使用令牌进行响应,然后它将用户导航到主屏幕。一切都很顺利。

我使用Keychain来存储令牌。 https://github.com/kishikawakatsumi/KeychainAccess

Alamofire.request(.POST, "https://specialapp.herokuapp.com/auth/login", parameters: parameters, encoding: .JSON)
            .responseJSON { response in
                if let httpError = response.result.error {
                    let statusCode = httpError.code
                    print(statusCode)
                } else {
                    if let value = response.result.value {
                        let json = JSON(value)
                        let statusCode = (response.response?.statusCode)!
                        if statusCode == 401 {
                            print(json)
                        } else {
                            print(json["token"])
                            let token = json["token"]
                            self.keychain["token"] = String(token)
                            self.performSegueWithIdentifier("Main", sender: sender)
                        }
                    }


                }

            }

但真正的问题在于我关闭应用程序,然后再次重新打开它。我想要实现的是每当用户登录时,关闭应用程序并再次重新打开它将使用户返回主屏幕。

我将如何实现这一目标?

2 个答案:

答案 0 :(得分:3)

在viewdidload方法中,您可以像这样检查您的令牌。如果未设置,则表示仍未完成登录。

if let token =   NSUserDefaults.standardUserDefaults().valueForKey(KToken) as? NSString {
       // Token stored in NSUserDefaults.
} else {
       // Have to login
}   

并像NSUserDefault一样存储价值。

NSUserDefaults.standardUserDefaults().setValue(email, forKey: KToken)

NSUserDefaults.standardUserDefaults().synchronize()

答案 1 :(得分:0)

更新

应用程序状态可以与特定屏幕的某些import UIKit class MyClass<T> { init() { if(T.self == Void.self) { print("Void!") } else { print("Not Void!") } } } // Will print Not Void var test = MyClass<Int>() // Will print Void var test2 = MyClass<Void>() 一起存储。在ID中,从-viewDidLoad()获取前一个ID并拥有一个局部变量。然后在NSUserDefaults中设置当前页面ID。反之亦然NSUserDefaults删除当前ID存储以前的ID。

当您拥有所有-dealloc()的超级视图控制器时,工作量太少

将您的任何令牌存储在viewcontroller中。即使在删除应用程序后,存储在钥匙串中的数据也不会被删除。找到最好的Answer here

您还可以选择在keychain

中存储钥匙串和应用程序状态