FUIUserConsentViewController

open class FUIUserConsentViewController : UIViewController, FUIUserConsentPageViewControllerDelegate, ConsentPageDisplayDelegate

This UIViewController is used to display a series of user consent screens modally during the process of onboarding. The property forms must be supplied, which is an array of objects of the two classes that conform to the FUIUserConsentForm protocol, namely FUISinglePageUserConsentForm and FUIMultiPageUserConsentForm. The Fiori for iOS SDK takes these forms and displays them modally as single or multipage user consent screens using the FUIUserConsentViewController. A user consent screen contains a title, a brief information on the topic for which the user consent is required and a link to more details. There are 2 buttons in the toolbar, “Agree” and “Deny”, if the consent form is mandatory or “Agree” and “Not Now”, if the consent form is optional. In the case of a mandatory form, the user can proceed to the next step of onboarding only when they agree to the terms stated in the form. In the case of an optional form, the user can choose to click the “Not Now” button and proceed with the onboarding. In addition, there is a “Cancel” button in the navigation bar. The toolbar buttons and the cancel button invoke the FUIUserConsentViewControllerDelegate methods which can be used to handle the application logic based on the user input. If the form is a multi-page consent form, only the last page in the form displays the toolbar and cancel buttons. Each consent form has the title property,body containing the details, an actionTitle, which when tapped invokes the actionHandler. There are also the titleAttributedText, bodyAttributedText and actionTitleAttributedText properties, which when supplied take precedence over the title, body and actionTitle properties. For example, when both titleand titleAttributedText are supplied, only titleAttributedText is displayed.

FUIUserConsentViewController


 let spForm = createSinglePageForm()
 spForm.isRequired = false
 let mpForm = createMultiPageForm()
 mpForm.isRequired = false
 let forms = [spForm,mpForm] as [Any]

 (UIApplication.shared.delegate as! AppDelegate).inUserConsentScreen = true
 let ctrller = FUIUserConsentViewController()
 ctrller.delegate = self
 ctrller.forms = forms as! [FUIUserConsentForm]
 self.navigationController?.present(ctrller, animated: true, completion: nil)


 func createSinglePageForm()->FUISinglePageUserConsentForm {
 let singlepageform = FUISinglePageUserConsentForm()
 singlepageform.title.text = "Data Privacy"
 singlepageform.body.text = "Detailed text about how data privacy pertains to this app and why it is important for the user to enable this functionality"
 singlepageform.actionTitle.text = "Learn more about Data Privacy"
 singlepageform.actionHandler = { controller in
 let alert = UIAlertController(title: "Want Data Privacy?", message: "Be wise about your data", preferredStyle: UIAlertControllerStyle.alert)
 alert.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.default, handler: nil))
 controller.present(alert, animated: true, completion: nil)
 }
 return singlepageform
 }

 func createMultiPageForm()->FUIMultiPageUserConsentForm {
 let page1 = FUIUserConsentPage()
 page1.title.text = "Data Privacy"
 page1.body.text = "Detailed text about how data privacy pertains to this app and why it is important for the user to enable this functionality"
 page1.actionTitle.text = "Learn more about Data Privacy"
 page1.actionHandler = { controller in
 let alert = UIAlertController(title: "Data Privacy", message: "Alert for Data Privacy Page", preferredStyle: UIAlertControllerStyle.alert)
 alert.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.default, handler: nil))
 controller.present(alert, animated: true, completion: nil)
 }

 let page2 = FUIUserConsentPage()
 page2.title.text = "Security"
 page2.body.text = "Detailed text about how data privacy pertains to this app and why it is important for the user to enable this functionality. "
 page2.actionTitle.text = "Learn more about Data Privacy"
 page2.actionHandler = { controller in
 let alert = UIAlertController(title: "Security", message: "Alert for data security page", preferredStyle: UIAlertControllerStyle.alert)
 alert.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.default, handler: nil))
 controller.present(alert, animated: true, completion: nil)
 }

 let page3 = FUIUserConsentPage()
 page3.title.text = "Consent"
 page3.body.text = "Detailed text about how data privacy pertains to this app and why it is important for the user to enable this functionality"
 page3.actionTitle.text = "Learn more about Data Privacy"
 page3.actionHandler = { controller in
 let alert = UIAlertController(title: "Consent", message: "Alert for consent page", preferredStyle: UIAlertControllerStyle.alert)
 alert.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.default, handler: nil))
 controller.present(alert, animated: true, completion: nil)
 }

 let userconsentpages = [page1,page2,page3]
 let multipageform = FUIMultiPageUserConsentForm(pages: userconsentpages)
 return multipageform
 }

Application should also implement the FUIUserConsentViewControllerDelegate protocol, which provides the delegate methods that handle the application flow based on whether the user agrees, disagrees or cancels the form. It is important that the FUIUserConsentViewController, passed in as the parameter viewController must be dismissed first as shown below, before proceeding with any other application logic based on the user response to the forms.


func userConsentViewController( viewController: FUIUserConsentViewController, didCancelConsentForms forms: [FUIUserConsentForm]) {

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

    let alert = UIAlertController(title: "Cancelled", message: "User cancelled Onboarding", preferredStyle: UIAlertControllerStyle.alert)
    (UIApplication.shared.delegate as! AppDelegate).inUserConsentScreen = false
    alert.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.default, handler: nil))
    self.present(alert, animated: true, completion: nil)

}

func userConsentViewController( viewController: FUIUserConsentViewController, didReceiveResponseToConsentForms forms: [FUIUserConsentForm]) {

    (UIApplication.shared.delegate as! AppDelegate).inUserConsentScreen = false
    var NumAccepted = 0
    for form in forms  {
        if (form.isUserAccepted) {
            NumAccepted = NumAccepted + 1
        }
    }
    viewController.dismiss(animated: true, completion: nil)
    if (NumAccepted > 0) {
        let alert = UIAlertController(title: "Status", message: "User accepted \(NumAccepted) form(s)", preferredStyle: UIAlertControllerStyle.alert)
        alert.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.default, handler: nil))
        self.present(alert, animated: true, completion: nil)
    }
}

Note that the user consent screen orientations are 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 the AppDelegate needs to lock the screen orientation when these screens are shown, similar to the following code snippet.

In app’s AppDelegate:


 public var inUserConsentScreen: Bool = false

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

Before presenting the FUIUserConsentViewController:


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

 // Present the screen
 self.navigationController?.present(ctrller, animated: true, completion: nil)

After dismissing the FUIUserConsentViewController screen:


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

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

## Theming

Supported class paths:

 fdlFUIUserConsentPageView_title {}
 fdlFUIUserConsentPageView_body {}
 fdlFUIUserConsentPageView_actionTitle {}

Supported properties:

 font-color: Color;
 font-style: UIFontTextStyle;
 text-line-clamp: Integer;
 text-align: NSTextAlignment;

Supported NavigationBar class paths:

 fdlFUIUserConsentViewController_navigationBar {}

Supported NavigationBar properties:

 bar-tint-color: Color;
 background-color: Color;

## Attention

The delegate object with type FUIUserConsentViewControllerDelegate is declared as a weak reference. On deallocation it will be automatically set to nil. To keep it alive as expected, developer should retain the delegate object during the whole execution scope.

  • The array of forms to be displayed to receive user consent. Consists of instances of FUISinglePageUserConsentForm and/or FUIMultiPageUserConsentForm

    Declaration

    Swift

    public var forms: [FUIUserConsentForm]
  • The delegate invoked upon completion or cancellation of user consent forms

    Declaration

    Swift

    public weak var delegate: FUIUserConsentViewControllerDelegate?
  • This is the custom message to be displayed on the alert when the user presses Cancel on the consent form.

    The default message is the localized string: “Are you sure you want to quit the onboarding process?”

    Declaration

    Swift

    public var cancelConfirmationMessage: String?
  • This is the custom message to be displayed on the alert when user clicks Disagree on a required consent form.

    The default message is the localized string “Without consent you will not be able to continue onboarding.”

    Declaration

    Swift

    public var alertMessage: String?
  • This is the custom title for the “Quit” button to be displayed on the alert when user Disagree on a required consent form.

    The default button title is the localized string “Quit”.

    Declaration

    Swift

    public var alertQuitTitle: String?
  • This is the custom title for the “Give Consent” button to be displayed on the alert when user Disagree on a required consent form.

    The default button title is the localized string “Give Consent”.

    Declaration

    Swift

    public var alertGiveConsentTitle: String?
  • Workaround for the compile issue where empty initializer is not accessible in xcframework.

    Declaration

    Swift

    required public init()