> ## Documentation Index
> Fetch the complete documentation index at: https://revenueflo.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Swift SDK

> Instructions to setup in-app offer paywall in iOS app **(UIKit)**

Before proceeding with this guide, create a free account on the [RevenueFlo Platform](https://app.revenueflo.com/) and set up your first project and offer campaign to manage dynamic offer paywall seamlessly.

## Requirements

Xcode 13.0+ and iOS 15.0+ or later.

## Installation

<Steps>
  <Step title="Download config file">
    * Go to your RevenueFlo project dashboard.
    * Select the **Settings** from sidebar.
    * Select **SDK & Code Setup → Swift** and **Download RevenueFlo-Info.plist**
    * Copy the **RevenueFlo-Info.plist** file you just downloaded into the root of your Xcode project and add it to all targets.
          <img src="https://mintcdn.com/revenueflo/-h2SBtyoKhzFCV9e/images/sdk/copy_plist.png?fit=max&auto=format&n=-h2SBtyoKhzFCV9e&q=85&s=c7de38ec9a8d37278239988fe98d3270" alt="Copy the RevenueFlo-Info.plist to project" width="1920" height="1080" data-path="images/sdk/copy_plist.png" />
  </Step>

  <Step title="Add RevenueFlo SDK">
    * [Download RevenueFlo SDK](https://revenueflo.com/downloads/SDK/RevenueFlo.zip)
    * Unzip & Copy the **RevenueFlo SDK** files you just downloaded into the root of your Xcode project and add it to all targets.
          <img src="https://mintcdn.com/revenueflo/-h2SBtyoKhzFCV9e/images/sdk/copy_sdk.png?fit=max&auto=format&n=-h2SBtyoKhzFCV9e&q=85&s=11dcb4b424c50ffe4dc97cd01f63b581" alt="Copy the RevenueFlo SDK to project" width="1920" height="1080" data-path="images/sdk/copy_sdk.png" />
  </Step>

  <Step title="Configure App Attest">
    First, you need to configure the Xcode project so that the SDK can use **Apple's App Attest API** to ensure that requests sent from your app come from legitimate instances of your app.

    1. Add the App Attest capability for your app target.<br /><br />
           <img src="https://mintcdn.com/revenueflo/-h2SBtyoKhzFCV9e/images/sdk/add_app_attest.png?fit=max&auto=format&n=-h2SBtyoKhzFCV9e&q=85&s=c86030a620a16b68e98eba1a00f70525" alt="Add the App Attest capability" width="1487" height="1080" data-path="images/sdk/add_app_attest.png" />

    2. Open the **.entitlements** file in your Xcode project and set the App Attest Environment value to `$(ATTENV)`<br /><br />
           <img src="https://mintcdn.com/revenueflo/-h2SBtyoKhzFCV9e/images/sdk/app_attest_env_entilements.png?fit=max&auto=format&n=-h2SBtyoKhzFCV9e&q=85&s=818e92047ccabaa39df0a6d6a9a328d2" alt="Set the App Attest Environment value" width="1086" height="276" data-path="images/sdk/app_attest_env_entilements.png" />

    3. In Xcode's Target Build Settings, create a user-defined setting named `ATTENV` and set its value to `production` for Release and `development` for Debug.<br /><br />
           <img src="https://mintcdn.com/revenueflo/-h2SBtyoKhzFCV9e/images/sdk/app_attest_env.png?fit=max&auto=format&n=-h2SBtyoKhzFCV9e&q=85&s=b61ed3a7eccdd4c978d6a3c9333bddbe" alt="Create a user-defined setting named ATTENV" width="1958" height="640" data-path="images/sdk/app_attest_env.png" />
  </Step>
</Steps>

## Import the SDK Code

In your application delegate, add the following lines at the beginning inside `application:didFinishLaunchingWithOptions:`

```swift Swift icon="swift" theme={null}
import UIKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

  var window: UIWindow?

  func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: 
      [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
      // Configure RevenueFlo
      RevenueFlo.configure()
      return true
  }
}
```

## Present an In-app Offer

In your **ViewController**, call the `presentOffer()` method to seamlessly present an exclusive offer to your users. Ensure to configure the offer details in the campaign dashboard before invoking.

```swift Swift icon="swift" theme={null}
import UIKit

class HomeViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        // Set up your UI
        // 
        // Call the SDK method to seamlessly present an exclusive offer from the Revenueflo.    
        RevenueFlo.shared.presentOffer(from: self)
    }
}
```

<Callout icon="lightbulb" color="#FFC107">Make sure you have at least one campaign active in RevenueFlo and test on a real device to experience your offer paywall exactly as your users will see it.</Callout>

## Example In-app Offer

Here's the final presented offer paywall from **RevenueFlo**.

<img src="https://mintcdn.com/revenueflo/-h2SBtyoKhzFCV9e/images/sdk/show-offer-paywall-example.png?fit=max&auto=format&n=-h2SBtyoKhzFCV9e&q=85&s=8993d17beca926e6f6b6432d65aac759" style={{width: "350px", height: "auto"}} alt="In-app Discount Paywall" width="1419" height="2796" data-path="images/sdk/show-offer-paywall-example.png" />
