| name | metadata-accuracy |
| description | Detects mismatches between features claimed in App Store metadata and features actually implemented in the codebase, enforcing Guideline 2.3.1 which prohibits misleading app descriptions. |
Skill: Metadata Accuracy
Purpose
Detects mismatches between features claimed in App Store metadata descriptions and features actually implemented in the codebase, enforcing Guideline 2.3.1 which prohibits misleading app descriptions.
Apple Guideline
- Primary: 2.3.1 โ Performance: Accurate Metadata โ App Descriptions
- Related: 2.3.10
- Reference:
references/guidelines/2-performance.md
Real-World Rejection Cases
-
Case: App description mentioned "AR features" but app had no ARKit code โ rejected for misleading metadata
Source: Apple Developer Forums (Guideline 2.3.1 enforcement)
Root cause: App description must accurately represent actual features in the submitted build โ reviewers test claimed features and will reject if they cannot find them
-
Case: App description referenced Android-only features โ rejected under 2.3.10
Source: mobiloud.com/blog/avoid-app-rejected-apple
Root cause: Metadata must focus on Apple platform experience only โ references to other platforms mislead App Store users and violate platform-specific metadata requirements
-
Case: React Native cross-platform app displayed Android package name strings (e.g., com.android.vending, "Get it on Google Play") inside the onboarding flow โ reviewer saw Android-specific UI text on an iOS device โ rejected under 2.3.10
Source: Apple Developer Forums (multiple cross-platform developer reports)
Root cause: Cross-platform apps built with React Native, Flutter, or Capacitor sometimes include Android-specific strings, icons, or navigation patterns that surface in the iOS build โ reviewers flag any visible Android platform references inside the running app, not just in the App Store description
Trigger
Invoke on any iOS/macOS project before App Store submission to verify metadata accurately reflects the app's implemented features.
Inputs
| Name | Type | Default | Description |
|---|
project_root | path | cwd | iOS/macOS project root |
shared_context | object | nil | Pre-collected context from appstore-full-audit Phase 1 |
Actions
Phase 1: Context Collection
Skip this phase if shared_context is provided.
Glob **/fastlane/metadata/** or **/metadata/** โ locate metadata/description files.
Glob **/*.txt in metadata directories โ locate description text files.
Glob **/*.swift โ collect Swift source files for feature cross-reference.
Phase 2: Checks
-
Android/cross-platform references
Grep pattern "Android"|"Google Play"|"Play Store"|"on Android"|"Android version" in metadata/description text files.
Any match โ ๐ HIGH. App Store metadata must not reference competing platforms.
-
Coming soon / planned features
Grep pattern "coming soon"|"future update"|"planned feature"|"will be added"|"in a future release"|"soon available" in metadata/description text files.
Any match โ ๐ HIGH. Descriptions must only reflect features present in the submitted build โ describing future features may cause rejection.
-
AR feature claim vs ARKit presence
Grep pattern "AR"|"augmented reality"|"ARKit" in metadata/description text files.
If found, Grep ARKit|RealityKit|ARSCNView|ARSession in **/*.swift โ if absent โ ๐ HIGH. Claimed AR features must be implemented in the build being submitted.
-
AI/ML feature claim vs CoreML presence
Grep pattern "AI"|"artificial intelligence"|"machine learning"|"ML model"|"on-device AI" in metadata/description text files.
If found, Grep CoreML|CreateML|MLModel|NaturalLanguage|Vision in **/*.swift โ if absent โ ๐ HIGH. Claimed AI/ML features must be implemented in the build being submitted.
-
Android platform strings visible inside app
Grep pattern "com\.android"|"google\.play"|"Get it on Google Play"|"Android"|"Play Store" in **/*.swift and **/*.strings.
Any match in a UI string, label, or localizable string โ ๐ HIGH. Android platform references visible inside the iOS app are flagged by reviewers under 2.3.10 โ common in cross-platform codebases where Android strings leak into the shared bundle.
Phase 3: Output
Collect all findings from Phase 2 and build the prioritised findings list below. Include file paths and line numbers. Omit tiers with no findings.
Output Format
## Metadata Accuracy โ Findings
### ๐ด CRITICAL โ Guaranteed rejection
- [ ] TODO: <exact actionable step> โ `file:line` โ Guideline 2.3.1
### ๐ HIGH โ Very likely rejection
- [ ] TODO: Remove "Android" reference from App Store description โ `fastlane/metadata/en-US/description.txt:8` โ Guideline 2.3.10
- [ ] TODO: Remove Android platform string "Get it on Google Play" from in-app onboarding UI โ visible to iOS reviewer โ `OnboardingStrings.strings:14` โ Guideline 2.3.10
- [ ] TODO: Remove "coming soon" feature claims from description โ only describe features in the current build โ `fastlane/metadata/en-US/description.txt:22` โ Guideline 2.3.1
- [ ] TODO: Remove AR feature claim or implement ARKit โ description mentions "AR experience" but no ARKit code found in codebase โ Guideline 2.3.1
- [ ] TODO: Remove AI/ML claim or implement CoreML โ description mentions "AI-powered" but no CoreML/CreateML usage found โ Guideline 2.3.1
### ๐ก MEDIUM โ Possible rejection
- [ ] TODO: Manually review all description bullet points against actual app features โ verify each claimed capability is accessible to the reviewer
### ๐ข LOW โ Best practice
- [ ] TODO: Keep a feature parity checklist โ update description only after features ship; maintain a staging description for upcoming features outside of App Store Connect
Tools Used
Glob, Grep, Read
Constraints
- Read-only. No file edits.
- No network calls.
- Skip Phase 1 if
shared_context is provided by orchestrating agent.
- Works on Swift, Objective-C, React Native, Flutter projects.
Quick Commands
Run these in your project root to check manually:
!grep -rn "Android\|Google Play\|Play Store" . --include="*.swift" --include="*.strings" --include="*.md"
!grep -rn "ARKit\|RealityKit\|ARSCNView\|ARFrame" . --include="*.swift" | wc -l
!grep -rn "CoreML\|MLModel\|VNCoreMLRequest\|CreateML" . --include="*.swift" | wc -l
!grep -rn "coming soon\|future update\|planned feature" . --include="*.swift" --include="*.strings" -i
Swift Anti-Pattern Reference
examples/swift/QualityPatterns.swift
Detection Steps
-
Find target files
- Glob:
**/fastlane/metadata/, **/Info.plist
-
Search for rejection patterns
- Read
fastlane/metadata/en-US/description.txt โ extract feature claims
- Cross-reference claimed features against actual Swift implementation (grep feature keywords)
- Read
fastlane/metadata/en-US/keywords.txt โ check for competitor brand names
- Check
fastlane/metadata/en-US/support_url.txt โ runtime check: verify URL resolves (HTTP 200); flag if file is missing
-
Determine verdict
- Feature described in metadata but no matching Swift code found โ ๐ HIGH (Guideline 2.3.1 โ accurate marketing, all advertised features must be present)
- Competitor brand name in keywords โ ๐ HIGH (Guideline 2.3.7 โ accurate keywords)
- Support URL missing or unreachable โ ๐ HIGH (Guideline 1.5 โ support contact / 2.1 โ accurate metadata)
- All described features implemented, support URL reachable โ ๐ข pass
-
Report
- Feature claims with no matching code
- Keywords containing competitor names
- Fix: Remove unimplemented feature claims from description; remove competitor names from keywords; ensure support URL returns HTTP 200