# Cross-platform framework quirks that affect store review

- **Pattern:** `ab-000443` (`app-store-metadata-listing.risk-indicators.cross-platform-framework-quirks`)
- **Severity:** info
- **Lifecycle:** active
- **Last modified:** 2026-04-18
- **Canonical URL:** https://auditbuffet.com/patterns/ab-000443
- **License:** CC-BY-4.0 — attribute to AuditBuffet Pattern Catalog (https://auditbuffet.com/patterns/ab-000443)

## Why it matters

Cross-platform frameworks ship their own submission footguns. Flutter's `version: 1.0.0+1` format in `pubspec.yaml` maps to both `CFBundleShortVersionString` and `CFBundleVersion` — a mismatch blocks TestFlight upload with an opaque error. Expo projects without a fully configured `eas.json` submit profile force manual submission through Transporter, and Capacitor/Ionic apps face heightened Guideline 4.2 (Minimum Functionality) scrutiny because Apple treats thin web wrappers as rejectable.

## Severity rationale

Info because framework quirks create process friction and occasional upload errors rather than direct policy rejection.

## Remediation

Configure `eas.json` fully before the first submission so credentials don't block launch day. For Flutter projects, verify the version line in `pubspec.yaml` uses `major.minor.patch+buildNumber` format. For Capacitor or Ionic projects, audit the app for substantial native-only functionality (offline mode, push, hardware APIs) to defend against Guideline 4.2.

```json
{
  "submit": {
    "production": {
      "ios": { "appleId": "$APPLE_ID", "ascAppId": "$ASC_APP_ID", "appleTeamId": "$APPLE_TEAM_ID" },
      "android": { "serviceAccountKeyPath": "./play-service-account.json" }
    }
  }
}
```

## Detection

- **ID:** `cross-platform-framework-quirks`
- **Severity:** `info`
- **What to look for:** Assess the cross-platform framework in use and flag known metadata/listing quirks: (a) **Expo Managed Workflow:** EAS Submit can automate submission, but the `eas.json` `submit` profile must be configured with `appleId`, `appleTeamId`, `ascAppId` (App Store), and `serviceAccountKeyPath` (Google Play). Check whether these are present (values are expected to be environment variable references like `"$APPLE_ID"`, not literal values). An unconfigured `submit` profile means manual submission is required. (b) **React Native CLI (bare workflow):** Manual submission through Xcode Organizer (iOS) and Play Console (Android) — more error-prone than automated. Look for any Fastfile configuration. (c) **Flutter:** Version format in `pubspec.yaml` must be `version: 1.0.0+1` where `1.0.0` is `CFBundleShortVersionString` and `+1` is `CFBundleVersion` / `versionCode` — mismatches cause submission failures. (d) **Capacitor/Ionic:** Web-based apps face additional scrutiny from Apple for apps that are primarily web wrappers (Guideline 4.2 — minimum functionality). This is informational — flag it for awareness if Capacitor is detected. This is an informational check — it surfaces process risk, not a policy violation. Count all instances found and enumerate each.
- **Pass criteria:** Not applicable — result is `pass` or `skip` only, never `fail`. The implementation must be verifiable by examining the codebase and must handle the documented requirements completely. At least 1 implementation must be confirmed.
- **Fail criteria:** Not applicable — this is an info check.
- **Skip (N/A) when:** The framework is native (pure Swift/Kotlin) with no cross-platform layer — no known framework-specific quirks apply.
- **Detail on fail:** Not applicable. Example: `"cross-platform-framework-quirks: implementation not found or incomplete"`.
- **Remediation:** Cross-platform framework quirks are not rejection causes on their own, but they create process friction.
  1. For Expo: Configure EAS Submit fully before your first submission to avoid last-minute credential issues
  2. For Flutter: Verify `pubspec.yaml` version format is `major.minor.patch+buildNumber`
  3. For Capacitor/Ionic: Ensure the app provides substantial native functionality beyond what a mobile website would offer — Apple's "web wrapper" guideline is strictly enforced
 Configure framework-specific build settings in `app.json`, `eas.json`, or equivalent config files in the `src/` directory. Address platform quirks before submission.

Taxons: operational-readiness

HTML version: https://auditbuffet.com/patterns/ab-000443
