Skip to content

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.


ThingValue
Team ID5387Q4G7RF
App bundle idin.itssatya.treeper.app
Share‑extension bundle idin.itssatya.treeper.app.ShareExtension
App Groupgroup.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 version15.6
Display namesee Runner/Info.plistCFBundleDisplayName

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)”
  • Register App Group group.in.itssatya.treeper.app.shared.

Register both, each with these capabilities:

App IDApp GroupsPush 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.

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


  • 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)”
CapabilityRunner (app)ShareExtensionFile
App GroupsRunner/Runner.entitlements, Runner/RunnerRelease.entitlements, ShareExtension/ShareExtension.entitlements
Push (aps-environment)✅ dev / ✅ prodRunner.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”
  1. 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).
  2. Firebase: upload the new APNs key (§3). Re‑download GoogleService-Info.plist if the Firebase iOS app changed.
  3. Xcode project: set DEVELOPMENT_TEAM to the new Team ID. With automatic signing that’s the only project change needed (if identifiers are unchanged).
  4. App Store Connect: create the app record under the new account; set up TestFlight.
  5. 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.pbxprojPRODUCT_BUNDLE_IDENTIFIER (×both targets), DEVELOPMENT_TEAM
  • ios/Runner/Info.plistCFBundleURLSchemes (treeper, ShareMedia-…), AppGroupId
  • ios/Runner/Runner.entitlements + ios/Runner/RunnerRelease.entitlementsapplication-groups
  • ios/ShareExtension/Info.plistAppGroupId, and the activation scheme
  • ios/ShareExtension/ShareExtension.entitlementsapplication-groups
  • ios/Runner/GoogleService-Info.plist — Firebase iOS config (regenerate)
  • android/app/google-services.json — Firebase Android config (regenerate)
  • .maestro/*.yamlappId: used by the E2E flows

The treeper:// deep-link scheme and ShareMedia-<bundleid> share scheme are read in Dart/native (lib/core/deep_links/, ShareExtension/). If you change the bundle id, the ShareMedia-… scheme changes with it — keep all four files that reference it in sync.


Download the build / .ipa and confirm:

  • Payload/Runner.app/PlugIns/ShareExtension.appex exists (extension embedded), and
  • its embedded.mobileprovision lists the App Group under com.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.