Skip to main content
Version: 14.6

Expo Plugin

IapKit - In-App Purchase Validation Service

react-native-iap comes with a config plugin to automatically configure your project for both iOS and Android. This guide explains how to use it and what it does.

Usage

To use the plugin, add it to the plugins array in your app.json or app.config.js:

{
"expo": {
"plugins": ["react-native-iap"]
}
}

This is the most basic configuration. The plugin also accepts options for local development.

What it does

Android

  • Adds the com.android.vending.BILLING permission to AndroidManifest.xml.
  • Adds the io.github.hyochan.openiap:openiap-google dependency to your app's build.gradle.

iOS

  • Ensures the CocoaPods CDN source is present in your Podfile.
  • Removes any stale local OpenIAP pod entries to avoid conflicts.

iOS Folly Workaround

The plugin includes a workaround (withIapIosFollyWorkaround) to prevent iOS build failures related to Folly coroutines. This is particularly useful when encountering issues with non-vendored <folly/coro/*> headers.

To enable this workaround, you can pass the ios.with-folly-no-coroutines option to the plugin in your app.json or app.config.js:

{
"expo": {
"plugins": [
[
"react-native-iap",
{
"ios": {
"with-folly-no-coroutines": true
}
}
]
]
}
}

When enabled, this option injects preprocessor definitions (FOLLY_NO_CONFIG=1, FOLLY_CFG_NO_COROUTINES=1, FOLLY_HAS_COROUTINES=0) into your Podfile's post_install hook. These definitions disable Folly coroutine support, resolving potential build conflicts.

IAPKit API Key

If you're using IAPKit for purchase verification, you can configure your API key directly in the plugin. The key will be automatically added to both platforms:

  • Android: Added as <meta-data android:name="dev.iapkit.API_KEY" android:value="your-key" /> in AndroidManifest.xml
  • iOS: Added as IAPKitAPIKey in Info.plist
{
"expo": {
"plugins": [
[
"react-native-iap",
{
"iapkitApiKey": "your-iapkit-api-key"
}
]
]
}
}

You can then use verifyPurchaseWithProvider to verify purchases. When iapkitApiKey is configured in the plugin, you can omit the apiKey parameter - it will be automatically read from native config:

import {verifyPurchaseWithProvider} from 'react-native-iap';

// apiKey is automatically injected from config plugin
const result = await verifyPurchaseWithProvider({
provider: 'iapkit',
iapkit: {
apple: {jws: purchase.purchaseToken},
google: {purchaseToken: purchase.purchaseToken},
},
});

// Or explicitly provide apiKey (takes priority over config plugin)
const result = await verifyPurchaseWithProvider({
provider: 'iapkit',
iapkit: {
apiKey: 'your-iapkit-api-key', // Optional since v14.6.1 if configured in plugin
apple: {jws: purchase.purchaseToken},
google: {purchaseToken: purchase.purchaseToken},
},
});