Onboarding patterns

This section describes controls in the SAPFiori framework, for implementing the Onboarding flows outlined in the Fiori Design Guidelines Onboarding patterns

FUIWelcomeScreen

This UIViewController is used to display a welcome/launch screen to the application for onboarding. The screen mainly displays the application name, instructions on how to start the activation process and an option to trigger the demo mode of the application. There are two versions of the launch screen. Version 1 does not have sign in. Version 2 has a sign in with an additional Activate button for activation process.

Application can conform to protocol OnboardingDelegate to present the demo mode of the application by adopting with the didSelectDemoMode function and to proceed sign in by implementing the didSelectSignIn function.

Image

FUIWelcomeScreen is implemented in FUIWelcomeScreen.storyboard. There are two ways to launch the screen:

  • Use another story board and and use a Present Modally segue to FUIWelcomeScreen storyboard in SAPFiori framework with com.sap.cp.sdk.ios.SAPFiori as Bundle.

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
let vc = segue.destination as! FUIWelcomeScreen
vc.state = .isConfigured    //shows version2 of the launch screen
//without calling vc.view.layoutSubviews(), components are not initialized. For example, vc.welcomeDetailLabel is still nil.
vc.view.layoutSubviews()
vc.welcomeDetailLabel.text = "Thank you for downloading SAP Project Companion for Managers."
vc.delegate = self
}

  • Load view controller programmatically:

let vc = FUIWelcomeScreen.createInstanceFromStoryboard()
vc.state = .isConfigured    //shows version2 of the launch screen
vc.welcomeDetailLabel.text = "Thank you for downloading SAP Project Companion for Managers."
self.navigationController?.pushViewController(vc, animated: true)

The FUIWelcomeScreen is supported for iPad portrait and landscape orientation and iPhone portrait orientation only. Since the screens are not supported in iPhone landscape orientation, the app installed in iPhone must switch to portrait mode before presenting these screens. And the AppDelegate must lock the screen orientation when these screens display, as demonstrated in the following code snippet.

Usage

In app’s AppDelegate:


public var inFUIWelcomeScreen: Bool = false

// implement this function to support only portrait orientation when FUIWelcomeScreen is displayed.
func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
if !inFUIWelcomeScreen {
return .allButUpsideDown
} else {
return .portrait
}
}

Before presenting FUIWelcomeScreen:


// Let AppDelegate know that we are entering the screen
(UIApplication.shared.delegate as! AppDelegate).inFUIWelcomeScreen = true

// Make sure we rotate to portrait mode
let value = UIInterfaceOrientation.portrait.rawValue
UIDevice.current.setValue(value, forKey: "orientation")

// Present the screen
let vc = FUIWelcomeScreen.createInstanceFromStoryboard()
vc.welcomeDetailLabel.text = "Thank you for downloading SAP Project Companion for Managers."
self.navigationController?.pushViewController(vc, animated: true)

To dismiss the screen:


vc.dismiss(animated: true, completion: nil)

// Let AppDelegate know that we are exiting the view
(UIApplication.shared.delegate as! AppDelegate).inFUIWelcomeScreen = false

FUIPasscodeController

FUIPasscodeCreateController, FUIPasscodeInputController and FUIPasscodeChangeController provide passcode and Touch ID screens with UI components for a typical modal window used for setting up a passcode and enabling iPhone native Touch ID for application authentication.

The strings used in FUIPasscodeSetupView, FUIPasscodeView, and FUITouchIDView are from localized Onboarding.strings file. Application can override these strings by setting the corresponding static variables in this FUIPasscodeController class at runtime.

Interface

FUIPasscodeCreateController

This UIViewController is to be used by the app to set up the passcode and enable Touch ID screen flows.

FUIPasscodeInputController

This UIViewController is to be used by the app to authenticate the user either by Touch ID or Passcode.

FUIPasscodeChangeController

This UINavigationController is to be used by app to change passcode.

Changing the passcode does not affect existing Touch ID preferences. There are no additional screens to display to enable touchID in the change passcode flow.

Usage

FUIPasscodeCreateController

Before the navigation controller presents this FUIPasscodeCreateController, the following property needs to be set:

  • delegate: An implementation of FUIPasscodeControllerDelegate to handle events from this controller.

Application can also set this property for more passcode validation checks:

  • validationDelegate: An implementation of FUIPasscodeValidationDelegate to validate the passcode user entered.

Here is the screen flow:

  • The first screen prompts the user to enter the passcode. After the user enters the passcode which is validated with the FUIPasscodePolicy, the FUIPasscodeValidationDelegate provided function validate of validationDelegate is invoked for additional validation. The next screen displays upon successful validation. Image
  • The second screen prompts the user to enter the passcode again to verify it against what was entered in the first screen. The third screen displays when the passcodes match and touch ID is allowed in FUIPasscodePolicy. Image
  • The third screen prompts the user to enable or disable Touch ID authentication. If the user chooses Enable the passcode is saved as a Touch ID protected keychain item so that the passcode can be retrieved by FUIPasscodeInputController later with Touch ID. Image

After the setup is complete, either with or without the third screen, the function shouldTryPasscode of the FUIPasscodeControllerDelegate is invoked. The delegate should either create a secure store with the passcode, or save the passcode in a secure manner.

This passcode create flow is implemented in FUIPasscodeCreateController.storyboard. There are two ways to invoke it:

  • Use another storyboard and add a Present Modally segue to the FUIPasscodeCreateController storyboard in SAPFiori’s framework bundle com.sap.cp.sdk.ios.SAPFiori. App programmer needs to provide the properties needed in UIController’s prepare for segue function:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
let destination = segue.destination as! UINavigationController
let vc0 = destination.viewControllers[0]
let vc = vc0 as! FUIPasscodeCreateController
vc.delegate = passcodeControllerDelegate
}

  • Programmatically load it:

let storyboard = UIStoryboard(name: "FUIPasscodeCreateController", bundle: bundle)
let vc = storyboard.instantiateViewController(withIdentifier: "PasscodeCreateFirstViewController")
let passcodeVC = vc as! FUIPasscodeCreateController
// present the passcode view
let navController = UINavigationController(rootViewController: passcodeVC)
self.navigationController?.present(navController, animated: true, completion: nil)

FUIPasscodeInputController

Before the navigation controller presents this FUIPasscodeInputController, the following properties must be set up:

  • delegate: An implementation of FUIPasscodeControllerDelegate to handle events from this controller.

This controller will try to determine if Touch ID is enabled by retrieving the value from the keychain. If Touch ID is enabled, a Touch ID authentication popup prompts the user to authenticate with Touch ID.

If Touch ID authentication succeeds, the saved passcode is retrieved and the function shouldTryPasscode of the FUIPasscodeControllerDelegate implementation is invoked.

If Touch ID authentication is canceled or fails, the passcode view is shown to prompt the user to enter a passcode. After entering the passcode, the function shouldTryPasscode of the FUIPasscodeControllerDelegate implementation is invoked. Image

The delegate should dismiss this controller after the passcode is verified. isToShowCancelBarItem is false by default. When it is set to true, the cancel button displays on the navigation bar and can be used to dismiss the controller.

This passcode input flow is implemented in FUIPasscodeInputController.storyboard. There are two ways to invoke it:

  • Use another storyboard and add a Present Modally segue to the FUIPasscodeInputController storyboard in the SAPFiori framework bundle. The app programmer needs to provide the properties needed in UIController’s prepare for segue function:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
let destination = segue.destination as! UINavigationController
let vc0 = destination.viewControllers[0]
let vc = vc0 as! FUIPasscodeInputController
vc.delegate = passcodeControllerDelegate
}

  • Programmatically loads it:

let storyboard = UIStoryboard(name: "FUIPasscodeInputController", bundle: bundle)
let vc = storyboard.instantiateViewController(withIdentifier: "PasscodeInputViewController")
let passcodeVC = vc as! FUIPasscodeInputController

// present the passcode view
let navController = UINavigationController(rootViewController: passcodeVC)
self.navigationController?.present(navController, animated: true, completion: nil)

FUIPasscodeChangeController

Set up the following properties before presenting this FUIPasscodeChangeController:

  • passcodeControllerDelegate: An implementation of FUIPasscodeControllerDelegate that handles events from this controller for both FUIPasscodeInputController and FUIPasscodeCreateController.
  • validationDelegate: An implementation of FUIPasscodeValidationDelegate that validates the passcode entered by the user.

Here is the screen flow:

  • The first screen prompts the user to enter the current passcode using FUIPasscodeInputController. This controller always uses the passcode for authentication only.
    Note: Even if touchID is enabled, the controller does not use touchID for authentication. After a passcode is entered, function shouldTryPasscode of the FUIPasscodeControllerDelegate implementation is invoked. The application should not dismiss the controller in the shouldTryPasscode implementation.

  • The second screen prompts the user to enter a new passcode, which is validated by the FUIPasscodePolicy. The FUIPasscodeControllerDelegate provided function validate of validationDelegate is invoked for additional validation. Upon validation success, the next screen displays.

  • The third screen prompts the user to enter the passcode again to verify the passcode entered in the second screen. After the setup is complete, the function shouldTryPasscode of the FUIPasscodeControllerDelegate is invoked. The delegate should either create a secure store with the passcode, or save the passcode in a secure manner.
    Note: Changing the passcode does not affect the existing Touch ID preferences. No additional screens display to enable touchID to change the passcode flow. If touchID was previously disabled before triggering the passcode change, touchID remains disabled. However, if touchID was previously enabled, the internal touchID-related data is automatically updated after the passcode is changed.

This passcode flow change is implemented in FUIPasscodeChangeController.storyboard. There are two ways to invoke it:

  • Use another storyboard and add a Present Modally segue to the FUIPasscodeChangeController storyboard in the SAPFiori framework bundle. The app developer must provide the required properties in the UIController’s prepare for segue function:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
let changeController = segue.destination as! FUIPasscodeChangeController
changeController.passcodeControllerDelegate = passcodeControllerDelegate
changeController.validationDelegate = validationDelegate
}

  • Programmatically loads it:
if let changeController = FUIPasscodeChangeController.createInstanceFromStoryboard() {
changeController.passcodeControllerDelegate = passcodeControllerDelegate
changeController.validationDelegate = validationDelegate
self.present(changeController, animated: true, completion: nil)
}

Both Passcode and Touch ID screens are supported for iPad portrait and landscape orientation and iPhone portrait orientation only. Since the screens are not supported in iPhone landscape orientation, the app installed in iPhone must switch to portrait mode before presenting these screens. And the AppDelegate must lock the screen orientation when these screens display, as demonstrated in the following code snippet.

In app’s AppDelegate:


public var inPasscodeView: Bool = false

// implement this function to support only portrait orientation when FUIPasscodeView is displayed.
func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
if !inPasscodeView {
return .allButUpsideDown
} else {
return .portrait
}
}

Before presenting the Passcode or Touch ID screen:


// Let AppDelegate know that we are entering FUIPasscodeView
(UIApplication.shared.delegate as! AppDelegate).inPasscodeView = true

// Make sure we rotate to portrait mode
let value = UIInterfaceOrientation.portrait.rawValue
UIDevice.current.setValue(value, forKey: "orientation")
// Present the passcode view
self.navigationController?.present(navController, animated: true, completion: nil)

After dismissing the Passcode or Touch ID screen:


passcodeController.dismiss(animated: true, completion: nil)
// Let AppDelegate know that we are exiting FUIPasscodeView
(UIApplication.shared.delegate as! AppDelegate).inPasscodeView = false

  • This UIViewController is used to display a welcome/launch screen to the application for onboarding. The screen mainly displays the application name, instructions on how to start the activation process and an option to trigger the demo mode of the application. There are two versions of the launch screen. Version 1 does not have sign in. Version 2 has a sign in with an additional Activate button for activation process.

    FUIWelcomeScreen

    Application can implement the FUIOnboardingDelegate protocol, to present the demo mode of the application by adopting with the didSelectDemoMode function and to proceed sign in by implementing the didSelectSignIn function

    FUIWelcomeScreen is implemented in FUIWelcomeScreen.storyboard. There are two ways to launch the screen:

    • Use another story board and use a Present Modally segue to FUIWelcomeScreen storyboard in SAPFiori framework with com.sap.cp.sdk.ios.SAPFiori as Bundle. App programmer needs to provide the properties needed in UIController’s prepare for segue function:
    
     override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        let vc = segue.destination as! FUIWelcomeScreen
        vc.state = .isConfigured    //shows version2 of the launch screen
        //without calling vc.view.layoutSubviews(), components are not initialized. For example, vc.welcomeDetailLabel is still nil.
        vc.view.layoutSubviews()
        vc.welcomeDetailLabel.text = "Thank you for downloading SAP Project Companion for Managers."
        vc.delegate = self
     }
    
    
    • Programmatically loads it:
    
     let vc = FUIWelcomeScreen.createInstanceFromStoryboard()
     vc.state = .isConfigured  // shows version2 of the launch screen
     vc.welcomeDetailLabel.text = "Thank you for downloading SAP Project Companion for Managers."
     self.navigationController?.pushViewController(vc, animated: true)
    
    

    Note that the FUIWelcomeScreen is supported for iPad portrait and landscape orientation and iPhone portrait orientation only. Since the screen is not supported in iPhone landscape orientation, the app needs to switch to portrait mode before presenting the screen. And AppDelegate needs to lock the screen orientation when these screens are shown, similar to the following code snippet.

    In app’s AppDelegate:

    
     public var inFUIWelcomeScreen: Bool = false
    
     // implement this function to support only portrait orientation when FUIWelcomeScreen is displayed in iPhone.
     func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
         if !inFUIWelcomeScreen {
             return .allButUpsideDown
        } else {
            return .portrait
        }
     }
    
    

    Before presenting the FUIWelcomeScreen:

    
     // Let AppDelegate know that we are entering the screen
     (UIApplication.shared.delegate as! AppDelegate).inFUIWelcomeScreen = true
    
     // Make sure we rotate to portrait mode
     let value = UIInterfaceOrientation.portrait.rawValue
     UIDevice.current.setValue(value, forKey: "orientation")
    
     // Present the screen
     let vc = FUIWelcomeScreen.createInstanceFromStoryboard()
     vc.welcomeDetailLabel.text = "Thank you for downloading SAP Project Companion for Managers."
     self.navigationController?.pushViewController(vc, animated: true)
    
    

    After dismissing the Passcode or Touch ID screen:

    
     onboardingScreen.dismiss(animated: true, completion: nil)
    
     // Let AppDelegate know that we are exiting the view
     (UIApplication.shared.delegate as! AppDelegate).inFUIWelcomeScreen = false
    
    
    See more

    Declaration

    Swift

    public class FUIWelcomeScreen: UIViewController
  • This protocol provides method for handling button actions on a FUIWelcomeScreen view.

    See more

    Declaration

    Swift

    @objc public protocol FUIOnboardingDelegate : class
  • Describes different onboarding states in onboarding process flow.

    See more

    Declaration

    Swift

    public enum FUIOnboardingState: Int
  • This UIViewController is to be used by app to setup the passcode and enabling Touch ID screen flows.

    Before the navigation controller presents this FUIPasscodeCreateController, the following property needs to be set:

    Application can also set this property for more passcode validation checks:

    Here is the screen flow:

    • The first screen prompts user to enter passcode. After user entered the passcode which is validated with the FUIPasscodePolicy. The FUIPasscodeValidationDelegate provided function validate of validationDelegate is invoked for additional validation. If validation success, the next screen will be displayed; otherwise, the function throws FUIPasscodeControllerError when validation fails.
    • The second screen prompts user to enter passcode again to verify with the passcode entered in the first screen. The third screen will be displayed when the passcode entered matched the passcode entered and touch ID is allowed in FUIPasscodePolicy.
    • The third screen prompts user to decide if enable Touch ID authentication or not. If user chooses Enable the passcode is saved as a Touch ID protected keychain item so that the passcode could be retrieved by FUIPasscodeInputController later with Touch ID.

    After the setup is done, either with the third screen or not, the function shouldTryPasscode of the FUIPasscodeControllerDelegate is invoked. The delegate should either create a secure store with the passcode, or save the passcode in a secure manner.

    This passcode create flow is implemented in FUIPasscodeCreateController.storyboard. There are two ways to invoke it:

    • Use another story board and using a Present Modally segue to FUIPasscodeCreateController storyboard in SAPFiori’s framework bundle com.sap.cp.sdk.ios.SAPFiori. App programmer needs to provide the properties needed in UIController’s prepare for segue function:
    
     override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
         let destination = segue.destination as! UINavigationController
         let vc0 = destination.viewControllers[0]
         let vc = vc0 as! FUIPasscodeCreateController
         vc.delegate = passcodeControllerDelegate
     }
    
    
    • Programmatically loads it:
    
     let storyboard = UIStoryboard(name: "FUIPasscodeCreateController", bundle: bundle)
     let vc = storyboard.instantiateViewController(withIdentifier: "PasscodeCreateFirstViewController")
     let passcodeVC = vc as! FUIPasscodeCreateController
    
     // present the passcode view
     let navController = UINavigationController(rootViewController: passcodeVC)
     self.navigationController?.present(navController, animated: true, completion: nil)
    
    
    
    See more

    Declaration

    Swift

    public class FUIPasscodeCreateController: FUIPasscodeController, FUIPasscodeViewDelegate, FUITouchIDViewDelegate
  • This delegate is responsible to do additional validations to the passcode user entered. FUIPasscodeCreateController will validate the passcode user entered with the FUIPasscodePolicy internally.

    See more

    Declaration

    Swift

    public protocol FUIPasscodeValidationDelegate: class
  • This UIViewController is to be used by app to authenticate user by either Touch ID or Passcode.

    Before the navigation controller presents this FUIPasscodeInputController, the following properties needs to be setup:

    This controller will try to determine if Touch ID is enabled by retrieving the value from keychain. If Touch ID is enabled, there will be Touch ID authentication popup to prompt user authenticate with Touch ID.

    If Touch ID authentication succeeded, the saved passcode will be retrieved and function shouldTryPasscode of the FUIPasscodeControllerDelegate implementation will be invoked.

    If Touch ID authentication is canceled or failed, the passcode view will be shown to prompt user enter passcode. After user entered the passcode, function shouldTryPasscode of the FUIPasscodeControllerDelegate implementation will be invoked.

    The delegate should dismiss this controller after the passcode is verified.

    This passcode input flow is implemented in FUIPasscodeInputController.storyboard. There are two ways to invoke it:

    • Use another story board and using a Present Modally segue to FUIPasscodeInputController storyboard in SAPFioriUI framework bundle. App programmer needs to provide the properties needed in UIController’s prepare for segue function:
    
     override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
         let destination = segue.destination as! UINavigationController
         let vc0 = destination.viewControllers[0]
         let vc = vc0 as! FUIPasscodeInputController
         vc.delegate = passcodeControllerDelegate
     }
    
    
    • Programmatically loads it:
    
     let storyboard = UIStoryboard(name: "FUIPasscodeInputController", bundle: bundle)
     let vc = storyboard.instantiateViewController(withIdentifier: "PasscodeInputViewController")
     let passcodeVC = vc as! FUIPasscodeInputController
    
     // present the passcode view
     let navController = UINavigationController(rootViewController: passcodeVC)
     self.navigationController?.present(navController, animated: true, completion: nil)
    
    
    See more

    Declaration

    Swift

    public class FUIPasscodeInputController: FUIPasscodeController, FUIPasscodeViewDelegate
  • Use this UINavigationController to change the passcode screen flows in the application.

    Set up the following properties before presenting this FUIPasscodeChangeController:

    Here is the screen flow:

    • The first screen prompts the user to enter the current passcode using FUIPasscodeInputController. This controller always uses the passcode for authentication only. Note: Even if touchID is enabled, the controller does not use touchID for authentication. After a passcode is entered, function shouldTryPasscode of the FUIPasscodeControllerDelegate implementation is invoked. The application should not dismiss the controller in the shouldTryPasscode implementation.

    • The second screen prompts the user to enter a new passcode, which is validated by the FUIPasscodePolicy. The FUIPasscodeControllerDelegate provided function validate of validationDelegate is invoked for additional validation. Upon validation success, the next screen displays.

    • The third screen prompts the user to enter the passcode again to verify the passcode entered in the second screen. After the setup is complete, the function shouldTryPasscode of the FUIPasscodeControllerDelegate is invoked. The delegate should either create a secure store with the passcode, or save the passcode in a secure manner. Note: Changing the passcode does not affect the existing Touch ID preferences. No additional screens display to enable touchID to change the passcode flow. If touchID was previously disabled before triggering the passcode change, touchID remains disabled. However, if touchID was previously enabled, the internal touchID-related data is automatically updated after the passcode is changed.

    This passcode flow change is implemented in FUIPasscodeChangeController.storyboard. There are two ways to invoke it:

    • Use another storyboard and add a Present Modally segue to the FUIPasscodeChangeController storyboard in the SAPFiori framework bundle. The app developer must provide the required properties in the UIController’s prepare for segue function:
    
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
       let changeController = segue.destination as! FUIPasscodeChangeController
       changeController.passcodeControllerDelegate = passcodeControllerDelegate
       changeController.validationDelegate = validationDelegate
    }
    
    
    • Programmatically load it:
    if let changeController = FUIPasscodeChangeController.createInstanceFromStoryboard() {
       changeController.passcodeControllerDelegate = passcodeControllerDelegate
       changeController.validationDelegate = validationDelegate
       self.present(changeController, animated: true, completion: nil)
    }
    
    
    See more

    Declaration

    Swift

    public class FUIPasscodeChangeController: UINavigationController
  • This is the base class of FUIPasscodeCreateController and FUIPasscodeInputController. It has the common codes for those two view controllers.

    Note that both Passcode screen and Touch ID screen are supported for iPad portrait and landscape orientation and iPhone portrait orientation only. Since the screens are not supported in iPhone landscape orientation, the app installed in iPhone needs to switch to portrait mode before presenting these screens. And AppDelegate needs to lock the screen orientation when these screens are shown, similar to the following code snippet.

    In app’s AppDelegate:

    
     public var inPasscodeView: Bool = false
    
     // implement this function to support only portrait orientation when FUPasscodeView is displayed in iPhone.
     func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
         if !inPasscodeView {
             return .allButUpsideDown
         } else {
             return .portrait
         }
     }
    
    

    Before presenting the Passcode or Touch ID screen:

    
     // Let AppDelegate know that we are entering FUIPasscodeView
     (UIApplication.shared.delegate as! AppDelegate).inPasscodeView = true
    
     // Make sure we rotate to portrait mode
     let value = UIInterfaceOrientation.portrait.rawValue
     UIDevice.current.setValue(value, forKey: "orientation")
     // Present the passcode view
     self.navigationController?.present(navController, animated: true, completion: nil)
    
    

    After dismissing the Passcode or Touch ID screen:

    
     passcodeController.dismiss(animated: true, completion: nil)
     // Let AppDelegate know that we are exiting FUIPasscodeView
     (UIApplication.shared.delegate as! AppDelegate).inPasscodeView = false
    
    

    The strings used in FUIPasscodeSetupView, FUIPasscodeView, and FUITouchIDView are from localized Onboarding.strings file. Application can override these strings by setting the corresponding static variables in this FUIPasscodeController class at runtime.

    See more

    Declaration

    Swift

    public class FUIPasscodeController: UIViewController
  • This protocol defines the functions needed for FUIPasscodeController to notify the app about passcode and TouchID events.

    See more

    Declaration

    Swift

    public protocol FUIPasscodeControllerDelegate: class
  • This error is to be thrown by FUIPasscodeControllerDelegate implementation when function shouldTryPasscode is called with a passcode that failed to open the secure store or match the saved passcode.

    See more

    Declaration

    Swift

    public enum FUIPasscodeControllerError: Error
  • Passcode input mode. Typically used in shouldTryPasscode function as one of the arguments to indicate the current mode. When the shouldTryPasscode function is triggered by FUIPasscodeInputController, the mode can be either match or matchForChange. when the function is triggered by FUIPasscodeCreateController, the mode is either create or change.

    See more

    Declaration

    Swift

    public enum FUIPasscodeInputMode: Int