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

# React Native SDK

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

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 → React Native** and **Download RevenueFlo-Info.plist**
    * Copy the **RevenueFlo-Info.plist** file you just downloaded into the root of your Xcode project inside the **react-native** project folder 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/RevenueFloRN.zip)
    * Unzip & Copy the **RevenueFlo** folder from the SDK you just downloaded into the root of your Xcode project inside the **react-native** project folder 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

To initialize the SDK in your React Native app, include the following in your `index.js:`

```javascript React icon="react" theme={null}
import {AppRegistry} from 'react-native';
import App from './App';
import {name as appName} from './app.json';

// Add these lines
import { NativeModules, Platform } from 'react-native';
const { RevenueFlo } = NativeModules;
if (Platform.OS === 'ios') {
    RevenueFlo.configureForRN()
}
// 
AppRegistry.registerComponent(appName, () => App);
```

## Present an In-app Offer

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

```javascript React icon="react" theme={null}
import { NativeEventEmitter, NativeModules, Platform } from 'react-native';
const { RevenueFlo } = NativeModules;
const eventEmitter = new NativeEventEmitter(RevenueFlo);

const App = () => {

  useEffect(() => {
    // Subscribe to RevenueFlo events
    const offerDidPresent = eventEmitter.addListener(
      'offerDidPresent',
      (body) => {
        console.log('offerDidPresent: ', body);
      }
    );

    const offerDidClose = eventEmitter.addListener(
      'offerDidClose',
      (body) => {
        console.log('offerDidClose: ', body);
      }
    );

    const offerPrimaryButtonDidClick = eventEmitter.addListener(
      'offerPrimaryButtonDidClick',
      (body) => {
        console.log('offerPrimaryButtonDidClick: ', body);
      }
    );

    // Clean up subscriptions
    return () => {
      offerDidPresent.remove();
      offerDidClose.remove();
      offerPrimaryButtonDidClick.remove();
    };
  }, []);

  // Set 5 secs delay if you're invoking on app launch.
  // if (Platform.OS === 'ios') {
  //   RevenueFlo.presentOfferForRN(5.0)
  // }

  const presentOffer = () => {
    if (Platform.OS === 'ios') {
      RevenueFlo.presentOfferForRN()
    }
  };

  return (
    <View style={{ flex: 1 }}>

      <View style={styles.contentContainer}>

        <Text style={styles.text}>Welcome to React-Native
          RevenueFlo Demo</Text>

        <View style={styles.buttonContainer}>
          <Button title="Present Offer" onPress={presentOffer} />
        </View>

      </View>

    </View>
  );
};
```

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