Reelora docs
v1.1.0
Live demo Get help
● Set up · Flutter app

App setup.
Make the iOS and Android app yours.

Point the app at your server, give it your own bundle id, name and icon, connect Firebase push and AdMob, create the in-app products and set up app links. Every step below names the exact file.

--dart-definecom.yourcompany.reeloraGoogle test ad ids to replaceStoreKit 2 + Play verification

01Server address

Windows

The commands on this page work in any terminal where Flutter is installed, including PowerShell. iOS builds need a Mac with Xcode; on Windows you can build and run the Android app. Run tool/check_release.sh in WSL or Git Bash.

The app finds the server through the build-time value API_BASE_URL (app/lib/core/api.dart). Use your https address:

flutter run --dart-define=API_BASE_URL=https://api.example.com

Without it, the app uses a server on your computer (http://localhost:8080, or http://10.0.2.2:8080 on the Android emulator). Release builds need https.

02Bundle id, package name and app name

The package ships with the placeholder com.yourcompany.reelora. Change it before you publish:

PlatformWhat to changeWhere
AndroidApplication idapp/android/app/build.gradle.kts → applicationId. The namespace and the Kotlin folder com/yourcompany/reelora may stay; the store only sees the application id.
AndroidApp name under the iconapp/android/app/src/main/AndroidManifest.xml → android:label
iOSBundle id and teamOpen app/ios/Runner.xcworkspace in Xcode → Runner → Signing & Capabilities. Pick your own team (the project ships with an empty DEVELOPMENT_TEAM) and set your bundle identifier.
iOSApp name under the iconapp/ios/Runner/Info.plist → CFBundleDisplayName

The name shown inside the app comes from Console → Brand → Product name (Customization). Enter the same bundle id and package name in Console → Payments and Console → App links.

03App icon and launch screen

  • iOS: replace the images in app/ios/Runner/Assets.xcassets/AppIcon.appiconset (Xcode shows every required size). The launch image is in LaunchImage.imageset.
  • Android: replace ic_launcher.png in each app/android/app/src/main/res/mipmap-* folder.

An icon generator such as the flutter_launcher_icons package can make all sizes from one image; it is not included, add it if you want it.

04Android release signing

The release build is signed with the debug key so that flutter run --release works out of the box (build.gradle.kts, buildTypes.release). Before you upload to Google Play, create your own upload key and replace that signingConfig, as described in Flutter's "Build and release an Android app" guide.

05Push notifications (Firebase)

Push is optional. The app initialises Firebase only when the values below are passed at build time (app/lib/services/push.dart), so it works without a Firebase project and no google-services.json or GoogleService-Info.plist file is used.

  1. Firebase Console → create a project → add your iOS and Android apps with your bundle id and package name. Enable Cloud Messaging and upload your APNs key for iOS.
  2. In Xcode add the Push Notifications capability to the Runner target (Apple requirement for APNs; the project ships without it).
  3. Project settings → Service accounts → Generate new private key. Paste the JSON into Console → Push notifications → Firebase service account, then use the Test button.
  4. Build the app with your Firebase values (from the Firebase app settings):
flutter build appbundle \
  --dart-define=API_BASE_URL=https://api.example.com \
  --dart-define=FIREBASE_API_KEY=... \
  --dart-define=FIREBASE_APP_ID=... \
  --dart-define=FIREBASE_SENDER_ID=... \
  --dart-define=FIREBASE_PROJECT_ID=... \
  --dart-define=FIREBASE_IOS_BUNDLE_ID=...
Firebase console Project settings with the Service accounts tab (1), Firebase Admin SDK (2) and the Generate new private key button (3); project and account hidden
Firebase console, Project settings: (1) Service accounts, (2) Firebase Admin SDK, (3) Generate new private key. Project data hidden.
  1. Turn on Push notifications in the console. New episodes notify viewers who saved the series; campaigns are sent from Push campaigns; "Remind me" on Coming soon sends a push at release.

iOS and Android have different Firebase app ids; build each platform with its own FIREBASE_APP_ID.

06AdMob app ids

Replace Google's test ids before release

The package ships with Google's public sample AdMob ids (ca-app-pub-3940256099942544…). They show test ads only and must be replaced with your own.

FileKey
app/android/app/src/main/AndroidManifest.xmlcom.google.android.gms.ads.APPLICATION_ID
app/ios/Runner/Info.plistGADApplicationIdentifier

The ad unit ids are not in the app: you paste them into the console (Ads). Debug builds fall back to Google's test units when no unit id is set; release builds show no ads without your unit ids.

07In-app purchases

  1. App Store Connect → your app → Monetization → In-App Purchases: create a Consumable for every coin pack and every VIP pass (VIP passes are fixed-length; they do not renew).
  2. Play Console → your app → Monetize → Products → In-app products: create the same products as one-time products.
  3. Console → Store: for each coin pack and VIP pass, enter the App Store product id and the Google Play product id exactly as you created them. Products without an id are simply not sold in that store.

Server verification

Coins are never added on the device. The app sends each purchase to the server, which verifies it and only then is the transaction finished:

  • App Store: StoreKit 2 signed transactions are checked against Apple's root certificate, which is embedded in server/src/payments/apple.ts (no certificate file to install). Set Console → Payments → iOS bundle id (transactions for any other app are refused) and App Store environment accepted (Production only, or Sandbox and Production while testing).
  • Google Play: verified and consumed through the Android Publisher API. In Google Cloud create a service account with the Android Publisher API enabled, invite it in Play Console → Users and permissions, and paste its JSON key into Console → Integrations → Google Play service account (use Test). Set Console → Payments → Android package name.
Google Cloud console product page for the Google Play Android Developer API with the project picker (1), the API name (2), Enable (3) and the service name androidpublisher.googleapis.com (4)
Google Cloud console, APIs & Services, Library: (1) your project, (2) Google Play Android Developer API, (3) Enable. Project name hidden.

Each purchase is bound to the account that made it. Then turn on payments.

09Release check

Before every store upload run, from the app/ folder:

sh tool/check_release.sh

It lists every place that still holds a value you must replace, and exits with code 1 while anything is left:

  • Google's sample AdMob app id in Info.plist and AndroidManifest.xml;
  • the example bundle id com.yourcompany.reelora in the Xcode project and build.gradle.kts;
  • the example app-link host watch.example.com.

Firebase needs no file: the script reminds you that push is configured at build time with --dart-define (above).

10What this costs you

Costs

Publishing needs an Apple Developer Program membership (yearly fee) and a Google Play developer account (one-time fee). Firebase Cloud Messaging is billed under your Firebase project's plan; check Firebase's pricing page. Store commissions on in-app purchases are on Payments. See Costs not included.

11Release builds

cd app
flutter build appbundle --dart-define=API_BASE_URL=https://api.example.com   # Google Play
flutter build ipa --dart-define=API_BASE_URL=https://api.example.com         # App Store

Add the Firebase defines if you use push. Bump version in app/pubspec.yaml (ships as 1.1.0+110) for every store upload. Store submission steps are on Deployment.