react-native-kickstart-exchange
v0.1.7
Published
Unofficial React Native / Expo view that shows a Kickstart Exchange banner ad on Apple platforms, using the official KickstartSDK.
Maintainers
Readme
react-native-kickstart-exchange
Show a Kickstart Exchange banner ad in your React Native or Expo app.
Kickstart Exchange is a free cross-promotion service for indie Apple-platform apps: your app shows other apps' banners, and they show yours. This package puts the real banner in your React Native tree by hosting the official KickstartSDK SwiftUI view — it doesn't reimplement it, so you get upstream's actual behavior and bug fixes.
This is an unofficial, community project. It isn't affiliated with, endorsed by, or supported by Kickstart Exchange or the author of
KickstartSDK. Please report problems with this package here, not to them.
Platform support
| Platform | Support | | --- | --- | | iOS / iPadOS | ✅ Shows the banner | | Mac Catalyst | ✅ Shows the banner | | Android | ⚪️ Renders nothing | | Web | ⚪️ Renders nothing | | tvOS / watchOS / visionOS | ❌ Not supported |
<ExchangeBannerAdView> returns null everywhere except iOS, iPadOS, and Mac Catalyst, so it's always safe to render — no Platform.OS checks needed. Installing it won't break an Android or web build.
There's no Android support because Kickstart Exchange itself doesn't serve Android apps yet — its API only knows about Apple platforms. If that changes upstream, this package can add it.
Requirements
- Expo SDK 55+ and React Native 0.83+. Earlier SDKs don't ship a compatible
@expo/ui. - iOS 18 / iPadOS 18 / macOS 15 or later, matching
KickstartSDK's own minimum. - A development build. This won't run in Expo Go, which can't load custom native modules.
- Dynamic framework linking in your Podfile. The setup below turns this on; see why if you're curious.
Works in both managed Expo and bare React Native projects.
Setup
Install the packages:
npx expo install react-native-kickstart-exchange expo-build-properties @expo/uiAdd this to your app.json or app.config.js:
{
"expo": {
"plugins": [
["expo-build-properties", { "ios": { "deploymentTarget": "18.0", "useFrameworks": "dynamic" } }]
]
}
}Then build:
npx expo prebuild
npx expo run:iosUsage
import { ExchangeBannerAdView } from 'react-native-kickstart-exchange';
export default function SettingsFooter() {
return <ExchangeBannerAdView apiKey="ks_live_REPLACE_WITH_API_KEY" />;
}Get an API key by creating a free account at exchange.kickstart.tools and registering your app.
Hide the banner whenever you like — for example, for users who bought an ad-free upgrade:
{!hasPremiumAccess && <ExchangeBannerAdView apiKey="ks_live_REPLACE_WITH_API_KEY" />}Only use it on your main app's screens. Apple's guidelines don't allow Kickstart Exchange in extensions like widgets or App Clips.
Try it without an account
Pass "preview" as the API key to see a sample ad:
<ExchangeBannerAdView apiKey="preview" />It works in Debug builds and the Simulator only, creates no session, and records nothing. Release builds show nothing. The example app in this repo uses it.
Sizing
The banner takes the width its parent gives it and sizes its own height to the ad, so it lays
out like any other View — style accepts width, maxWidth, flex, and the rest. Its
height comes from the ad's own content and changes with Dynamic Type, so don't set one.
KickstartSDK's card caps itself at 450pt wide; below that it fills whatever it's offered.
Styling
Each prop maps to one of KickstartSDK's SwiftUI style modifiers. Leave a prop out and the SDK's own default applies.
<ExchangeBannerAdView
apiKey="ks_live_REPLACE_WITH_API_KEY"
cornerStyle="square"
strokeColor="#FF9500"
disclosureBackgroundColor="#FF9500"
actionTextColor="#FF9500"
/>| Prop | Type | Maps to |
| --- | --- | --- |
| cornerStyle | 'square' \| 'rounded' | .exchangeAdCornerStyle(_:) |
| strokeColor | hex string ("#RGB", "#RRGGBB", or "#RRGGBBAA") | .exchangeAdStroke(_:) |
| disclosureBackgroundColor | hex string | .exchangeAdDisclosureBackgroundColor(_:) |
| actionTextColor | hex string | .exchangeAdActionTextColor(_:) |
Checking that it works
Debug builds and the Simulator always get a test ad — a real response from the live service, so if the card shows up, your API key, bundle ID, and network path are all fine. Test ads cost and earn nothing and aren't counted in analytics.
If nothing appears, check the Metro or Xcode console. The SDK logs a line starting with Kickstart Exchange: explaining what went wrong. A failed load never throws — the banner just doesn't render.
Privacy
This package adds no data collection or network calls of its own. Everything goes through KickstartSDK, documented in its README and the privacy notice. In short, Kickstart Exchange matches apps rather than people, and doesn't track users or devices.
If your app ships a privacy manifest, declare the same Usage Data: Product Interaction and Usage Data: Advertising Data entries that upstream declares.
Why dynamic frameworks?
KickstartSDK is only distributed through Swift Package Manager, so this package uses React Native's spm_dependency CocoaPods helper to pull it in — and that helper requires dynamic framework linking. It's a React Native requirement, not a choice this package makes, and there's no way to opt out of it.
That's also why the native side ships as two pods: KickstartExchangeBridge (dynamic, links KickstartSDK) and ExpoKickstartExchange (static, since ExpoModulesCore and ExpoUI are). CocoaPods won't let a dynamic pod depend on a static one, so the dynamic part is kept on its own.
Contributing
See CONTRIBUTING.md.
License
This package's code is MIT licensed — see LICENSE. It depends on twostraws/KickstartSDK but doesn't modify or redistribute it; the SDK and the Kickstart Exchange service have their own license and terms.
