> ## 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.

# SwiftUI SDK

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

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 → SwiftUI** 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

For SDK initialization, you can implement the **App** `init` method:

```swift SwiftUI icon="swift" theme={null}
import SwiftUI

@main
struct SwiftUIDemoApp: App {
    
    // Add this method                                                          
    init() {
        // Configure RevenueFlo
        RevenueFlo.configure()
    }
    
    var body: some Scene {
        WindowGroup {
            ContentView()
                .preferredColorScheme(.light)
        }
    }
}
```

## Present an In-app Offer

In your **ContentView**, 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 SwiftUI icon="swift" theme={null}
struct ContentView: View {

    @StateObject private var revenueFloDelegate = RevenueFloDelegateHandler()

    var body: some View {
        
        // Setup your UI
        VStack {
            Image(systemName: "gift")
                .imageScale(.large)
                .foregroundStyle(.tint)
            Text("RevenueFlo Demo!")

                .onAppear {
                    // Call the SDK method to seamlessly present an exclusive offer from the Revenueflo.
                    RevenueFlo.shared.showOffer(
                        delay: 5, delegate: revenueFloDelegate)
                }

            Button("Show Offer") {
                // RevenueFlo.shared.showOffer()
            }
        }
        .padding()
    }
}

class RevenueFloDelegateHandler: NSObject, RevenueFloActionDelegate,
    ObservableObject
{
    func offerDidPresent(_ offer: String) {
        print("Offer presented: \(offer)")
    }

    func offerDidClose(_ offer: String) {
        print("Offer closed: \(offer)")
    }

    func offerPrimaryButtonDidClick(_ offer: String) {
        print("Primary button clicked for offer: \(offer)")
    }
}
```

<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" />
