All notable changes to this project will be documented in this file. To know better on how to write and maintain a changelog, refer to this link.
- Added support for AIS+PIS.
- Some bank apps don't work very well, so when a user is redirect from the SDK to a banking app of their choice, oftentimes they would get stuck. There's a new system in place where the SDK will attempt to reload the payment to then allow the user to try tapping the "Go to bank" button again.
Implementation-wise, this means :
- The SDK is only created, configured, and presented once per payment, and that same SDK instance is used start-to-finish until the payment fails or succeeds.
- The
.redirect
case is no longer sent by the SDK for the client app to handle, and is deprecated.
Other than that, your previous SDK configuration/handling code should remain fully compatible without a need for any updates.
- A new system of coordinating presented
UIViewController
s that would try to detect and prevent interference with the normal TrueLayer navigation flow. (Generally, the client app should not present external view controllers while the TrueLayer SDK is running. Failing to do so would previously lead to crashes; the new system aims to instead gracefully stop the SDK flow and alert the developer about a mistake on their part.)
- Improved the accessibility experience, especially when using VoiceOver
- Rebuilt the codebase for iOS 18 and the new Apple devices
- All payment amount labels are now formatted to always display the quota with two decimal places (e.g. $1.00 instead of $1).
- The detail label for "you're sending" is now formatted to include both the beneficiary name and the merchant name when possible — unless both are the same, or this data is missing.
- The navigation bars in the SDK now behave correctly when an app is using global navigation bar style overrides using the
UIAppearance
API. - Fixed a crash for several mandate-related APIs.
- Support for falling back to displaying the HPP web view — so that if, for any reason, the native SDK flow is not available, the payment can still continue.
resultShown
toprocessSinglePayment
andprocessMandate
completion handlers. Thisenum
informs which result was shown on the result screen, if it was shown (shouldShowResultScreen
is set totrue
.) If not,ResultShown.noneShown
will be returned.- Search for countries by their 2 and 3-letter country codes.
- Error shown for additional inputs when no options are available.
- New
processSinglePayment
andprocessMandate
methods. The object returned in the completion handler is now of typeTrueLayer.Payments.Models.SinglePayment.ProcessResult
andTrueLayer.Payments.Models.Mandate.ProcessResult
. These areenum
s with associated objects that containstate
anderror
properties, as you would access previously. - Improved branch searching to better match intended branch names.
- Default colours for the primary and secondary buttons.
shouldShowResultScreen
to@objc TrueLayerSinglePaymentPreferences
and@objc TrueLayerMandatePreferences
objects (default value istrue
). When this is enabled, a result screen is displayed at the end of the payment flow. When the user is redirected back from the bank, it is recommended to re-invoke the TrueLayer SDK to display the result screen, to show the user the status of their payment or mandate.maximumResultScreenTimeout
to@objc TrueLayerSinglePaymentPreferences
and@objc TrueLayerMandatePreferences
objects. This is the maximum timeout for the payment or mandate result screen, until a final status. Once reached, the user is shown a button to dismiss the SDK and return to your app.
shouldShowResultScreen
toSinglePayment
andMandate
Preferences
objects (default value istrue
). When this is enabled, a result screen is displayed at the end of the payment flow. When the user is redirected back from the bank, it is recommended to re-invoke the TrueLayer SDK to display the result screen, to show the user the status of their payment or mandate.maximumResultScreenTimeout
toSinglePayment
andMandate
Preferences
objects. This is the maximum timeout for the payment or mandate result screen, until a final status. Once reached, the user is shown a button to dismiss the SDK and return to your app.- Italian localisations for text displayed to the user.
- Updated
TrueLayer.Payments.Models.Mandate.Error
andTrueLayer.Payments.Models.SinglePayment.Error
cases. These more accurately match errors received from the TrueLayer Payments API V3. - Merchant logo now appears on the right on the consent screen.
useCase
fromTrueLayer.Payments.Models.SinglePayment.Preferences
. To enable Signup+ for a payment, refer to the API documentation when creating a payment.
- Removed requirement for thread locking to prevent possible crashes related to a semaphore not releasing in time during de-initialisation.
- Fixed some screens being retained after the payment processing is completed.
- Saved accounts selection and removal, for future users who decide to save their account with TrueLayer.
- Recently used providers are combined into the same section as other providers on the provider selection list.
- Possibility for the user to select the SEPA scheme when applicable. To enable it set
scheme_selection
is set touser_selected
when creating the payment. Please refer to the Create Payment documentation for more information. - Refinements to the user interface design.
- Better branch selection. If a user looks for a branch now in the provider screen he will be able to select it, and not have to input it again where additional inputs are required.
- Provider offline detection for pre-selected providers.
- Loader not showing when making certain network calls.
- A new screen for selected banks in France and Finland primes new users on how to enable international payments from their bank, when the payment is being sent internationally
- Providers are now sorted by market share on the provider selection screen.
- Providers now show when their connection is offline before the user selects them.
- New error cases:
invalidRedirectURI
error case toTrueLayer.Payments.Models.Mandate.Error
andTrueLayer.Payments.Models.SinglePayment.Error
.providerOffline
error case toTrueLayer.Payments.Models.Mandate.Error
andTrueLayer.Payments.Models.SinglePayment.Error
. It will be thrown only if the provider is pre-selected.
- PISP license holders who are processing payments under their certificates can now choose to remove TrueLayer branding from the user interface. Contact us to enquire about enabling this feature.
- Support for Signup+ transactions via a new parameter
useCase
in theTrueLayer.Payments.Models.SinglePayment.Preferences
initializer.
- A UI bug that prevented the users to use the SDK when accessibility was set > AX3.
- General minor UI fixes.
- General enhancements aiming to increase conversion in Germany based on collected data.
- IBAN validation on device to reduce possibility of encountering an error when an IBAN is inserted.
- Automatic retries on 500 errors to reduce the possibility of failure should the server recover.
- Support for search using alternative search terms (like BLZ with German banks) to make it easier for users to find their banks.
- A recurring payment displays the merchant's sort code and account number where applicable.
- Support for customising the SDK from the
ObjectiveC
layer.
- SDK animation when processing a payment between initial
UIActivityViewController
and firstSDK
screen.
- Added support for
Objective-C
viaSwift Package Manager
.
Internal work was done to enable support for react native.
- Added
processMandate(context:then:)
to process a new payment mandate in the United Kingdom. - Added
mandateStatus(mandateIdentifier:resourceToken:)
to retrieve the status of recurring payment mandate.
- Removed the
push
presentation style aspresent
was overwhelmingly the most used by users and it provided a far better animation.
- All public APIs in frameworks other than TrueLayerSDK are now @_spi protected as they should not be used and can change without prior notice.
- Renamed
processPayment(context:then:)
toprocessSinglePayment(context:then:)
. - Renamed
paymentStatus(paymentIdentifier:resourceToken:)
tosinglePaymentStatus(paymentIdentifier:resourceToken:)
. - Renamed
Context(paymentIdentifier:resourceToken:redirectURL:presentationStyle:)
toContext(identifier:token:redirectURL:preferences:)
. - Moved
presentationStyle
under thePreferences
object. - Changed
TrueLayer.Payments.Models.Payment.Context
,TrueLayer.Payments.Models.Payment.Preferences
, andTrueLayer.Payments.Models.Payment.Status
toSinglePayment
namespace. - Changed
TrueLayer.Payments.PaymentState
toTrueLayer.Payments.Models.SinglePayment.State
. - Changed
TrueLayer.Payments.Error
toTrueLayer.Payments.Models.SinglePayment.Error
.
- Fixed a crash when selecting a country on iOS 15.0
- Fixed a bug where the search result would not dismiss after selecting a country.
- Fixed the completion not invoked when the SDK is pushed.
- Support to fetch the status of a payment given its identifier and resource token.
- Support for persisting previously selected options in a long list under additional inputs, and recommending it for returning users.
- Fix navigation bar background color for iOS 15+.
- Support for OTP validation via PhotoTan and SMS.
- Added a padlock symbol on additional inputs Continue button when there is a sensitive text field.
- Added new localized title and button text for the Review Payment screen, which changes depending if the next step are additional inputs or a redirect to bank.
- [BREAKING] Support for
wait
action. The user will see a screenwait
screen while theSDK
polls for an updated payment status. If the polling takes too long, the SDK will now return await
action in the success phase.
- Fix consent screen beneficiary text not word wrapping when using large accessibility text sizes.
- Added logic to make sure the
IBAN
additional input is displayed on its own screen. - Added auto-capitalization for the
IBAN
additional input. - Added support for additional inputs of
select
type. Example branch selection.
- Fix
continue
button being enabled on additional inputs even when text fields not valid. - Fix behavior of textfields to automatically limit the character count of a textfield based on its type.
- Fix keyboard type to match the type of the textfield.
- Fix callback not being invoked when dismissing a modal SDK on a navigation controller.
- Fix beneficiary name not showing on consent screen.
This new release focuses on polishing what was built with 1.0.0
, and fixing minor visual bugs specifically in the country selection. In addition it introduces support for 2 new features: cancel payment, and IBAN additional input.
ATTENTION: This minor update contains necessary breaking fixes. However, we opted for a minor change because those breaking changes are rather irrelevant and should not impact already integrated SDKs.
- Support for cancel payment. When the user dismisses the payment, an API call is made to cancel it on the backend as well.
- Support for IBAN input required by some banks.
- Fix country picker not automatically showing in providers list when no country is selected.
- Fix country picker not displaying which country is selected.
- Fix countries not displayed in alphabetical order in country picker.
- Fix remote image cropped out randomly on certain OS versions.
- Fix tableviews displaying empty rows in versions prior to iOS 15.
- [BREAKING] Fix the order of parameters in
configure
makingenvironment
first, followed byvisualSettings
. - [BREAKING] Fix the type of completion from
AuthorizationFlowResult
toResult<PaymentState, Error>
since the former referencedTrueLayerUI
which should not be used by the merchant. - Fix parsing of the
status: failed
response expected from authorization flow related network calls, and return the correct error to the merchant. - Fix recently used providers showing all providers regardless of the selected country.
- Possibility to process a one time payment using a user selected provider.
- Possibility to process a one time payment with a pre-selected provider.
- Possibility to customize the UI colors.
- Support for the following languages:
- Dutch
- English
- Finnish
- French
- German
- Italian
- Polish
- Portuguese
- Spanish