Apple / iOS configuration — Treeper mobile
Everything the iOS app needs from the Apple Developer account, App Store Connect, and Firebase, plus a step‑by‑step for moving to a new Apple Developer account. The Xcode project itself is already wired (targets, entitlements, embeds); the items below live outside git and must be re‑created per account.
1. Identifiers (current values)
Section titled “1. Identifiers (current values)”| Thing | Value |
|---|---|
| Team ID | 5387Q4G7RF |
| App bundle id | in.itssatya.treeper.app |
| Share‑extension bundle id | in.itssatya.treeper.app.ShareExtension |
| App Group | group.in.itssatya.treeper.app.shared |
| URL scheme (deep links) | treeper:// (invites: treeper://invites/<token>) |
| URL scheme (share extension callback) | ShareMedia-in.itssatya.treeper.app |
| Min iOS version | 15.6 |
| Display name | see Runner/Info.plist → CFBundleDisplayName |
There are two App IDs (the app and the share extension) — both must be registered and both must carry the App Groups capability.
2. Apple Developer portal (developer.apple.com → Certificates, IDs & Profiles)
Section titled “2. Apple Developer portal (developer.apple.com → Certificates, IDs & Profiles)”2.1 App Group
Section titled “2.1 App Group”- Register App Group
group.in.itssatya.treeper.app.shared.
2.2 App IDs (Identifiers)
Section titled “2.2 App IDs (Identifiers)”Register both, each with these capabilities:
| App ID | App Groups | Push Notifications |
|---|---|---|
in.itssatya.treeper.app | ✅ → the group above | ✅ |
in.itssatya.treeper.app.ShareExtension | ✅ → the group above | — |
The extension App ID is the #1 thing people forget. Without it (with App Groups enabled), App Store / TestFlight signing fails for the extension, or the shared container is unavailable so a shared reel never reaches the app.
We do not use Associated Domains (deep links are the custom treeper://
scheme, not universal links). If universal links are added later, add the
Associated Domains capability + an apple-app-site-association file.
2.3 APNs auth key (push)
Section titled “2.3 APNs auth key (push)”- Create one APNs Auth Key (.p8) under Keys (Apple Push Notifications service). Note the Key ID and Team ID. One key covers all your apps.
- This key is uploaded to Firebase (see §3) — the app receives push via FCM, which talks to APNs using this key.
2.4 Signing assets
Section titled “2.4 Signing assets”- Distribution certificate (Apple Distribution) for the team.
- App Store provisioning profiles for both bundle ids, each including the
App Groups (and, for the app, Push) entitlement. With Automatic signing
(current setup, team
5387Q4G7RF) Xcode / App Store Connect generates these once the App IDs + capabilities exist.
3. Firebase (FCM push) — linked to Apple, separate console
Section titled “3. Firebase (FCM push) — linked to Apple, separate console”Push goes through Firebase Cloud Messaging, not APNs directly.
- iOS config file:
ios/Runner/GoogleService-Info.plist(in git). - Android config file:
android/app/google-services.json(in git). - In the Firebase console → Project settings → Cloud Messaging → Apple app config: upload the APNs Auth Key (.p8) from §2.3 (Key ID + Team ID).
- The Firebase iOS app’s bundle id must equal
in.itssatya.treeper.app.
If you move Apple accounts but keep the same Firebase project, you still must re‑upload an APNs key generated under the new Team. If you also move Firebase projects, regenerate both config files.
4. App Store Connect
Section titled “4. App Store Connect”- Create the app record for
in.itssatya.treeper.app(the embedded extension needs no separate record). - TestFlight: add internal/external testers; builds uploaded from CodeMagic (or Xcode Organizer) appear here after processing.
5. Capabilities matrix (already in the Xcode project)
Section titled “5. Capabilities matrix (already in the Xcode project)”| Capability | Runner (app) | ShareExtension | File |
|---|---|---|---|
| App Groups | ✅ | ✅ | Runner/Runner.entitlements, Runner/RunnerRelease.entitlements, ShareExtension/ShareExtension.entitlements |
Push (aps-environment) | ✅ dev / ✅ prod | — | Runner.entitlements (development), RunnerRelease.entitlements (production) |
Release/Archive (TestFlight) uses RunnerRelease.entitlements (production
APNs + app group) — confirmed in project.pbxproj.
Permissions (Info.plist usage strings — already present)
Section titled “Permissions (Info.plist usage strings — already present)”NSCameraUsageDescription, NSPhotoLibraryUsageDescription,
NSPhotoLibraryAddUsageDescription (image picker / attachments).
6. Moving to a NEW Apple Developer account
Section titled “6. Moving to a NEW Apple Developer account”- Portal (new account): redo §2 — register the App Group, both App IDs with App Groups (+ Push on the app), create a new APNs key + distribution cert/profiles. You can keep the same identifier strings, or rebrand them (if rebranding, do step 3 across all the files below).
- Firebase: upload the new APNs key (§3). Re‑download
GoogleService-Info.plistif the Firebase iOS app changed. - Xcode project: set
DEVELOPMENT_TEAMto the new Team ID. With automatic signing that’s the only project change needed (if identifiers are unchanged). - App Store Connect: create the app record under the new account; set up TestFlight.
- CodeMagic (CI): update the App Store Connect API key integration to the new account; confirm automatic signing provisions both bundle ids.
If you also RENAME the identifiers, change them in every file below
Section titled “If you also RENAME the identifiers, change them in every file below”(team 5387Q4G7RF, bundle id in.itssatya.treeper.app, extension
….ShareExtension, group group.in.itssatya.treeper.app.shared, and the
ShareMedia-… URL scheme):
ios/Runner.xcodeproj/project.pbxproj—PRODUCT_BUNDLE_IDENTIFIER(×both targets),DEVELOPMENT_TEAMios/Runner/Info.plist—CFBundleURLSchemes(treeper,ShareMedia-…),AppGroupIdios/Runner/Runner.entitlements+ios/Runner/RunnerRelease.entitlements—application-groupsios/ShareExtension/Info.plist—AppGroupId, and the activation schemeios/ShareExtension/ShareExtension.entitlements—application-groupsios/Runner/GoogleService-Info.plist— Firebase iOS config (regenerate)android/app/google-services.json— Firebase Android config (regenerate).maestro/*.yaml—appId:used by the E2E flows
The
treeper://deep-link scheme andShareMedia-<bundleid>share scheme are read in Dart/native (lib/core/deep_links/,ShareExtension/). If you change the bundle id, theShareMedia-…scheme changes with it — keep all four files that reference it in sync.
7. Verify a TestFlight build is correct
Section titled “7. Verify a TestFlight build is correct”Download the build / .ipa and confirm:
Payload/Runner.app/PlugIns/ShareExtension.appexexists (extension embedded), and- its
embedded.mobileprovisionlists the App Group undercom.apple.security.application-groups.
If both hold, sharing a reel from Instagram (Share → More → Treeper) reaches the in‑app destination chooser. If the appex is missing or lacks the group, the gap is the portal/signing setup in §2.