Klarna Docs - Adding Klarna Checkout SDK to Your App - Native Integration

Adding Klarna Checkout SDK to Your App - Native Integration

Integration guide for how to integrate Klarna Checkout in your iOS app, using the native integration.

This guide will teach you how to:

  • Initialize the Checkout SDK
  • Present the checkout view in your app
  • Listen to SDK events


The components in the native approach are:

  • An integration of Klarna Checkout from your servers to Klarna’s servers
  • An end-point on your servers, where Klarna Checkout is fetched from the mobile SDK
  • Klarna Checkout SDK for mobile apps
  • Your mobile app

In your mobile app you will need to fetch a Klarna Checkout HTML snippet from your web server. This integration guide will not go through the Klarna Checkout integration in detail, but assumes it has been set up already and is available at an API endpoint YOUR-URL on your servers. If needed, you can learn how to do it in the regular Klarna Checkout Integration guide here.

The communication between your mobile app, Klarna’s SDK, your servers and Klarna’s servers


Initialize SDK with the Checkout snippet

To initialize the Klarna Checkout in your native flow, create a KlarnaCheckout object and supply a Checkout HTML snippet hosted at YOUR-URL :

initWithViewControllerUIViewControllerThe View Controller that will contain the checkout view
returnURLNSURLURL schema as defined in your info.plist to return from external applications. Learn more about it here
    self.checkout = [[KCOKlarnaCheckout alloc] initWithViewController:self redirectURI:<YOUR-URL>];
    checkout.snippet = @"<div id='klarna-checkout-container'><script>...</script></div>";

Setting the snippet will start preloading the checkout, which ensures a better experience for the users.

Present Klarna Checkout view

You have two options for presenting the Klarna Checkout view:

  • Full size Checkout - spanning the whole screen, page scrolling takes place within the HTML snippet
  • Embedded Checkout - embedded, page scrolling takes place outside the HTML snippet

Full size Checkout

If you want to display this view controller taking all screen space, you can use it as usual by pushing it in your navigation stack:

UIViewController<KCOCheckoutViewController> *viewController = [checkout checkoutViewController];
// This viewController can be displayed as is.
[self.navigationController pushViewController:viewController];

Embedded Checkout

Or, if you want to integrate it in your own native checkout flow, you can add the checkoutViewController as a childViewController and handle resize events for the checkout.

First, you need to disable internal scrolling and supply a sizing delegate implementing KCOEmbeddableCheckoutSizingDelegate. This will make the viewController fill its internal scrollview to its parent and not scroll.

viewController.internalScrollDisabled = YES;
viewController.sizingDelegate = self;
viewController.parentScrollView = self.scrollView;

You are then responsible for resizing the checkout view to be as big as it needs to be. To do this, you’ll need to implement the resize method. At this point, whether you manually set frames or use autolayout is totally up to you.

- (void)checkoutViewController:(id)checkout didResize:(CGSize)size
// Update the size of the checkout view controller to match the new size.

Configure event listeners

To handle the signals received from the SDK, you should set up an observer listening to the KCOSignalNotification. To ensure the checkout shows the successful screen, you need to load confirmation HTML snippet upon receiving the complete message.

- (void)handleNotification:(NSNotification *)notification
  NSString *name = notification.userInfo[KCOSignalNameKey];
  NSDictionary *data = notification.userInfo[KCOSignalDataKey];

  if ([name isEqualToString:@"complete"]) {
    if (uri && [uri isKindOfClass:[NSString class]] && uri.length > 0) {
      NSURL *url = [NSURL URLWithString:uri];
      checkout.snippet = confirmationSnippet;

You may also want to set up event listeners to track field changes in the Klarna Checkout before the order is placed. See the reference guide for what events are available.

Suspend and resume Checkout

When a server-side call to Klarna is being processed, you can trigger the 'suspend' action to prevent the user/customer from altering the state of their Checkout order. The suspend action will turn the Klarna Checkout unresponsive to user interactions.

[self.checkout suspend];

After the server-side call to Klarna has been processed, you should trigger the 'resume' action to once again let the user interact with Klarna Checkout.

[self.checkout resume];

Handling External Payment Methods

If you wish to handle external payment methods (such as PayPal, Google Pay, etc), you can turn on the following feature flag in the SDK. By doing so, the Klarna Checkout will not handle the external payment methods automatically:

self.checkout.merchantHandlesEpm = YES;

Note: This flag should be set before starting the Checkout process.

Whenever the SDK reaches an external payment method selected by the customer, you will receive an event named 'external' in your callback with a 'uri' parameter pointing to the external payment’s URL:

- (void)handleNotification:(NSNotification *)notification
   NSString *name = notification.userInfo[KCOSignalNameKey];
   NSDictionary *data = notification.userInfo[KCOSignalDataKey];

   if ([name isEqualToString:@"external"]) {
      NSString *externalPaymentUrl = [data objectForKey:@"uri"];
      [self openExternalPayment:externalPaymentUrl];

Handling Validation Errors

If you wish to handle validation errors and you don’t want Klarna Checkout to show a pop-up window showing the errors, you can turn on the following feature flag in the SDK:

self.checkout.merchantHandlesValidationErrors = YES;

Note: This flag should be set before starting the Checkout process.

Whenever the SDK detects a validation error, you will receive an event named 'validation_error' in your callback with 'error_type' and 'error_text' parameters:

- (void)handleNotifications:(NSNotification *)notification {
   NSString *name = notification.userInfo[KCOSignalNameKey];
   NSDictionary *data = notification.userInfo[KCOSignalDataKey];
   if ([name isEqualToString:@"validation_error"]) {
      NSString *errorType = [data objectForKey:@"error_type"];
      NSString *errorText = [data objectForKey:@"error_text"];
      [self handleValidationError:errorType errorText:errorText];

Return URL

Some payment methods require authorization through third-party applications. These can return to your application upon completion, but to do that, you need to supply a URL that should be used for returning. There do not need to be any special handlers on application load for that URL. Our only requirement is that the user is returned to your application from the third-party application.


In cases where the user needs to authenticate with their bank for credit card payments, the bank itself might open a third-party app such as Bank ID. Since the SDK does not create these sessions, the user would have to return to the app manually, and then you will get the completion signal from the checkout.

Next steps

Success! You now have Klarna Checkout up and running in your mobile app.

Check out our git-hub page where you can

  • Read API documentation
  • Look at an example app
  • Report an issue