ios - 如何在不询问 iOS Swift 登录的情况下自动登录?

标签 ios swift xcode firebase-authentication swrevealviewcontroller

我有不同的 Storyboard,称为 Main、tabBar、home、map 等。在 tabBar Storyboard中,我使用了 SWRevealViewController View 并作为初始 View 启动。 在主 Storyboard 中,只使用了两个,即登录和注册 Controller 。

这是我的 tabBar storyBoard enter image description here 截图

我的问题是,当用户注销并返回时,它会自动转到主屏幕而不是登录屏幕 [这个问题是由于 SWRevealViewController 是初始 View Controller ]。

我试过的代码:在签名 View Controller 中

在 viewDidAppear 中检查用户是否在 firebase 中可用

  override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)

    if API.User.CURRENT_USER != nil {
        // segue to the Tab Bar Controller
        self.performSegue(withIdentifier: "signInToTabBar", sender: nil)

    }
}

登录操作:

  @IBAction func SignInButton(_ sender: Any) {

    view.endEditing(true)

    guard
        let email = emailTextField.text, !email.isEmpty,
        let password = passwordTextField.text, !password.isEmpty
        else {

            self.showErrorAlert(message: "Username or email or passowrd should not be empty")
            return
    }
    // show the progress to the user
    ProgressHUD.show("Starting sign-in...", interaction: false)

    // use the signIn class method of the AuthService class
    AuthService.signIn(email: emailTextField.text!, password: passwordTextField.text!, onSuccess: {
        // on success segue to the Tab Bar Controller
        API.User.observeCurrentUser { user in

            guard let currentUser = Auth.auth().currentUser else {
                return
            }

            PrefsManager.sharedinstance.UIDfirebase = currentUser.uid
            PrefsManager.sharedinstance.username  = user.username!
            PrefsManager.sharedinstance.userEmail = user.email!
            PrefsManager.sharedinstance.imageURL  = user.profileImageURL!

            ProgressHUD.showSuccess("Sucessfully signed in.")
            self.performSegue(withIdentifier: "signInToTabBar", sender: nil)

        }

    }, onError: { errorString in
        ProgressHUD.dismiss()
        self.showErrorAlert(message: errorString ?? "Server error")
    })

}

SWRevealViewController 菜单表我正在列出菜单,如主页、预订、个人资料、注销:

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
{


    let cell = tableView.dequeueReusableCell(withIdentifier: "Cell") as! MenuTableViewCell

    cell.menuName.text = menuName[indexPath.row]
    cell.menuIcon.image = UIImage(named: menuImage[indexPath.row])


    return cell

}

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

  //        tableView.deselectRow(at: indexPath, animated: true)

    let row = indexPath.row

    if row == 0{

        let storyboard = UIStoryboard(name: "Home", bundle: nil)

        let obj = storyboard.instantiateViewController(withIdentifier: "HomeViewController") as! HomeViewController
        let navController = UINavigationController(rootViewController: obj)
        navController.setViewControllers([obj], animated:true)
        navController.tabBarController?.tabBar.isHidden = false
        self.revealViewController().setFront(navController, animated: true)
        self.revealViewController().setFrontViewPosition(FrontViewPosition.left, animated: true)

    } else if row == 1{

        let storyboard = UIStoryboard(name: "Bookings", bundle: nil)
        let obj = storyboard.instantiateViewController(withIdentifier: "BookingsViewController") as! BookingsViewController
        let navController = UINavigationController(rootViewController: obj)
        navController.setViewControllers([obj], animated:true)
        self.revealViewController().setFront(navController, animated: true)
        self.revealViewController().setFrontViewPosition(FrontViewPosition.left, animated: true)


    } else if row == 2 {

        let storyboard = UIStoryboard(name: "Profile", bundle: nil)
        let obj = storyboard.instantiateViewController(withIdentifier: "profileViewController") as! profileViewController
        let navController = UINavigationController(rootViewController: obj)
        navController.setViewControllers([obj], animated:true)
        self.revealViewController().setFront(navController, animated: true)
        self.revealViewController().setFrontViewPosition(FrontViewPosition.left, animated: true)

    } else if row == 3 {
        print(indexPath)
        // Log out user from Firebase
        AuthService.signOut(onSuccess: {
            // Present the Sign In VC
    //                PrefsManager.sharedinstance.logoutprefences()
            let storyboard = UIStoryboard(name: "Main", bundle: nil)
            let signInVC = storyboard.instantiateViewController(withIdentifier: "signInViewController")
                        self.present(signInVC, animated: true)

  //                self.navigationController?.pushViewController(signInVC, animated: true)

        }) { (errorMessage) in

            ProgressHUD.showError(errorMessage)

        }



    }


}

在主视图 Controller 中,检查用户是否可用:

  override func viewDidAppear(_ animated: Bool) {

    if API.User.CURRENT_USER != nil {
        // segue to the Tab Bar Controller
        self.performSegue(withIdentifier: "signInToTabBar", sender: nil)

    }

    super.viewDidAppear(true)
    self.tabBarController?.tabBar.isHidden = false

}

最佳答案

当您退出应用程序时,您必须像这样将登录 View Controller 设置为 Root View Controller 。

AuthService.signOut(onSuccess: {
       // Present the Sign In VC
       let storyboard = UIStoryboard(name: "Main", bundle: nil)
       let signInVC = storyboard.instantiateViewController(withIdentifier: "signInViewController") as! signInViewController
       let nav = UINavigationController(rootViewController:signInVC)
       let application = UIApplication.shared.delegate as! AppDelegate
       application.window!.rootViewController = nav

}) { (errorMessage) in
        ProgressHUD.showError(errorMessage)
 }

现在在 AppDelegate.swift 文件中,在 application(_:didFinishLaunchingWithOptions:) 方法中,您必须检查用户是否为 nil。

if API.User.CURRENT_USER != nil {
       let mainNav = self.window?.rootViewController as! UINavigationController
       let storyBoard = UIStoryboard(name: "tabBar", bundle:nil)
       let sWRevealViewController = storyBoard.instantiateViewController(withIdentifier: "SWRevealViewController") as! SWRevealViewController
       mainNav.pushViewController(sWRevealViewController, animated: false)
 }

注意:请在标识符名称和 View Controller 名称中添加您的 Storyboard ID 和 View Controller 名称。

关于ios - 如何在不询问 iOS Swift 登录的情况下自动登录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51551515/

相关文章:

iphone - 删除 NSDocumentDirectory 中的项目

ios - OpenGL 层在 presentRenderBuffer 上变黑

c# - Xamarin iOS,在代码后面添加 WKWebView,部署后没有任何反应

ios - 使用swift将iPhone App屏幕流式传输到另一部iPhone

ios - 辅助功能画外音失去了对分段 subview 的关注

iOS 8 自定义键盘

ios - 一个文件很多的APP,如何轻松改名?

ios - 将 Xcode 5 应用程序上传到 iOS 8 手机

ios - 访问类函数时 Swift 中的预期声明错误

ios - 后台推送适用于 iOS7 但不适用于 iOS8