Authorise mandates with the iOS SDK
Learn how to install and set up the SDK so your users can authorise mandates.
If you have an integration that can create a mandate and get the associated id
, you can use the iOS SDK to authorise it.
Before you start
Register a redirect URL in Console. Go to Console > Settings > Allowed redirect URIs to do this. Your user is redirected back to your redirect URL, typically your website or application, at the end of the mandate authorisation journey.
You also need an integration that can create a mandate, and get a mandate id
, to start the iOS SDK. Learn more about how to create a mandate, and authenticate, and sign your requests.
Ensure that you are using a minimum of the following software versions:
- iOS 13.0
- Xcode 13
- Swift 5.6
Configuration overview for mandates with the iOS SDK
There are five general steps to configuring the iOS SDK with the Payments API v3:
- Install the SDK
- Start the SDK
- Process the mandate authorisation
- Handle the authorisation result
- Display the mandate result screen
1. Install the SDK
There are two different methods you can use to install the iOS SDK. The Swift Package Manager or Cocoapods.
Install the SDK with Swift Package Manager
The SDK is released as a compiled binary in the form of a series of XCFrameworks artefacts.
To install the SDK using Swift Package Manager:
- Open your app in Xcode.
- In the Project Navigator, go to the project.
- In the Project panel, select the project.
- Go to the Package Dependencies tab.
- Select +.
- Enter
https://github.com/Truelayer/truelayer-ios-sdk
in the search bar and select Enter. - Select Add Package.
- Follow the steps in Xcode to install the SDK.
Install the SDK with CocoaPods
To install the SDK through CocoaPods, specify TrueLayerPaymentsSDK
in your Podfile:
pod 'TrueLayerPaymentsSDK
2. Start the SDK
Although the method to start the SDK makes reference to 'payments', it applies to both payments and mandates.
The SDK has two methods: configure(environment:visualSettings:)
and processPayment(context:then:)
, which are used to invoke the SDK and process mandates respectively.
The interface that exposes all functions can be accessed through its singleton TrueLayer.Payments.manager
.
To use the SDK, you have to invoke its configure(environment:visualSettings:)
method. This method should be invoked once.
You also need to specify the environment to process mandates in: .production or .sandbox. The environment determines which TrueLayer backend your app will use to process the mandate.
You should initialize the SDK inside your AppDelegate
, SceneDelegate
, or any other container to manage your dependencies.
The following example shows how this can be done using the SceneDelegate
:
import TrueLayerPaymentsSDK
class SceneDelegate: UIResponder, UIWindowSceneDelegate {
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
guard let windowScene = scene as? UIWindowScene else { return }
Task {
await TrueLayer.Payments.manager.configure(environment: .sandbox)
}
}
}
3. Process and authorise the mandate
Once your app has obtained the mandate identifier
(mandate id
) and the token
(access_token
) from the backend, it can use the SDK to process the mandate. This is an example of how to process a mandate in Swift:
TrueLayer.Payments.manager.processMandate(
context: TrueLayer.Payments.Models.Mandate.Context(
identifier: // Your mandate ID,
token: // Your resource token,
redirectURL: // Your redirect URL
preferences: // Your possible preferences like type of presentation and country code.
)) { processResult in
switch processResult.result {
case .success(let success):
// Handle `TrueLayer.Payments.Models.Mandate.State`.
print(success.state)
case .failure(let failure):
// Handle `TrueLayer.Payments.Models.Mandate.Error`.
print(failure.error)
}
// Handle `resultShown`.
print(processResult.resultShown)
}
Mandate parameters
These are the parameters used above when you process the mandate:
-
identifier
: The mandateid
retrieved from your backend. -
token
: The mandateaccess_token
retrieved from your backend. -
redirectURL
: The destination where the user should be redirected once the authorisation flow is done outside of the app (bank website, HPP). This is usually your app's redirect URI set in Console.To ensure that any redirects back to your app work properly, use universal links for the redirect URI and other links throughout your app. Read the Apple documentation for more information on setting up and troubleshooting universal links.
-
preferences
The preferences parameter enables you to customise the authorisation flow. It contains the following options:presentationStyle
: Determines how the SDK should be presented.preferredCountryCode
: The preferred country to use when displaying the providers. If the country is invalid, or does not include any providers, the value will fallback to the user's locale.
shouldShowResultScreen
: Whether the TrueLayer SDK should show the mandate result screen. See the display the mandate result screen section below.maximumResultScreenTimeout
: The maximum timeout for refreshing the mandate result screen. See the display the mandate result screen section below.
When the user is redirected back to your app from their bank app or website, we recommend that you re-invoke processMandate(...)
with the same Context
. This is because some banks require further input from the user, which the SDK can present.
4. Handle redirects and display the authorisation result
Once the redirects are complete, you receive a success or error callback, which renders in the mandate result screen.
Handle redirects from the provider
At the end of a redirect flow the bank app will relaunch your app with the return URI you specified in Console.
In your application fetch the redirect parameters. These must include the mandate id
(or identifier
in the SDK). For more information on handling deep links, follow the iOS documentation here and here.
Whenever you are redirected to your app, you should reinvoke the SDK, until you receive a success or error callback.
By default the SDK offers a mandate result screen, which displays the result of the payment and advises the user on what to do in case of a failed payment. If you disable the mandate result screen, a noneShown
result is returned, you can use the success or error callback to render a screen for your user when they return to your app.
We also recommend that you check the payment status to confirm the result of a payment.
When your user's default browser is not Safari, some banks and TPP applications may fail to redirect the user.
To fix this, go to your iOS app code. Navigate to your
info.plist
and add the entryLSApplicationQueriesSchemes
. Set its Type tostring
and Value tohttps
.For more information, see Apple's documentation on Launch Service Keys.
Mandate success results
The SDK returns the following results for TrueLayer.Payments.Models.SinglePayment.State
if a mandate was successfully authorised or is in progress:
TrueLayer.Payments.Models.Mandate.State value | Description |
---|---|
.authorized | The user authorised the mandate with the bank. |
.redirect | The user has been redirected to the bank to authorise the mandate. |
Mandate failure results
The SDK returns the following results for TrueLayer.Payments.Models.Mandate.Error
if mandate authorisation has failed for any reason.
Expand to see all mandate failure results
TrueLayer.Payments.Models.SinglePayment.Error value | Description |
---|---|
.authorizationFailed | The user could not authorise the mandate with their bank. |
.connectionIssues | There was an issue while connecting to the internet. |
.generic | A unexpected error, the error will be passed as a String parameter. |
.invalidToken | The token used to make the mandate doesn't have the necessary scopes . |
.invalidRedirectURI | The redirect URI passed to the SDK is invalid. |
.mandateExpired | The user took too long to authorise the authorise so it expired. |
.mandateNotFound | The requested mandate was not found. |
.mandateRejected | The mandate was rejected by the bank. |
.providerOffline | The pre-selected provider was offline. |
.revoked | The mandate has been revoked and is no longer valid. |
.sdkNotConfigured | The SDK configure method has not been called before using it. |
.serverError | The server encountered an error while processing the answer. |
.providerError | The provider has unexpectedly failed when creating the mandate. |
.providerRejected | The provider rejected the mandate. |
.invalidRequest | The mandate failed due to invalid data in the request. |
.invalidSortCode | The mandate failed due to an invalid sort code being provided. |
.unknownError | The mandate failed for an unknown reason on the server side. |
.unexpectedBehavior | The SDK encountered an unexpected behaviour. |
.userCanceled | The user canceled the mandate. |
Check the status of a mandate
You can use the following method in the iOS SDK to get the current status of a mandate:
func mandateStatus(
mandateIdentifier:,
resourceToken:
) async throws -> TrueLayer.Payments.Models.Mandate.Status
These are the different mandate statuses the SDK can return for TrueLayer.Payments.Models.Mandate.Status
:
Status returned in TrueLayer.Payments.Models.Mandate.Status | Description |
---|---|
.authorizationRequired | The mandate requires authorisation by the user. |
.authorizing | The user is currently authorising the mandate. |
.authorized | The user has authorised the mandate with their bank. |
.revoked | The mandate has been revoked and is no longer valid. |
.failed | The mandate failed. This can be due to various reasons, explained in the Error object. |
5. Display the mandate result screen
We recommend that you display the mandate result screen to your customers (learn more about the mandate result screen). The mandate results screen shows your user the result of the mandate. If it fails, it recommends the appropriate action for them to take to resolve the problem.
Mandate result screen configuration
Configuration options for the mandate result screen are within the Preferences
object when you begin to process the mandate.
To enable the mandate result screen in the iOS SDK, ensure that the shouldShowResultScreen
within the Preferences
object retains its default value of true
. This ensures that the iOS SDK displays the result of a mandate at the end of the authorization flow.
This screen automatically refreshes until the mandate is authorised, or until a maximum timeout is reached. You can reduce the duration until the timeout by providing a value for maximumResultScreenTimeout
within Preferences
. By default, this timeout is 10 seconds, and cannot be set longer as the SDK uses 10s if you pass a greater value.
Updated 5 months ago