{"id":25169717,"url":"https://github.com/sumup/sumup-ios-sdk","last_synced_at":"2025-04-06T09:10:24.107Z","repository":{"id":34378317,"uuid":"38304397","full_name":"sumup/sumup-ios-sdk","owner":"sumup","description":null,"archived":false,"fork":false,"pushed_at":"2025-01-03T14:02:56.000Z","size":298114,"stargazers_count":50,"open_issues_count":40,"forks_count":27,"subscribers_count":57,"default_branch":"master","last_synced_at":"2025-03-30T08:11:12.338Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Objective-C","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/sumup.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2015-06-30T11:04:30.000Z","updated_at":"2025-03-29T17:49:11.000Z","dependencies_parsed_at":"2025-01-04T19:00:08.363Z","dependency_job_id":null,"html_url":"https://github.com/sumup/sumup-ios-sdk","commit_stats":{"total_commits":56,"total_committers":13,"mean_commits":"4.3076923076923075","dds":0.5714285714285714,"last_synced_commit":"36af1d7aafcf157faa6745dd512a307f3a19cf5b"},"previous_names":[],"tags_count":38,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sumup%2Fsumup-ios-sdk","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sumup%2Fsumup-ios-sdk/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sumup%2Fsumup-ios-sdk/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sumup%2Fsumup-ios-sdk/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/sumup","download_url":"https://codeload.github.com/sumup/sumup-ios-sdk/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247457803,"owners_count":20941906,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-02-09T08:36:18.692Z","updated_at":"2025-04-06T09:10:24.078Z","avatar_url":"https://github.com/sumup.png","language":"Objective-C","funding_links":[],"categories":[],"sub_categories":[],"readme":"# SumUp mPOS SDK - iOS\n\n[![Platform](https://img.shields.io/badge/Platform-iOS-lightgrey.svg?style=flat)](#prerequisites)\n[![Created](https://img.shields.io/badge/Made%20by-SumUp-blue.svg?style=flat)](https://sumup.com)\n[![Supports](https://img.shields.io/badge/Requires-iOS%2014+-red.svg?style=flat)]()\n[![License](https://img.shields.io/badge/License-SumUp-brightgreen.svg?style=flat)](LICENSE)\n[![CocoaPods](https://img.shields.io/cocoapods/v/SumUpSDK.svg?style=flat)](SumUpSDK.podspec)\n[![SPM compatible](https://img.shields.io/badge/SPM-compatible-4BC51D.svg?style=flat)](Package.swift)\n\nThis repository provides a native iOS SDK that enables you to integrate SumUp's proprietary\ncard terminal(s) and its payment platform to accept credit and debit card payments\n(incl. VISA, MasterCard, American Express and more). SumUp's SDK communicates transparently\nto the card terminal(s) via Bluetooth (BLE 4.0) or an audio cable connection. Upon initiating\na checkout, the SDK guides your user using appropriate screens through each step of the payment\nprocess. As part of the process, SumUp also provides the card terminal setup screen, along with the\ncardholder signature verification screen. The checkout result is returned with the relevant\ndata for your records.\n\nNo sensitive card data is ever passed through to or stored on the merchant’s phone.\nAll data is encrypted by the card terminal, which has been fully certified to the highest\nindustry standards (PCI, EMV I \u0026 II, Visa, MasterCard \u0026 Amex).\n\nFor more information, please refer to\n[SumUp API documentation.](https://developer.sumup.com/).\n\n### Prerequisites\n1. Registered for a merchant account via SumUp's [country websites](https://sumup.com/) (or received a test account).\n2. Received SumUp card terminal: Solo, Air, Air Lite, PIN+ terminal, Chip \u0026 Signature reader, or SumUp Air Register.\n3. Requested an Affiliate (Access) Key via [SumUp Dashboard](https://me.sumup.com/developers) for Developers.\n4. Deployment Target iOS 14.0 or later.\n5. Recommended to use on Xcode 14.3.1 and iOS SDK 16 or later.\n6. iPhone, iPad or iPod touch.\n\n### Compatibility\n\n* Starting with firmware version 1.0.1.84, Air card readers with serial numbers starting with 108, 109 or later require iOS SDK 4.3.0 and later. Please update to the latest iOS SDK version if you need to support these readers.\n* From version 4.4.0 of the SDK, iOS 14 or later is required\n\n### Tipping\n\nThere are three modes for tipping:\n\n1. No tipping. Leave tipAmount set to nil when creating the SMPCheckoutRequest object.\n\n2. Programmatic tipping via the tipAmount property. Ask the user in your own UI for an appropriate tip amount and then set the tipAmount property on SMPCheckoutRequest. This will be added to the total amount, but will be displayed to the user separately during checkout.\n\n3. Tip on Card Reader. TCR prompts the customer directly on the card reader's display for a tip amount, rather than prompting for a tip amount on the iPhone or iPad display.\n\n#### Tip on Card Reader (TCR)\n\nImportant: Not all card readers support this feature. To find out if the feature is supported for the last-used card reader, you should always check SMPSumUpSDK.isTipOnCardReaderAvailable. You must handle this case yourself in order to avoid no tip from being prompted.\n\nTo do this:\n\nBefore calling SMPSumUpSDK checkoutWithRequest:fromViewController:completion:, check SMPSumUpSDK.isTipOnCardReaderAvailable:\n\n- If NO, you should prompt the user for a tip amount yourself and set tipAmount on SMPCheckoutRequest\n\n- If YES, you may set tipOnCardReaderIfAvailable on SMPCheckoutRequest to YES. Do not prompt the user for a tip amount or set tipAmount if you do this.\n\n### Table of Contents\n* [Installation](#installation)\n  * [Manual Integration](#manual-integration)\n  * [Integration via CocoaPods](#integration-via-cocoapods)\n  * [Integration via Carthage](#integration-via-carthage)\n  * [Integration via Swift PM](#integration-via-swift-pm)\n  * [Supported device orientation](#supported-device-orientation)\n  * [Privacy Info plist keys](#privacy-info-plist-keys)\n* [Getting started](#getting-started)\n  * [Import the SDK](#import-the-sdk)\n  * [Authenticate app](#authenticate-app)\n  * [Login](#login)\n  * [Accept card payments](#accept-card-payments)\n  * [Update checkout preferences](#update-checkout-preferences)\n* [Tap to Pay on iPhone](#tap-to-pay-on-iphone)\n* [Out of Scope](#out-of-scope)\n* [Community](#community)\n* [Changelog](#changelog)\n* [License](#license)\n\n## Installation\n\n### Manual Integration\n\nThe SumUp SDK is provided as an XCFramework `SumUpSDK.xcframework` that contains\nthe headers and bundles bundles containing resources such as images and localizations.\nPlease follow the steps below to prepare your project:\n\n1. Drag and drop the `SumUpSDK.xcframework` to your Xcode project's \"Frameworks,\nLibraries, and Embedded Content\" on the General settings tab.\n2. Make sure the [required Info.plist keys](#privacy-info-plist-keys) are present.\n\n\u003e Note:\n\u003e You can use the [sample app](SampleApp/SumUpSDKSampleApp)\n\u003e that is provided with the SumUp SDK as a reference project.\n\u003e The Xcode project contains sample apps written in Objective-C and Swift.\n\u003e See [Test your integration](#test-your-integration) for more information.\n\n### Integration via CocoaPods\n\nThe SumUp SDK can be integrated via CocoaPods.\n\n```ruby\ntarget '\u003cYour Target Name\u003e' do\n    pod 'SumUpSDK', '~\u003e 4.0'\nend\n```\n\nMake sure the [required Info.plist keys](#privacy-info-plist-keys) are present.\n\nTo learn more about setting up your project for CocoaPods, please refer to the [official documentation](https://cocoapods.org/#install).\n\n### Integration via Carthage\n\n:warning: Distributing XCFrameworks with the latest Carthage version (0.35.0) is not yet available.\nThere is an open issue ([#2799](https://github.com/Carthage/Carthage/issues/2799)) to solve this.\nOnce that issue is fixed, we expect Carthage to work again.\n\nThe SumUp SDK can be integrated with Carthage by following the steps below:\n\n1. Add the following line to your `Cartfile`:\n\n        github \"sumup/sumup-ios-sdk\"\n\n2. Run `carthage update sumup-ios-sdk`\n3. Drag and drop the `Carthage/Build/iOS/SumUpSDK.xcframework` to your Xcode project's \"Frameworks,\nLibraries, and Embedded Content\" on the General settings tab.\n4. Make sure the [required Info.plist keys](#privacy-info-plist-keys) are present.\n\nTo learn more about setting up your project for Carthage, please refer to the [official documentation](https://github.com/Carthage/Carthage#if-youre-building-for-ios-tvos-or-watchos).\n\n\u003e Note:\n\u003e See [Test your integration](#test-your-integration) for more information.\n\n### Integration via Swift PM\n\nThe latest Swift Package Manager version added support to [distribute binary frameworks as Swift Packages](https://developer.apple.com/documentation/swift_packages/distributing_binary_frameworks_as_swift_packages). \n\nIf you're using Xcode 12.3 or later, this should work out of the box.\n\nUnfortunately, Xcode 12 releases before that had an issue, ([Bug Report SR-13343](https://bugs.swift.org/browse/SR-13343)), that added the framework as a static library, not as an embedded dynamic framework. \n\nFollow this workaround to manage SumUp SDK versions via Swift PM in those cases:\n\n1. Add the package dependency to the repository `https://github.com/sumup/sumup-ios-sdk` (*File \u003e Swift Packages \u003e Add Package Dependency...*) with the version `Up to Next Major: 4.0.0`\n2. Leave the checkbox unchecked for the SumUpSDK at the integration popup (*Add Package to ...:*)\n![Swift PM - do not auto-integrate SDK](.github/assets/setup_swiftpm_skipautointegrate.png)\n3. From the Project Navigator, drag and drop the `SumUpSDK/Referenced Binaries/SumUpSDK.xcframework` to your Xcode project's \"Frameworks, Libraries, and Embedded Content\" on the General settings tab.\n4. Make sure the [required Info.plist keys](#privacy-info-plist-keys) are present.\n\nTo learn more about adding Swift Package dependencies, please refer to the [official documentation](https://developer.apple.com/documentation/xcode/adding_package_dependencies_to_your_app).\n\n### Test your integration\nIn your debug setup you can call `+[SMPSumUpSDK testSDKIntegration]`.\nIt will run various checks and print its findings to the console.\nPlease do not call it in your Release build.\n\n### Supported device orientation\nThe SDK supports all device orientations on iPad and portrait on iPhone.\nFeel free to support other orientations on iPhone but please keep in mind that\nthe SDK's UI will be presented in portrait on iPhone.\nSee `UISupportedInterfaceOrientations` in the sample app's\n[Info.plist](SampleApp/SumUpSDKSampleApp/SumUpSDKSampleApp-Info.plist#L54-L65)\nor the \"General\" tab in Xcode's Target Editor.\n\n### Privacy Info plist keys\nThe SumUp SDK requires access to the user's location and Bluetooth peripherals. If your app has not asked for the user's permission,\nthe SumUp SDK will ask at the time of the first login or checkout attempt. Please add the\nfollowing keys to your info plist file:\n\n        NSLocationWhenInUseUsageDescription\n        NSBluetoothAlwaysUsageDescription\n        NSBluetoothPeripheralUsageDescription (unless your deployment target is at least iOS 13)\n\n\u003e Note:\n\u003e - Please refer to the sample app's [Info.plist](SampleApp/SumUpSDKSampleApp/SumUpSDKSampleApp-Info.plist#L38-L43)\nfor more information regarding the listed permissions required.\n\u003e - You can provide localization by providing a localized\n[InfoPlist.strings](SampleApp/SumUpSDKSampleApp/en.lproj/InfoPlist.strings) file.\n\u003e - For further information, see the iOS Developer Library on\n[location usage on iOS 8 and later](https://developer.apple.com/library/ios/documentation/General/Reference/InfoPlistKeyReference/Articles/CocoaKeys.html#//apple_ref/doc/uid/TP40009251-SW26),\n[Bluetooth peripheral usage](https://developer.apple.com/library/ios/documentation/General/Reference/InfoPlistKeyReference/Articles/CocoaKeys.html#//apple_ref/doc/uid/TP40009251-SW20).\n\n## Getting started\n\n### Import the SDK\n\nTo import the SDK in Objective-C source files, you can use `#import \u003cSumUpSDK/SumUpSDK.h\u003e`. If module\nsupport is enabled in your project, you can use `@import SumUpSDK;` instead.\n\nIn Swift, use `import SumUpSDK`. You do not have to add any headers to your bridging header.\n\n### Authenticate app\nBefore calling any additional feature of the SumUp SDK, you are required to set up the SDK with your Affiliate (Access) Key:\n```objc\n[SMPSumUpSDK setupWithAPIKey:@\"MyAPIKey\"];\n```\n\n\u003e Note:\n\u003e `setupWithAPIKey:` checks for the user's location permission. Consequently,\ndo not call this method as part of the app launch. This method must be called on\nthe main queue.\n\n### Login\n\nFollowing app authentication, a registered SumUp merchant account needs to be logged in.\nPresent a login screen from your `UIViewController`, using the following method:\n```objc\n[SMPSumUpSDK presentLoginFromViewController:vc\n                                   animated:YES\n                            completionBlock:nil];\n```\n\n\n\u003e Note:\n\u003e  It is also possible to login an account with a token, without the user entering their SumUp login credentials in the SDK. Please refer to section [Transparent Authentication](#transparent-authentication). \n\u003e  \n\u003e To log out of the SDK, please refer to `logoutWithCompletionBlock:`.\n\n### Accept card payments\nOnce logged in, you can start using the SumUp SDK to accept card payments.\n\n#### Prepare checkout request\nPrepare a checkout request that encapsulates the information regarding the transaction.\n\nFor this, you will need to create an instance of `SMPCheckoutRequest`:\n\n\n```objc\nSMPCheckoutRequest *request = [SMPCheckoutRequest requestWithTotal:[NSDecimalNumber decimalNumberWithString:@\"10.00\"]\n                                                             title:@\"your title\"\n                                                      currencyCode:[[SMPSumUpSDK currentMerchant] currencyCode]];\n```\n\nPlease note that you need to pass an `NSDecimalNumber` as the total value.\nWhile `NSDecimalNumber` is a subclass of `NSNumber` it is not advised to use the\nconvenience method of `NSNumber` to create an `NSDecimalNumber`.\n\n#### Additional checkout parameters\nWhen setting up the `SMPCheckoutRequest` object, the following optional parameters can be included:\n\n##### Tip amount\nA tip amount can be processed in addition to the `totalAmount` using the `tipAmount` parameter.\nThe tip amount will then be shown during the checkout process and be included in the response.\nPlease note that a tip amount cannot be changed during/after the checkout.\nJust like the `totalAmount` it is an `NSDecimalNumber` so make sure to\nnot accidentally pass an `NSNumber`.\n\n##### Transaction identifier\nThe `foreignTransactionID` identifier will be associated with the transaction\nand can be used to retrieve details related to the transaction.\nSee [API documentation](https://docs.sumup.com/rest-api/#tag/Transactions) for details.\nPlease make sure that this ID is unique within the scope of the SumUp merchant account\nand sub-accounts. It must not be longer than 128 characters.\n\n```\n// set an optional identifier\n[request setForeignTransactionID:@\"my-unique-id\"];\n```\n\n##### Skip success screen\nTo skip the screen shown at the end of a successful transaction, the\n`SMPSkipScreenOptionSuccess` option can be used.\nWhen setting this option your application is responsible for displaying\nthe transaction result to the customer.\nIn combination with the Receipts API, your application can also send your own receipts,\nsee [API documentation](https://docs.sumup.com/rest-api/#tag/Transactions) for details.\nPlease note that success screens will still be shown when using the SumUp Air Lite readers.\n\n##### Skip failed screen\nTo skip the screen shown at the end of a failed transaction, the\n`SMPSkipScreenOptionFailed` option can be used.\nWhen setting this option your application is responsible for displaying\nthe transaction result to the customer.\nPlease note that failed screens will still be shown when using the SumUp Air Lite readers.\n\n### Prepare the SumUp Card terminal in advance\nIn order to prepare a SumUp card terminal for checkout, `prepareForCheckout` can be called in advance. A registered SumUp merchant account needs to be logged in, and the card terminal must already be setup. You should use this method to let the SDK know that the user is most likely starting a checkout attempt soon; for example when entering an amount or adding products to a shopping cart. This allows the SDK to take appropriate measures, like attempting to wake a connected card terminal.\n\n### Transparent Authentication\nTo authenticate an account without the user typing in their SumUp credentials each time, you can generate an access token using OAuth2.0 and use it to transparently login to the SumUp SDK.\n\n```objc\n[SMPSumUpSDK loginWithToken:@\"MY_ACCESS_TOKEN\" \n                 completion:nil];\n```\n\nFor information about how to obtain a token, please see the [API Documentation](https://developer.sumup.com/docs/authorization/).\n\nIf the token is invalid, `SMPSumUpSDKErrorInvalidAccessToken` will be returned.\n\n#### Initiate Checkout Request\nStart a payment by using the checkout request below:\n\n\n```objc\n[SMPSumUpSDK checkoutWithRequest:request\n              fromViewController:vc\n                      completion:^(SMPCheckoutResult *result, NSError *error) {\n                      // handle completed and failed payments here\n                      // retrieve information via result.additionalInfo\n}];\n```\n\n#### Checkout Error Codes\nPossible values of [error code](./SumUpSDK.xcframework/ios-armv7_arm64/SumUpSDK.framework/Headers/SMPSumUpSDK.h#L155) received in the `checkoutWithRequest:` completion block.\n\n### Update checkout preferences\nWhen logged in you can let merchants check and update their checkout\npreferences. Merchants can select their preferred card terminal and set up a\nnew one if needed. The preferences available to a merchant depend on their\nrespective account settings.\n\n```objc\n[SMPSumUpSDK presentCheckoutPreferencesFromViewController:self\n                                                 animated:YES\n                                               completion:^(BOOL success, NSError * _Nullable error) {\n                                                 if (!success) {\n                                                   // there was a problem presenting the preferences\n                                                 } else {\n                                                   // next checkout will reflect the merchant's changes.\n                                                 }\n                                               }];\n```\n\n## Tap to Pay on iPhone\n\nWith Tap to Pay on iPhone merchants can accept contactless card payments on their iPhone without needing a card reader.\n\nTo add Tap to Pay on iPhone to your app:\n\n* Request the Tap to Pay on iPhone entitlement from Apple, receive approval, and then add the `com.apple.developer.proximity-reader.payment.acceptance` entitlement to your app. [Setting up the entitlement](https://developer.apple.com/documentation/proximityreader/setting-up-the-entitlement-for-tap-to-pay-on-iphone?language=objc).\n* This feature requires an iPhone XS or later, running iOS 16.4 (iOS 16.7 starting July 8th) or later (ideally 17.5 or later.) The feature does not work on iPad.\n* For debugging and testing you will need to be logged into an iPhone with a non-Sandbox Apple ID. Using a Sandbox Apple ID requires both Apple and SumUp implementations to connect to their respective non-production (test) backends, which the SDK does not support.\n* During testing, to avoid transactions going to the acquirer and transferring real money, use a SumUp test account. To create a test account, please log in [here](https://auth.sumup.com/flows/login?client_id=developer_portal\u0026login_challenge=fd21867fbc224ee985c0e206ef7f7549). Hover over \"Account\" on the top right corner of the page and click on “Test Profile” in the drop-down menu.\n\nIn your code:\n\n* Make a call to check feature availability: is the Tap to Pay on iPhone payment method available for the current merchant?\n* Trigger activation if needed. Activation sets up the iPhone to receive payments, shows the merchant how to use the feature, and links the SumUp account and Apple ID.\n* Start the checkout.\n\n### Check feature availability\n\n* Call `checkTapToPayAvailability` on `SMPSumUpSDK` to check the availability of the Tap to Pay on iPhone payment method. This call, which requires the SDK to be in a logged-in state, may internally perform one or more network calls.\n* If the feature is not available, your app could, as an example, hide or disable a button or menu item representing the Tap to Pay on iPhone payment method. \n* The feature is generally available when the following criteria are fulfilled: \n    * the iPhone model and iOS version requirements are met \n    * the user logs in with a SumUp account registered in one of the countries where SumUp supports Tap to Pay on iPhone (temporarily with exception of Brazil) \n\n### Perform activation if needed\n\n* Activation must be completed before the first transaction can be performed. Activation means:\n    * the merchant links their Apple ID with their SumUp account\n    * the iPhone is prepared, which can take 45 seconds or longer\n* This needs to be done once per merchant account, per device. \n* In addition to determining feature availability, `checkTapToPayAvailability` also indicates whether Tap to Pay on iPhone has been activated yet for the current merchant. \n* If it has not yet been activated then you should trigger activation by calling `presentTapToPayActivation` at a convenient time. Calling it more than once will still show the user education screens each time. Independently, the activation from the initial setup will remain valid.\n\nCode example: checking availability and activation status\n\nObjective-C\n\n```obj-c\n[SMPSumUpSDK checkTapToPayAvailability:^(BOOL isAvailable, BOOL isActivated, NSError * _Nullable error) {\n    if (error == nil) {\n        if (!isAvailable) {\n            // Tap to Pay on iPhone is not available for the merchant\n            return;\n        }\n\n        if (!isActivated) {\n            // Tap to Pay on iPhone needs activation - call presentTapToPayActivation\n            return;\n        }\n\n    // The app is ready to take Tap to Pay on iPhone payments!\n\n    } else {\n        // An error occurred\n    }\n}];\n```\n\nSwift\n\n```swift\nSumUpSDK.checkTapToPayAvailability { isAvailable, isActivated, error in\n\n    if let error {\n        // An error occurred\n        return\n    }\n\n    if !isAvailable {\n        // Tap to Pay on iPhone is not available for the merchant\n        return\n    }\n\n    if !isActivated {\n        // Tap to Pay on iPhone needs activation - call presentTapToPayActivation\n        return\n    }\n\n    // The app is ready to take Tap to Pay on iPhone payments!\n}\n```\n\n### Do the checkout\n\n* Use the initializer of `SMPCheckoutRequest`/`CheckoutRequest` that takes a `paymentMethod` parameter, and specify `SMPPaymentMethodTapToPay`/`tapToPay`:\n\nObjective-C\n\n```objc\nSMPCheckoutRequest request = [SMPCheckoutRequest requestWithTotal:total\n                                                            title:itemDescription\n                                                     currencyCode:SMPSumUpSDK.currentMerchant.currencyCode\n                                                    paymentMethod:SMPPaymentMethodTapToPay];\n```\n\nSwift\n\n```swift\nlet request = CheckoutRequest(total: total, \n                              title: itemDescription,\n                              currencyCode: SumUpSDK.currentMerchant?.currencyCode,\n                              paymentMethod: .tapToPay)\n```\n\n* The rest of the checkout process is the same as when using a card reader.\n\n### Background initialization\n\nWhen `SMPSumUpSDK` initializes, it triggers a background initialization process. This can take about 10-15 seconds and must be completed before the first Tap to Pay on iPhone card-read can occur. If the user quickly initiates a transaction after your app launches, it may take longer than usual as it first waits for the initialization to complete. For subsequent transactions, however, (until the app is relaunched) this delay should not happen.\n\n### Card Verification Method\n\nTap to Pay on iPhone supports contactless payments with physical cards or wallets (eg. Apple or Google Pay).\nWhen accepting payments with physical cards, additional card holder verification in a form of PIN may be required. In the majority of such cases, the UI will display a PIN pad where the customer can enter and confirm the digits. \nHowever, not every physical card allows this type of PIN processing. Some can only be processed by inserting the card into a physical card reader, which is not possible in the case of Tap to Pay on iPhone. \nIn such an instance, the merchant should ask the customer to try a different card or payment method.\n\n### Best practices\n\n* Follow the [Human Interface Guidelines](https://developer.apple.com/design/human-interface-guidelines/tap-to-pay-on-iphone) to save time when Apple reviews your app. \n* Also consider [Apple’s marketing guidelines](https://developer.apple.com/tap-to-pay/marketing-guidelines/) and use standard assets where possible. \n\n### Known issues\n\n* If entitlements are not correctly set up in your app, `presentTapToPayActivation` may show an error Alert with \"Failed to show Terms of Service\".\n* Bluetooth permissions will be requested even if the merchant does not plan to use any of the SumUp Bluetooth  card readers. This will be fixed in an upcoming release.\n* Businesses using SumUp sub-accounts must first activate the feature on their main account before using it on devices logged in with sub-accounts, otherwise an error message will appear during activation for the sub-account user.\n* The `title` field in `SMPCheckoutRequest` does not currently appear on receipts.\n\n## Out of Scope\nThe following functions are handled by the [SumUp APIs](http://docs.sumup.com/rest-api/):\n* [Refunds](https://docs.sumup.com/rest-api/#tag/Refunds)\n* [Transaction history](https://docs.sumup.com/rest-api/#tag/Transactions)\n* [Receipts](https://docs.sumup.com/rest-api/#tag/Receipts)\n* [Account management](https://docs.sumup.com/rest-api/#tag/Account-Details)\n\n## Community\n- **Questions?** Get in contact with our integration team by sending an email to integration@sumup.com.\n- **Found a bug?** [Open an issue](https://github.com/sumup/sumup-ios-sdk/issues/new).\nPlease provide as much information as possible.\n\n## Changelog\n[SumUp iOS SDK Changelog](CHANGELOG.md)\n\n## License\n[SumUp iOS SDK License](LICENSE)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsumup%2Fsumup-ios-sdk","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsumup%2Fsumup-ios-sdk","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsumup%2Fsumup-ios-sdk/lists"}