App Store¶
Setting up and managing the Tomoda iOS app through App Store Connect (ASC). Binaries are built locally and uploaded by hand (see Native Release); this page covers everything else ASC requires: Apple Developer account, app record, signing, TestFlight, App Privacy, App Review, post-launch operations.
If you're shipping a code change, you don't need to touch this page: task native:beta:ios builds and uploads to TestFlight in one step (fastlane pilot). Read this page when you're setting up the app for the first time, managing TestFlight groups, updating App Store metadata, or navigating App Review.
1. Apple Developer Program¶
Mandatory for distributing any iOS app.
- Cost: US$99/year.
- Sign-up: https://developer.apple.com/programs/enroll/.
- Account type: Choose Organization (requires a D-U-N-S number — Apple provides a lookup tool during signup). Personal accounts can't publish under a company name.
- Identity verification:
- D-U-N-S number for the legal entity (free; takes ~1 week if your company isn't already listed)
- Legal-entity contact information matching the D-U-N-S record
- Apple typically reviews enrollment within 24–48h once D-U-N-S clears
- Renewal: annual. Don't let it lapse — the app is removed from the store within days of expiration.
The signed-up Apple ID becomes the Account Holder. Add team members as you onboard engineers/designers (Account Holder → Users and Access → Add user).
2. App Store Connect — create the app record¶
Once enrolled in the Developer Program:
- ASC → My Apps → New App
- Platforms: iOS
- Name: Tomoda
- Primary language: English (U.S.)
- Bundle ID:
com.tomoda.app(must exist in Certificates, Identifiers & Profiles first; register it in the Apple Developer portal, or let Xcode create it the first time you build) - SKU: internal identifier, never shown to users (
tomoda-iosworks) - User access: Full Access by default
This creates the app record and a numeric ASC App ID. For Tomoda this is 6765908734; you'll need it when uploading a build to this record.
3. Signing & certificates¶
Apple's signing infrastructure is the complex part of iOS distribution. Tomoda signs manually through Xcode and the Apple Developer portal for Apple Team 33TV825K7S.
What you manage¶
- iOS Distribution Certificate — proves builds come from Tomoda's Apple Developer team
- App Store Provisioning Profile — pairs the certificate to the bundle ID
com.tomoda.appfor App Store distribution - Push notification certificates — generated when push support is added; not in scope today
Signing is shared via fastlane match (see Signing): the distribution cert + App Store provisioning profile live encrypted in a private GCS bucket, and task native:beta:ios signs manually with that identity on any machine, so you never configure signing in Xcode. Team 33TV825K7S.
App Store Connect API key (recommended for uploads)¶
An ASC API key lets you upload builds non-interactively (via xcrun altool / xcrun notarytool) without your full Apple ID password:
- ASC → Users and Access → Keys → +
- Name: something recognizable (e.g. "Upload key")
- Access: App Manager (enough to upload builds without admin rights)
- Download the
.p8file (one-time download — Apple does not let you re-download). - Note the Key ID and Issuer ID shown after creation.
Store the distribution certificate .p12, its private key, the provisioning profile, and the API key .p8 in your team password manager. Losing the distribution certificate's private key means regenerating the cert and profile.
Push notification certs revoke distribution certs
Apple's UI buries this — generating a new distribution certificate without revoking the old one is fine, but revoking a distribution certificate immediately invalidates every provisioning profile signed with it, which means any app shipped with that profile breaks on next launch. Read carefully before revoking anything in Certificates, Identifiers & Profiles.
4. App Store listing¶
Required before any public release. Required for TestFlight external testing too (internal is exempt).
Required text¶
| Field | Limit | Notes |
|---|---|---|
| Name | 30 chars | "Tomoda" |
| Subtitle | 30 chars | One-line elevator pitch — e.g. "Find friends through shared moments" |
| Promotional text | 170 chars | Above-the-fold blurb (can be updated without re-review) |
| Description | 4000 chars | Marketing copy. Markdown not supported — plain text with line breaks. |
| Keywords | 100 chars total (comma-separated) | Affects search ranking. Don't repeat words from the title — wasted space. |
| Support URL | URL | Public help page (https://tomoda.life/support or similar) |
| Marketing URL | URL (optional) | Product landing page |
| Privacy Policy URL | URL — required | Must be live and resolve to a real privacy policy |
Required graphics¶
| Asset | Spec | Notes |
|---|---|---|
| App icon | 1024×1024 PNG, no transparency, no rounded corners | Apple rounds it. Don't pre-round. |
| 6.7" iPhone screenshots | 1290×2796 (portrait) | 3–10 images required |
| 6.5" iPhone screenshots | 1242×2688 or 1284×2778 | 3–10 required if you support iPhone X-class displays |
| (Optional) 5.5" iPhone, iPad | older devices | Skip unless you specifically support them |
| (Optional) App Preview videos | 15–30s, .mov/.m4v | High-effort, big lift in conversion |
Apple no longer enforces uploading every device-size variant — you can scale a single screenshot set up to all devices in ASC. But the 6.7" set is mandatory.
Category and age rating¶
- Primary category: Social Networking
- Secondary category: Lifestyle (optional; helps surface in browse)
- Age rating: complete the questionnaire under App Information → Age Rating. Tomoda will land at 17+ because of:
- Unrestricted web access (link previews, embedded content)
- User-generated content
- Frequent/intense mature/suggestive themes (selectable based on actual content policy)
5. App Privacy¶
Under App Privacy (a separate ASC section, mandatory). Walk through the questionnaire — Apple's labels appear on the App Store listing and are scrutinized.
Tomoda's accurate answers based on current product:
| Data type | Collected? | Linked to user? | Tracking? |
|---|---|---|---|
| Contact info (name, email, phone) | Yes | Yes | No |
| User content (messages, photos, posts) | Yes | Yes | No |
| Location (precise) | Yes | Yes | No |
| Identifiers (user ID, device ID) | Yes | Yes | No |
| Usage data (product interactions) | Yes | Yes | No |
| Diagnostics (crashes, performance) | Yes | No (anonymized) | No |
| Financial info | Yes (via Stripe — they hold the card data, not us) | No | No |
"Tracking" in Apple's sense means tracking the user across other apps/websites for advertising. Tomoda doesn't do this — answer No for everything.
Keep this in sync with the privacy policy. When you add a new data type, update both.
6. TestFlight¶
Apple's beta distribution channel. Two flavors:
| Type | Audience | Approval needed |
|---|---|---|
| Internal testing | Up to 100 testers with Apple ID + ASC role | No review — instant availability |
| External testing | Up to 10,000 testers | First build per version requires beta review (typically 24h) |
Internal testers must be added as users in ASC → Users and Access first. They install TestFlight from the App Store, sign in with the same Apple ID, and the build appears.
External testers can be invited by email or by a public link. They don't need an ASC account. Each cohort can be configured separately (e.g. "Designers", "Friends and family", "Public Beta").
Set up your first internal group before the first build upload so the build has somewhere to land.
7. App Review¶
Apple reviews every release before it goes to the App Store. Plan for:
- Time: typically 24–48h. First submission can take longer; complex reviews (financial flows, health data, kids' apps) longer still.
- Common rejection reasons:
- Guideline 4.0 — Design: copying iOS UI patterns inconsistently (e.g. custom share sheet that looks like the system one but behaves differently)
- Guideline 5.1.1 — Data Collection and Storage: privacy disclosure mismatch with what the app actually does
- Guideline 1.1.6 — False Information: claims in the description that don't match the app's behavior
- Sign in with Apple required: if you offer third-party login (Google, etc.), you must also offer Sign in with Apple, prominently
- Crashes during review: if review can't get past a sign-up flow, the app gets rejected — keep the demo account credentials populated in App Review Information
- Demo account: required in App Review Information for any app behind a login. Use a test account dedicated to App Review — not a real user account.
Speeding up review¶
- Submit during weekdays, US morning Pacific time.
- Request expedited review only for security fixes or actual production incidents. Apple grants ~1–2/year per developer; spend them carefully.
- Pre-empt rejections by reading the most recent guidelines update before submitting.
8. Upload the build¶
Build the signed .ipa locally, then upload it to ASC by hand:
task native:beta:ios # signed .ipa in frontend/build/ios/ipa/
Then either drag the .ipa into Transporter, or use the command line:
xcrun altool --upload-app -t ios -f frontend/build/ios/ipa/*.ipa \
-u <apple-id> -p <app-specific-password>
(Or authenticate with the ASC API key via --apiKey/--apiIssuer instead of the app-specific password.) ASC processes the build (~5–30 min) and makes it available in TestFlight. From there:
- ASC → TestFlight → add the build to your internal group → install via TestFlight app on device.
- Once happy, ASC → App Store → 1.0 Prepare for Submission → select the build → fill remaining metadata → Submit for Review.
The build moves from TestFlight to a "Waiting for Review" state. Approved builds release on the next manual "Release this version" tap (or scheduled date).
9. Post-release operations¶
- Crash reports: ASC → Analytics → Crashes shows crashes for users who opted in (~70% of users). Symbolicated automatically when dSYMs are uploaded — the local build uploads them to Sentry via
build-with-secrets.sh, and Xcode/altool includes them in the App Store upload. - App Store ratings & reviews: respond promptly. Apple's "developer response" feature is public.
- Phased release: new releases roll out over 7 days by default. Toggle in ASC if you want immediate full release (small fixes) or want to halt rollout (regression detected).
- App removal: if you ever need to pull the app, ASC → "Remove from Sale" instantly hides from the store. Existing installs are unaffected.
10. Useful references¶
- App Store Connect Help
- App Store Review Guidelines
- Apple Developer Program
- Uploading to App Store Connect (altool / Transporter)
See also¶
- Native Release — the local build + manual upload workflow
- Play Store — parallel page for Google Play Console
- Local development — Xcode + Simulator basics