> For the complete documentation index, see [llms.txt](https://gitbook.keytrust.one/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://gitbook.keytrust.one/swap/swap-api-driven-flow/integrations-sdks/ios-sdk.md).

# iOS SDK

📱 Installation guide for our iOS SDK

> ### 💡Supporting the latest versions
>
> The SDK supports iOS 14 and above

Download the SDK by adding the following repository to the Swift Package Manager: <https://github.com/moonpay/mobile-sdk-ios>.

Initialize the SDK in your application with desired flow, environment and any parameters related to On-Ramp, Off-Ramp or Swap.

```
import MoonPaySdk

// These run in your application and are all the of handlers available to you.
let handlers = MoonPayHandlers(
  onAuthToken: { data in
  	print("onAuthToken called", data)
	},
  onSwapsCustomerSetupComplete: {
    print("onSwapsCustomerSetupComplete called")
  },
  onUnsupportedRegion: {
    print("onUnsupportedRegion called")
  },
  onLogin: { data in
    print("onLogin called", data)
  },
  onInitiateDeposit: { data in
    print("onInitiateDepositCalled")
    let response = OnInitiateDepositResponsePayload(depositId: "yourDepositId")
    return reply
  }
)

let params = MoonPayBuyQueryParams(apiKey: "pk_test_123")
params.setBaseCurrencyCode(value: "GBP")
params.setBaseCurrencyAmount(value: 800)

let config = MoonPaySdkBuyConfig(
  debug: false,
  environment: MoonPayWidgetEnvironment.sandbox,
  params: params,
  handlers: handlers
)

let moonPaySdk = MoonPayiOSSdk(config: config)

moonPaySdk.show(mode: MoonPayRenderingOptioniOS.WebViewOverlay())
```

See the parameters pages for Buy, Sell, NFT and Swap for details on which parameters can be passed for each flow.

Arguments:

* `config`: **MoonPaySdkConfig**,

Your config variant must match your query params variant.

Variants:

* `MoonPaySdkBuyConfig`
* `MoonPaySdkSellConfig`
* `MoonPaySdkSwapsCustomerSetupConfig`
* `MoonPaySdkLegacyConfig`

Arguments:

* `debug`: **Boolean**
* `environment`: **MoonPayWidgetEnvironment**
* `params`: **MoonPayQueryParams**
* `handlers`: **MoonPayHandlers?**

> ### 📘Configuration
>
> Possible values for `environment`: MoonPayWidgetEnvironment.sandbox, MoonPayWidgetEnvironment.production

Your query params variant must match your config variant.

Variants:

* `MoonPayBuyQueryParams`
* `MoonPaySellQueryParams`
* `MoonPaySwapsCustomerSetupParams`
* `MoonPayLegacyParams`

All of the following are optional. However, you must explicitly pass `nil` for each handler you don't need to implement.

Arguments:

* `onSwapsCustomerSetupComplete`: **() -> Void**
* `onUnsupportedRegion`: **() -> Void**
* `onKmsWalletCreated`: **() -> Void**
* `onAuthToken`: **(OnAuthTokenRequestPayload) -> Void**
* `onLogin`: **(OnLoginRequestPayload) -> Void**
* `onInitiateDeposit`: **(OnInitiateDepositRequestPayload) -> OnInitiateDepositResponsePayload**

Arguments:

* `token`: **String**
* `csrfToken`: **String**

Arguments:

* `isRefresh`: **Boolean**

Arguments:

* `transactionId`: **String**
* `cryptoCurrencyAmount`: **String**
* `cryptoCurrencyAmountSmallestDenomination`: **String**
* `fiatCurrencyAmount`: **String?**
* `depositWalletAddress`: **String**
* `cryptoCurrency`: **CryptoCurrency**
* `fiatCurrency`: **FiatCurrency**

Arguments:

* `depositId`: **String**

Arguments:

* `id`: **String**
* `name`: **String**
* `code`: **String**
* `contractAddress`: **String?**
* `chainId`: **String?**
* `coinType`: **String?**
* `networkCode`: **String?**

Arguments:

* `id`: **String**
* `name`: **String**
* `code`: **String**

If you're using the `walletAddress` or `walletAddresses` query param, you need to sign your widget URL before you can display the widget. Learn more about URL signing.

`moonPaySdk.show` takes one argument, `mode`, which takes a value of type **MoonPayRenderingOptioniOS**. The mode variants are **MoonPayRenderingOptioniOS.WebViewOverlay()** and **MoonPayRenderingOptioniOS.InAppBrowser()**.

```
let moonpay = MoonPayiOSSdk(config: config)

let urlSignature = moonpay.generateUrlForSigning()
let encoder = JSONEncoder()

// The URL for signature should be sent to your backend, which should then
// sign it with your API secret and return the signature.

// Once you have the signature, you can update the SDK with it and show the
// widget.
if let json = try? encoder.encode(urlSignature) {
    do {
        let (data, response) = try await upload(data: json, url: '/sign-url')
        moonPaySdk.updateSignature(response)
    } catch {
        print("Something went wrong")
    }
}

func upload(_ data: Data, to url: URL) async throws -> URLResponse {
    var request = URLRequest(url: url)
    request.httpMethod = "POST"

    let (responseData, response) = try await session.upload(
        for: request, from: data
    )

    return response
}

moonPaySdk.show(mode: .WebViewOverlay())
```

Updated 4 months ago

***

* [Table of Contents](broken://pages/veKPqbyVuh4pQkuSzvPF)
* * [Download](broken://pages/veKPqbyVuh4pQkuSzvPF)
  * [Initialize](broken://pages/veKPqbyVuh4pQkuSzvPF)
  * [SDK Configuration](broken://pages/veKPqbyVuh4pQkuSzvPF)
    * [MoonPayiOSSdk](broken://pages/veKPqbyVuh4pQkuSzvPF)
    * [MoonPaySdkConfig](broken://pages/veKPqbyVuh4pQkuSzvPF)
    * [MoonPayQueryParams](broken://pages/veKPqbyVuh4pQkuSzvPF)
    * [MoonPayHandlers](broken://pages/veKPqbyVuh4pQkuSzvPF)
  * [Handler Payload Types](broken://pages/veKPqbyVuh4pQkuSzvPF)
    * [OnAuthTokenRequestPayload](broken://pages/veKPqbyVuh4pQkuSzvPF)
    * [OnLoginRequestPayload](broken://pages/veKPqbyVuh4pQkuSzvPF)
    * [OnInitiateDepositRequestPayload](broken://pages/veKPqbyVuh4pQkuSzvPF)
    * [OnInitiateDepositResponsePayload](broken://pages/veKPqbyVuh4pQkuSzvPF)
    * [CryptoCurrency](broken://pages/veKPqbyVuh4pQkuSzvPF)
    * [FiatCurrency](broken://pages/veKPqbyVuh4pQkuSzvPF)
  * [Display](broken://pages/veKPqbyVuh4pQkuSzvPF)
