You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
150 lines
4.6 KiB
150 lines
4.6 KiB
//
|
|
// BiometricAuthenticationWireframe.swift
|
|
// GME Remit
|
|
//
|
|
// Created by InKwon Kim on 30/03/2019.
|
|
//Copyright © 2019 Gobal Money Express Co. Ltd. All rights reserved.
|
|
//
|
|
|
|
import UIKit
|
|
import LocalAuthentication
|
|
|
|
class BiometricAuthenticationWireframe {
|
|
weak var view: UIViewController!
|
|
private var policy: LAPolicy = .deviceOwnerAuthenticationWithBiometrics
|
|
private weak var delegate: BiometricAuthenticationViewControllerDelegate?
|
|
}
|
|
|
|
extension BiometricAuthenticationWireframe: BiometricAuthenticationWireframeInput {
|
|
var storyboardName: String {return "BiometricAuthentication"}
|
|
|
|
func getMainView() -> UIViewController {
|
|
let service = BiometricAuthenticationService()
|
|
let interactor = BiometricAuthenticationInteractor(service: service)
|
|
let presenter = BiometricAuthenticationPresenter()
|
|
let viewController = viewControllerFromStoryboard(of: BiometricAuthenticationViewController.self)
|
|
|
|
viewController.presenter = presenter
|
|
interactor.output = presenter
|
|
presenter.interactor = interactor
|
|
presenter.wireframe = self
|
|
presenter.view = viewController
|
|
|
|
self.view = viewController
|
|
return viewController
|
|
}
|
|
|
|
func showBiometricAuthentication(completion: ((BiometricAuthenticationError?) -> Void)?) {
|
|
let context = LAContext()
|
|
|
|
var error: NSError?
|
|
let msg = "bio_message_title_text".localized()
|
|
|
|
let vc = self.view as? BiometricAuthenticationViewController ?? BiometricAuthenticationViewController()
|
|
|
|
if let bioPolicy = delegate?.doSelectLocalAuthenticationPolicy(vc) {
|
|
switch bioPolicy {
|
|
case .deviceOwnerAuthentication:
|
|
self.policy = .deviceOwnerAuthentication
|
|
case .deviceOwnerAuthenticationWithBiometrics:
|
|
self.policy = .deviceOwnerAuthenticationWithBiometrics
|
|
}
|
|
}
|
|
|
|
if context.canEvaluatePolicy(self.policy, error: &error) {
|
|
context.evaluatePolicy(self.policy, localizedReason: msg, reply: { (success, err) in
|
|
if success {
|
|
DispatchQueue.main.async {
|
|
completion?(nil)
|
|
self.delegate?.didComplete(vc)
|
|
}
|
|
} else {
|
|
DispatchQueue.main.async {
|
|
let bioError = self.setBiometricError(error: err)
|
|
completion?(bioError)
|
|
self.delegate?.viewController(vc, didFailWithError: bioError, errorMessage: bioError.message)
|
|
}
|
|
}
|
|
})
|
|
} else {
|
|
KeyChain.shared.save(data: "0", key: .biometricAuth)
|
|
|
|
DispatchQueue.main.async {
|
|
let bioError = self.setBiometricError(error: error)
|
|
completion?(bioError)
|
|
self.delegate?.viewController(
|
|
vc,
|
|
didFailWithError: bioError,
|
|
errorMessage: bioError.localizedDescription
|
|
)
|
|
}
|
|
}
|
|
}
|
|
|
|
func openWithDelegate(
|
|
on window: UIWindow,
|
|
delegate: BiometricAuthenticationViewControllerDelegate
|
|
) {
|
|
let vc = getMainView()
|
|
self.delegate = delegate
|
|
(vc as? BiometricAuthenticationViewController)?.delegate = delegate
|
|
|
|
window.rootViewController = vc
|
|
}
|
|
|
|
func openWithDelegate(
|
|
on viewConroller: UIViewController,
|
|
delegate: BiometricAuthenticationViewControllerDelegate
|
|
) {
|
|
let vc = getMainView()
|
|
self.delegate = delegate
|
|
(vc as? BiometricAuthenticationViewController)?.delegate = delegate
|
|
|
|
viewConroller.present(vc, animated: true, completion: nil)
|
|
}
|
|
}
|
|
|
|
extension BiometricAuthenticationWireframe {
|
|
private func setBiometricError(error: Error?) -> BiometricAuthenticationError {
|
|
let bioError: BiometricAuthenticationError
|
|
|
|
if #available(iOS 11.0, *) {
|
|
switch error {
|
|
case LAError.authenticationFailed?:
|
|
bioError = .authenticationFailed
|
|
case LAError.userCancel?:
|
|
bioError = .userCancel
|
|
case LAError.userFallback?:
|
|
bioError = .userFallback
|
|
case LAError.biometryNotAvailable?:
|
|
bioError = .biometryNotAvailable
|
|
case LAError.biometryNotEnrolled?:
|
|
bioError = .biometryNotEnrolled
|
|
case LAError.biometryLockout?:
|
|
bioError = .biometryLockout
|
|
default:
|
|
bioError = .notBeConfigured
|
|
}
|
|
} else {
|
|
switch error {
|
|
case LAError.authenticationFailed?:
|
|
bioError = .authenticationFailed
|
|
case LAError.userCancel?:
|
|
bioError = .userCancel
|
|
case LAError.userFallback?:
|
|
bioError = .userFallback
|
|
case LAError.touchIDNotAvailable?:
|
|
bioError = .biometryNotAvailable
|
|
case LAError.touchIDNotEnrolled?:
|
|
bioError = .biometryNotEnrolled
|
|
case LAError.touchIDLockout?:
|
|
bioError = .biometryLockout
|
|
default:
|
|
bioError = .notBeConfigured
|
|
}
|
|
|
|
}
|
|
|
|
return bioError
|
|
}
|
|
}
|