我是iOS的新手。我正在尝试在应用程序中使用本地身份验证框架。我的应用程序流程就像用户打开应用程序时,他可以看到启动屏幕,然后,如果他是新用户,他将重定向到登录屏幕,然后重定向到仪表板屏幕。登录后,如果他点击后记得我,下次用户打开该应用程序时,他将直接重定向到仪表板。
我只是不明白我在哪个屏幕上添加了authenticationWithTouchID逻辑。在打开应用程序时,我想显示TouchID弹出窗口,以便用户可以进行身份验证并重定向到仪表板。
更新:1
我正在检查记住我在didFinishLaunchingWithOptions()
的{{1}}中是否为真,因此,我曾经打开特定的AppDelegate
。因此,仅以相同的方法,我在检查是否启用了用户的触摸ID,如果用户对触摸ID进行了身份验证,那么我将显示弹出窗口,否则将正常重定向到仪表板。这是正确的方法吗?还有一件事我想问的是,当暂停应用程序的“主页”按钮时,是否要在重新打开应用程序时再次显示触摸ID,以调用该身份验证方法。会去UIViewController
吗?
更新:2
使用applicationWillEnterForeground()
答案 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()
}