如何使用 UserDefaults.standard 在 Swift 3.0 中保持会话?
Posted
技术标签:
【中文标题】如何使用 UserDefaults.standard 在 Swift 3.0 中保持会话?【英文标题】:How Keep session in Swift 3.0 using UserDefaults.standard? 【发布时间】:2017-01-18 03:19:18 【问题描述】:我有两 (2) 个 swift 3.0 文件。
已编辑:
我的目标是在登录成功后保持 ViewController 处于活动状态/出现。 而且我想在点击注销按钮时保持 LoginVC 处于活动状态。
一切正常,例如发布和读取 json 数据。
已编辑:
ViewController 在登录时成功激活,但是当我点击注销按钮时,停止并重新构建它,ViewController 仍然没有关闭。它应该被重定向到 LoginVC。
我认为我的 UserDefaults.standard 代码可能有问题。
我的代码如下
ViewController.swift
import UIKit
class ViewController: UIViewController
override func viewDidLoad() super.viewDidLoad()
override func viewDidAppear(_ animated: Bool)
let isUserLoggedIn = UserDefaults.standard.bool(forKey: "isUserLoggedIn")
if(!isUserLoggedIn)
self.performSegue(withIdentifier: "loginview", sender: self)
@IBAction func logoutData(_ sender: Any)
UserDefaults.standard.set(true, forKey: "isUserLoggedIn");
UserDefaults.standard.synchronize();
self.performSegue(withIdentifier: "loginview", sender: self)
LoginVC.swift
import UIKit
class LoginVC: UIViewController
@IBOutlet var _login: UITextField!
@IBOutlet var _pass: UITextField!
var login: String!
var pass: String!
override func viewDidLoad() super.viewDidLoad()
@IBAction func loginData(_ sender: Any)
login = _login.text
pass = _pass.text
if(login == "" || pass == "")
return
else
let url = URL(string: "http://localhost/login.php")
let session = URLSession.shared
let request = NSMutableURLRequest(url: url! as URL)
request.httpMethod = "POST"
let paramToLogin = "login=\(login!)&pass=\(pass!)"
request.httpBody = paramToLogin.data(using: String.Encoding.utf8)
let task = session.dataTask(with: request as URLRequest, completionHandler:
(data, response, error) in
if error != nil
return
else
do
if let json = try JSONSerialization.jsonObject(with: data!) as? [String: String]
DispatchQueue.main.async
let success = Int(json["message"]!)
if(success == 1)
UserDefaults.standard.set(true, forKey: "isUserLoggedIn")
UserDefaults.standard.synchronize();
self.dismiss(animated: true, completion: nil)
return
catch
)
task.resume()
【问题讨论】:
登录后应该使用set(true, forKey: "yourKey")
,而不是阅读它
您还需要序列化您的 JSON 数据,然后再发布它developer.apple.com/reference/foundation/jsonserialization
是的。我已经更新了这个问题。但是另一个问题来了。当我点击注销按钮时。它不会终止会话。 .
如果代码太长,请见谅。
无需强制同步
【参考方案1】:
在注销期间的代码中,值“true”也存储在 UserDefaults 中。我认为这可能是问题所在。
【讨论】:
是的。我将其更改为“假”。到目前为止它有效。但我不确定我上面的代码是否是创建登录会话页面的正确方法。 我认为这不是一个好方法。如果用户未登录,则必须将 LoginVC 设置为 rootViewController。用户登录后,将 rootViewController 更改为 ViewController。反之亦然。 你能看看这个问题吗? ***.com/questions/41711734/…. 我希望其中一位开发人员回答了这个问题,这是正确的。【参考方案2】:let loginStroyBoard = UIStoryboard(name:"Login", bundle: nil)
let businessLoginViewController = loginStroyBoard.instantiateViewController(withIdentifier: "BusinessLoginViewController") as! BusinessLoginViewController
let refreshAlert = UIAlertController(title: "Log Out", message: "Are You Sure to Log Out ? ", preferredStyle: UIAlertControllerStyle.alert)
refreshAlert.addAction(UIAlertAction(title: "Confirm", style: .default, handler: (action: UIAlertAction!) in
self.present(businessLoginViewController, animated: true, completion: nil)
DispatchQueue.main.async
UserDefaults.standard.removeObject(forKey: "isFirstTime")
UserDefaults.standard.removeObject(forKey: "isLogIn")
UserDefaults.standard.removeObject(forKey: "uid")
UserDefaults.standard.removeObject(forKey: "hash")
UserDefaults.standard.removeObject(forKey: "storeadminid")
UserDefaults.standard.removeObject(forKey: "adminhash")
UserDefaults.standard.removeObject(forKey: "store_id")
UserDefaults.standard.removeObject(forKey: "isLogIn")
UserDefaults.standard.removeObject(forKey: "login_id")
UserDefaults.standard.removeObject(forKey: "password")
UserDefaults.standard.setValue(false, forKey: "islogout")
//self.tabBarController?.tabBar.resignFirstResponder()
))
refreshAlert.addAction(UIAlertAction(title: "Cancel", style: .default, handler: (action: UIAlertAction!) in
refreshAlert .dismiss(animated: true, completion: nil)
))
present(refreshAlert, animated: true, completion: nil)
我也将使用它进行注销.. 你可以试试这个,我会用我的单元格注销按钮来做。
【讨论】:
以上是关于如何使用 UserDefaults.standard 在 Swift 3.0 中保持会话?的主要内容,如果未能解决你的问题,请参考以下文章
如何在自动布局中使用约束标识符以及如何使用标识符更改约束? [迅速]
如何使用 AngularJS 的 ng-model 创建一个数组以及如何使用 jquery 提交?