从何处调用Touch ID逻辑?

时间:2019-05-06 12:25:42

标签: ios swift localauthentication

我是iOS的新手。我正在尝试在应用程序中使用本地身份验证框架。我的应用程序流程就像用户打开应用程序时,他可以看到启动屏幕,然后,如果他是新用户,他将重定向到登录屏幕,然后重定向到仪表板屏幕。登录后,如果他点击后记得我,下次用户打开该应用程序时,他将直接重定向到仪表板。

我只是不明白我在哪个屏幕上添加了authenticationWithTouchID逻辑。在打开应用程序时,我想显示TouchID弹出窗口,以便用户可以进行身份​​验证并重定向到仪表板。

更新:1

我正在检查记住我在didFinishLaunchingWithOptions()的{​​{1}}中是否为真,因此,我曾经打开特定的AppDelegate。因此,仅以相同的方法,我在检查是否启用了用户的触摸ID,如果用户对触摸ID进行了身份验证,那么我将显示弹出窗口,否则将正常重定向到仪表板。这是正确的方法吗?还有一件事我想问的是,当暂停应用程序的“主页”按钮时,是否要在重新打开应用程序时再次显示触摸ID,以调用该身份验证方法。会去UIViewController吗?

更新:2

使用applicationWillEnterForeground()

打开Touch ID时,仪表板内容在后台可见

3 个答案:

答案 0 :(得分:1)

  

根据我的经验,您需要将两者分开   authentication个相关代码和其他UIViewController个代码。我建议   为生物矩阵singleton创建基于块的authentication类   (TouchID和FaceID)

请参考可怕的基于块的身份验证库BiometricAuthentication,以供参考。

我建议将所有与身份验证相关的代码保存在Login屏幕中。

请参考以下代码进行自动登录。

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    if isRemmberMe{
        BioMetricAuthenticator.authenticateWithBioMetrics(reason: "") { (result) in

            switch result {
            case .success( _):
                print("Redirect into dashboard screen")
            case .failure(let error):
                print("Authentication Failed")
            }
        }
    }
}
  

如果采用这种方法,则无需在其中编写额外的代码   AppDelegate.swift个文件,因为您的rootViewController总是   登录屏幕。只需设置您的初始控制器登录屏幕即可   storyboard

更新:1

问题:这是正确的方法吗?

  

是的,这是一种正确的方法,但是代码集中化   请记住生物矩阵身份验证。

问题:如果应用程序状态更改,如何管理TouchID或FaceID管理

  

您可以选择applicationWillEnterForeground或   applicationDidBecomeActive(如果应用程序状态已更改)。一   更多的事情,我想在上面提到两种方法也被称为   用户刚打开应用程序时。如果要完全限制用户访问应用程序内容,请使用applicationWillEnterForeground(),否则可以使用applicationDidBecomeActive

更新:2

如果要限制应用程序内容,则需要手动添加虚拟模糊UIView

代码:

let blurEffect = UIBlurEffect(style: .Light)
let blurVisualEffectView = UIVisualEffectView(effect: blurEffect)
blurVisualEffectView.frame = view.bounds
self.view.addSubview(blurVisualEffectView)

如果身份验证成功,则删除

blurVisualEffectView.removeFromSuperview()

答案 1 :(得分:0)

如果您的用户已经登录,请保存在UserDefaults中,然后按以下步骤继续启动应用程序:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.

    self.window = UIWindow(frame: UIScreen.main.bounds)
    if !isLoggedIn {
        let loginController = LoginController()
        self.window?.rootViewController = loginController
        self.window?.makeKeyAndVisible()
        return true
    }
    let authController = AuthenticaeController()
    self.window?.rootViewController = authController
    self.window?.makeKeyAndVisible()

    return true
}

其中isLoggedIn bool应该是您从UserDefaults中存储的值。

答案 2 :(得分:0)

您必须将true存储在用户成功的userDefault

例如 UserDefaults.standard.setValue("true", forKey: "isLogin")

AppDelegate.Swift

 func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

        let islogin = UserDefaults.standard.bool(forKey: "isLogin")

        if islogin
        {
           self.NextViewController(storybordid: "DashBoardViewIdentifier")
        }
        else
        {
            self.NextViewController(storybordid: "LoginViewIdentifier")
        }
        return true
    }

还要在method中创建一个AppDelegate.swift

   func NextViewController(storybordid:String)
    {

        let storyBoard:UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
        let exampleVC = storyBoard.instantiateViewController(withIdentifier:storybordid )
        let nav = UINavigationController(rootViewController: exampleVC)
        nav.navigationController?.setNavigationBarHidden(true, animated: false)
        self.window = UIWindow(frame: UIScreen.main.bounds)
        self.window?.rootViewController = nav
        self.window?.makeKeyAndVisible()
    }