swift中的自动登录功能

Posted

技术标签:

【中文标题】swift中的自动登录功能【英文标题】:Autologin functionality in swift 【发布时间】:2020-06-09 19:34:05 【问题描述】:

我想实现自动登录功能。当我打开我的应用程序时,它将转到“loginViewController”。登录后,我将登录 ID 保存到 UserDefaults。如果 UserDefaults 具有该值,ift 将第二次转到“SlideMenuController”。我已经在“sceneDelegate”中编写了代码。代码是-

func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) 

    if let logId = UserDefaults.standard.value(forKey: "loginId")  

        goToPlayerMenu()
    
    guard let _ = (scene as? UIWindowScene) else  return 



func goToPlayerMenu() 
    let storyboard = UIStoryboard(name: "PlayerHomeScreen", bundle: nil)

    let homeViewController = storyboard.instantiateViewController(withIdentifier: "PlayerHomeViewController") as! PlayerHomeViewController

    let menuViewController = storyboard.instantiateViewController(withIdentifier: "PlayerMenuViewController") as! PlayerMenuViewController

    let nvc: UINavigationController = UINavigationController(rootViewController: homeViewController)
    nvc.navigationBar.barTintColor = UIColor.black
    nvc.navigationBar.titleTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.white]
    nvc.navigationItem.leftBarButtonItem?.tintColor = .white
    nvc.navigationBar.tintColor = UIColor.black
    //menuViewController.homeViewController = nvc
    let slideMneu  = SlideMenuController.init(mainViewController: nvc, leftMenuViewController: menuViewController)
    slideMneu.delegate = homeViewController as? SlideMenuControllerDelegate
    slideMneu.changeLeftViewWidth(UIScreen.main.bounds.width-40)
    slideMneu.automaticallyAdjustsScrollViewInsets = true
    self.window?.rootViewController = slideMneu


现在我想去登录视图控制器,如果我要注销应用程序。但由于我的 rootViewController 是“slideMneu”。我无法转到“loginViewController”。注销后是否有任何选项可以转到“loginViewController”?

我的注销功能是-

func logout()
UserDefaults.standard.removeObject(forKey: "customer_id")
            UserDefaults.standard.removeObject(forKey: "isContributor")
            FUser.logOutCurrentUser  (logout) in
                if logout == true
                    print("DEBUG: Logout completed")
                

            
            let Alert = UIAlertController(title:Common.sharedInstance().TITLE_ALERT, message:Common.sharedInstance().CONFIRM_ALERT, preferredStyle: .alert)

            let OKButtonAction = UIAlertAction(title: Common.sharedInstance().ALERT_YES, style: UIAlertAction.Style.default)  (action:UIAlertAction!) in
                let storyBoard = UIStoryboard(name: "Main", bundle: nil)
                let LoginViewController = storyBoard.instantiateViewController(withIdentifier: "LoginViewController") as? LoginViewController
                self.navigationController?.pushViewController(LoginViewController!, animated: true)
                //                self.navigationController?.popViewController(animated: true)
            
            let Cancel = UIAlertAction(title:Common.sharedInstance().NO, style: .default, handler: nil)

            Alert.addAction(OKButtonAction)
            Alert.addAction(Cancel)

            self.present(Alert, animated: true, completion:nil)

【问题讨论】:

【参考方案1】:

所有代码均来自我的项目

1.Keywindow RootViewController 的设置位置

let navigator = Container.shared.resolve(INavigator.self)!
let localStorageService = Container.shared.resolve(ILocalStorageService.self)!

// if you store login user key or not
if localStorageService.isKeyExist(key: Configs.KEY_USER) 

    // if there is key,then goes to main page
    navigator.switchRoot(keyWindow: window!, scene: .main(viewModel: MainTabBarViewModel()))
 else 
    // there is no key,then goes to login page
    navigator.switchRoot(keyWindow: window!, scene: .intro(viewModel: IntroViewModel()))

2.登录页面 通过调用Api,你可以从api获取一个token(key),这个token是后端开发者高度定制的。请将此token(key)保存在用户默认中。

3. 稍后当您需要在应用中调用某些授权 API 时,您将需要此令牌。

【讨论】:

【参考方案2】:

您似乎缺少window 的初始化,可以这样修复:

func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) 

    guard let windowScene = (scene as? UIWindowScene) else  return 
    window = UIWindow(windowScene: windowScene)
    window?.makeKeyAndVisible()
    if let logId = UserDefaults.standard.value(forKey: "loginId")  
        goToPlayerMenu()
    

【讨论】:

嗨@Frankenstein 注销后我想去“LoginViewController”。我已经编辑了我的问题。我添加了注销功能。请调查一下。 您最初的问题不是要设置rootViewController吗?您不应该修改问题以提出新问题。如果您还有其他问题,最好创建一个新帖子并添加下面的链接,我一定会看看并帮助您。 不,我的问题是一样的。只有我添加了注销功能 我的问题是关于自动登录实现

以上是关于swift中的自动登录功能的主要内容,如果未能解决你的问题,请参考以下文章

Swift 中的异步 UI 测试

如何在iOS swift中自动登录用户?

iOS中的自动登录

C# 使用webBrowser控件获取网页中的账号密码登录网页元素并自动填写模拟自动登录?

如何在 iOS 11 应用程序登录屏幕中禁用新密码自动填充功能?

Swift 3 - UserDefaults 无缘无故自动清除