Cross-platform framework quirks that affect store review
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.
{
"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.jsonsubmitprofile must be configured withappleId,appleTeamId,ascAppId(App Store), andserviceAccountKeyPath(Google Play). Check whether these are present (values are expected to be environment variable references like"$APPLE_ID", not literal values). An unconfiguredsubmitprofile 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 inpubspec.yamlmust beversion: 1.0.0+1where1.0.0isCFBundleShortVersionStringand+1isCFBundleVersion/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
passorskiponly, neverfail. 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.
- For Expo: Configure EAS Submit fully before your first submission to avoid last-minute credential issues
- For Flutter: Verify
pubspec.yamlversion format ismajor.minor.patch+buildNumber - 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 thesrc/directory. Address platform quirks before submission.
Taxons
History
- 2026-04-18·v1.0.0·Initial import from app-store-metadata-listing·automated