Zum Inhalt springen

iOS App Store Review Guidelines für IAP

GitHub

Damit deine App im App Store genehmigt wird, musst du Apples Richtlinien genau beachten – besonders bei In-App-Käufen und Abonnements. Dieser Guide zeigt dir alles, was du wissen musst, um schon bei der ersten Einreichung durch die Review zu kommen.

iOS App Store Review-Prozess

App Store Connect Setup abschließen

Abschnitt „App Store Connect Setup abschließen“

Bevor Apple deinen Kaufprozess prüft, stelle sicher, dass der App-Eintrag selbst vollständig ist:

  • Füge einen URL der Datenschutzrichtlinie in App Store Connect
  • Füge einen Support-URL die zu echten Kontaktinformationen führt
  • Vervollständige den Altersfreigabe- Fragebogen, damit die App veröffentlicht werden kann
  • Füge Kontaktdaten für den App Review und klare Anmerkungen für die Reviewer
  • Falls ein Login erforderlich ist, stelle ein Demo-Konto bereit, das während des Reviews nicht abläuft
App Store Metadaten mit Richtlinien- und Support-Links
  • Verwende aktuelle Screenshots aus dem Build, der gerade geprüft wird
  • Für das iPhone: 1290 x 2796 (6,7-Zoll) ist die einfachste Standardgröße
  • Falls deine App auf dem iPad läuft, lade auch iPad-Screenshots hoch
  • Aktuell akzeptierte große iPad-Größen sind 2064 x 2752 (13-Zoll) und 2048 x 2732 (12,9-Zoll)
  • Strecke iPhone-Screenshots niemals, um iPad-Support vorzutäuschen

Reviewer-Journey in TestFlight durchspielen

Abschnitt: „Reviewer-Journey in TestFlight simulieren“

Durchlaufe den exakten Pfad, den Apple auf einem echten Gerät nutzen wird:

  • Installiere den neuesten Build aus TestFlight
  • Melde dich mit dem Reviewer-Account an, den du bereitstellen willst
  • Erreiche die Paywall ohne versteckte Gesten oder Debug-Menüs
  • Durchlaufe Kauf-, Restore- und Abo-Verwaltungs-Flows
  • Prüfe, ob die App bei verweigerten Berechtigungen korrekt funktioniert

Apple verlangt eine glasklare Preisangabe vor jedem Kauf:

Essenzielle Elemente:

  • Exakten Preis vor dem Kauf-Button anzeigen
  • Abrechnungsintervall angeben (z. B. „9,99 €/Monat“)
  • Eindeutig kommunizieren, was der Nutzer erhält
  • Zeitpunkt der Abbuchung angeben

Häufige Ablehnungsgründe:

„Die Abo-Preise müssen klar und transparent sein.“

:::caution Preis-Konsistenz Alle Preise müssen übereinstimmen in:

  • App Store Metadaten-Listing
  • In-App-Kauf-Screens
  • Screens zur Abo-Verwaltung

Schon eine Abweichung von nur 1 $ zwischen Store-Eintrag ($4,99) und App ($5,99) führt zur automatischen Ablehnung. :::

Erforderliche Angaben:

  • Alle verfügbaren Abo-Stufen gemeinsam anzeigen
  • Klarer Feature-Vergleich pro Stufe
  • Kein automatisches Auswählen von Premium-Stufen durch UI-Tricks
  • Leicht findbare Kündigungsanweisungen

UI-Design: Dos und Don'ts

Paywall mit Restore-Button und rechtlichen Links

Beispiel für konforme UI:

import { NativePurchases } from '@capgo/native-purchases';
function SubscriptionScreen() {
return (
<div>
<h2>Choose Your Plan</h2>
{/* Show all tiers equally */}
<PlanCard
title="Basic"
price="$4.99/month"
features={['Feature A', 'Feature B']}
/>
<PlanCard
title="Premium"
price="$9.99/month"
features={['All Basic', 'Feature C', 'Feature D']}
highlighted={false} // Don't force premium
/>
{/* Clear cancellation info */}
<Text>
Cancel anytime in Settings > Subscriptions.
No refunds for partial periods.
</Text>
</div>
);
}

Erforderliche Implementierung:

Jede App mit IAP muss eine Möglichkeit bieten, frühere Käufe wiederherzustellen, ohne den Support kontaktieren zu müssen.

import { NativePurchases, PURCHASE_TYPE } from '@capgo/native-purchases';
async function restorePurchases() {
try {
await NativePurchases.restorePurchases();
const { purchases } = await NativePurchases.getPurchases({
productType: PURCHASE_TYPE.SUBS,
});
const activeSub = purchases.find(
(purchase) => purchase.isActive && purchase.expirationDate,
);
if (activeSub) {
unlockPremiumFeatures();
showMessage('Purchases restored successfully!');
return;
}
const { purchases: iaps } = await NativePurchases.getPurchases({
productType: PURCHASE_TYPE.INAPP,
});
const hasIap = iaps.some((purchase) => purchase.productIdentifier === 'premium_unlock');
showMessage(
hasIap ? 'Premium purchase restored!' : 'No previous purchases found.',
);
} catch (error) {
showError('Failed to restore purchases. Please try again.');
}
}
// Add a visible "Restore Purchases" button
<Button onClick={restorePurchases}>
Restore Purchases
</Button>

1. App-Crashes oder defekte Funktionen

Abschnitt „1. App-Abstürze oder defekte Funktionen“

Warum es fehlschlägt:

  • App stürzt beim Start ab
  • Purchase-Flow wird nicht abgeschlossen
  • Features aus den Screenshots funktionieren nicht

Prävention:

  • Auf echten Geräten testen (nicht nur Simulatoren)
  • Alle Subscription-Flows End-to-End testen
  • Funktion der Receipt-Validierung prüfen
  • Netzwerk-Error-Handling prüfen

Warum es fehlschlägt:

  • Screenshots zeigen Features, die im aktuellen Build fehlen
  • Beschreibung erwähnt Funktionen, die es nicht gibt
  • Preise in den Metadaten weichen von den In-App-Preisen ab

Metadaten-Checkliste

Prävention:

// Document exactly what's in each tier
const SUBSCRIPTION_FEATURES = {
basic: ['Ad-free', 'Cloud sync', 'Basic themes'],
premium: ['Ad-free', 'Cloud sync', 'All themes', 'Priority support']
};
// Use these in both your app AND App Store description

Warum es fehlschlägt:

  • Kamera/Standort/Health ohne Erklärung anfragen
  • Berechtigungsanfragen sind mehrere Screens tief vergraben
  • Vage oder generische Berechtigungsbeschreibungen

Prävention:

Aktualisiere dein Info.plist mit klaren Erklärungen:

Berechtigungstexte, die für das Review zu vage sind Berechtigungstexte mit klareren Erklärungen
<key>NSCameraUsageDescription</key>
<string>Camera access is needed to scan product barcodes for quick subscription upgrades.</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>Location helps us show relevant local content in your Premium subscription.</string>

Warum es fehlschlägt:

  • Behauptungen wie „#1 App weltweit“ ohne Beleg
  • „Unbegrenzte“ Features mit versteckten Limits
  • Künstliche Verknappung („Nur noch 2 Plätze frei!“)

Beispiele für Richtlinien zur Beschreibung

Zusätzliche Richtlinien zur Beschreibung

Prävention:

  • Beschreibungen präzise und sachlich halten
  • Superlative ohne Belege vermeiden
  • Keine künstliche Verknappung nutzen

5. Versteckter Kündigungsprozess

Abschnitt „5. Versteckter Kündigungsprozess“

Warum es fehlschlägt:

  • Keine Infos zur Kündigung
  • Kündigungsbutton versteckt oder schwer findbar
  • Mehrstufiger Prozess statt Apples nativem Flow

Prävention:

// Always inform users about cancellation
function SubscriptionInfo() {
return (
<div>
<h3>How to Cancel</h3>
<ol>
<li>Open iPhone Settings</li>
<li>Tap your name at the top</li>
<li>Tap Subscriptions</li>
<li>Select this app and tap Cancel</li>
</ol>
<p>Or manage directly in the App Store app.</p>
<Button onClick={openSubscriptionManagement}>
Manage Subscription in Settings
</Button>
</div>
);
}
async function openSubscriptionManagement() {
// Direct link to iOS subscription management
await NativePurchases.showManageSubscriptions();
}

Apple hat die Datenschutzanforderungen 2025 deutlich verschärft.

Für jede Berechtigung:

  1. Warum du es brauchst (konkreter Anwendungsfall)
  2. Wann es verwendet wird
  3. Wie Daten gespeichert/geteilt werden
  4. Ob es optional oder erforderlich ist
async function requestCameraPermission() {
// Show explanation BEFORE requesting
await showDialog({
title: 'Camera Access',
message: 'We need camera access to let you scan barcodes for quick product lookup. Your photos are never uploaded or stored.',
buttons: ['Not Now', 'Allow']
});
// Then request permission
const result = await Camera.requestPermissions();
return result.camera === 'granted';
}

Ensure your App Store privacy labels accurately reflect:

  • Erfassung des Kaufverlaufs
  • E-Mail-Adressen (für Belege)
  • Geräte-IDs (zur Betrugsprävention)
  • Nutzungsdaten (für Analytics)

Falsche Privacy Labels sind 2025 ein häufiger Ablehnungsgrund. Prüfen Sie Ihre Datenerfassung sorgfältig.

Checkliste vor dem Einreichen

  1. Alle Kaufabläufe testen

    • Jede Abo-Stufe kaufen
    • Kostenlose Testphasen testen
    • Intro-Angebote auf korrekte Anwendung prüfen
    • Funktionalität zum Wiederherstellen von Käufen
    • Family Sharing prüfen (falls aktiviert)
    • Auf mehreren Geräten testen
  2. Preiskonsistenz prüfen

    • App-Store-Metadaten mit In-App-Preisen abgleichen
    • Alle Währungen auf Korrektheit prüfen
    • Kostenlose Testzeiträume mit Beschreibungen abgleichen
    • Bedingungen der Intro-Angebote auf Korrektheit prüfen
  3. Alle Texte prüfen

    • Platzhalter-Texte entfernen
    • Prüfen, ob Aussagen testbar sind
    • Grammatik und Rechtschreibung prüfen
    • Beschreibungen mit Build abgleichen
    • Konkurrenz-Nennungen entfernen
  4. Berechtigungen testen

    • Nur notwendige Berechtigungen anfordern
    • Klare Erklärungen vor der Anfrage zeigen
    • „Ablehnen“-Flows testen (App muss laufen)
    • Info.plist-Beschreibungen auf Klarheit prüfen
  5. Test-Account vorbereiten

    • Review-Account erstellen, der während der Prüfung gültig bleibt
    • Login-Daten in den App Review-Informationen hinterlegen
    • Prüfen, ob der Reviewer die Paywall erreicht und den Kaufprozess abschließen kann
    • Bei Bedarf weitere Accounts oder App-spezifische Switches im Notizfeld angeben
  6. Metadaten prüfen

    • Screenshots stimmen mit dem aktuellen UI überein
    • Support-URL enthält echte Kontaktinformationen
    • Datenschutzerklärung-URL ist eingetragen
    • Altersfreigabe passt zum Inhalt des Builds
    • App-Vorschau-Video (falls vorhanden) zeigt die aktuelle Version
    • Beschreibung stellt Features korrekt dar
    • Datenschutzerklärung ist in der App und im Store-Listing erreichbar
  7. Detaillierte Review-Notizen schreiben

    Contact:
    Name: Jane Developer
    Email: review@yourapp.com
    Phone: +1 555-0100
    Test Account:
    Email: reviewer@test.com
    Password: TestPass123!
    This account does not expire during review.
    Testing Instructions:
    1. Log in with test account above
    2. Tap "Upgrade to Premium" button
    3. Select "Monthly Premium" subscription
    4. Complete purchase (no charge in sandbox)
    5. Verify premium features unlock
    Note: Subscription pricing is clearly shown before purchase.
    Cancellation instructions are in Settings > Account.

App Store Review-Zeitplan

Standard-Review: 24–48 Stunden Spitzenzeiten: 3–5 Tage (App Store Feiertage) Wochenenden: Keine Reviews bearbeitet Beschleunigte Prüfung: Verfügbar für kritische Bugfixes (Anfrage via App Store Connect)

Häufige Status in App Store Connect:

  • Waiting for Review
  • In Review
  • Pending Developer Release
  • Rejected

1. Klarheit bei Abonnements

  • Vergleich von Tarifen nebeneinander erforderlich
  • Keine „Dark Patterns“, die günstigere Optionen verbergen
  • Klare Downgrade-/Upgrade-Pfade

2. Korrekte Metadaten

  • Screenshots müssen zum geprüften Build passen
  • iPad-Screenshots sind erforderlich, wenn die iPad-Unterstützung aktiviert ist
  • Support-URL und Datenschutzrichtlinie sollten vor dem Submit bereits live sein

3. Qualität von Datenschutz und Review-Details

  • Datenschutzhinweise müssen dem entsprechen, was deine SDKs tatsächlich erfassen
  • Kontaktinfos und Notizen für den App Review sollten beim ersten Einreichen vollständig sein
  • Demo-Zugangsdaten müssen während des gesamten Review-Zeitraums gültig bleiben

4. Bereit für die Submission

  • Apple aktualisiert die Mindestanforderungen für SDK regelmäßig; prüfe daher die aktuelle Deadline, bevor du einen Release-Build hochlädst
  • TestFlight ist der sicherste Ort, um den genauen Reviewer-Pfad vor dem Submit zu prüfen

Best Practices für das Native Purchases Plugin

Abschnitt: „Best Practices für das Native Purchases Plugin“

Sauberes Error Handling implementieren

Abschnitt: „Fehlerbehandlung korrekt implementieren“
import { NativePurchases, PURCHASE_TYPE } from '@capgo/native-purchases';
async function handlePurchase(productId: string) {
try {
const transaction = await NativePurchases.purchaseProduct({
productIdentifier: productId,
productType: PURCHASE_TYPE.SUBS,
});
// Success
await validateReceiptOnServer(transaction.receipt);
showSuccess('Subscription activated!');
unlockFeatures();
} catch (error: any) {
// Handle specific error cases
if (error.code === 'USER_CANCELLED') {
// User cancelled - don't show error
console.log('Purchase cancelled by user');
} else if (error.code === 'PAYMENT_PENDING') {
showInfo('Payment is pending. Please check back later.');
} else if (error.code === 'PRODUCT_ALREADY_PURCHASED') {
// Restore instead
await NativePurchases.restorePurchases();
} else {
// Show user-friendly error
showError('Unable to complete purchase. Please try again.');
}
}
}
function PurchaseButton({ productId }: { productId: string }) {
const [loading, setLoading] = useState(false);
const handlePurchase = async () => {
setLoading(true);
try {
await NativePurchases.purchaseProduct({ productIdentifier: productId });
} finally {
setLoading(false);
}
};
return (
<button onClick={handlePurchase} disabled={loading}>
{loading ? 'Processing...' : 'Subscribe Now'}
</button>
);
}

Nutzungsbedingungen klar anzeigen

Abschnitt: „AGB klar darstellen“
function SubscriptionTerms() {
return (
<div className="terms">
<p>
Subscription automatically renews unless cancelled at least 24 hours
before the end of the current period.
</p>
<p>
Your account will be charged for renewal within 24 hours prior to
the end of the current period.
</p>
<p>
Subscriptions may be managed by the user and auto-renewal may be
turned off in Account Settings after purchase.
</p>
<p>
<a href="/terms">Terms of Service</a> |
<a href="/privacy/">Privacy Policy</a>
</p>
</div>
);
}
  1. Die Ablehnung sorgfältig lesen

    • Die genannte Richtlinie notieren (z. B. 3.1.1, 5.1.1)
    • Verstehen, was Apple genau beanstandet hat
  2. Das Problem gründlich beheben

    • Nicht nur patchen – die Ursache beheben
    • Den Fix umfassend testen
    • Dokumentieren, was geändert wurde
  3. Im Resolution Center antworten

    Thank you for your feedback. I have addressed the issue:
    Issue: Subscription pricing not clear upfront
    Fix: Added explicit pricing display on subscription selection
    screen showing "$9.99/month" before purchase button. Also added
    cancellation instructions on the same screen.
    The changes are in this submission and can be tested using the
    provided test account.
  4. Zügig erneut einreichen

    • Erneute Einreichungen werden meist schneller geprüft
    • Meist binnen 24 Stunden

Falls die Ablehnung Ihrer Meinung nach falsch ist:

App Store Klärungsprozess

  1. Klicken Sie in App Store Connect auf „Einspruch“
  2. Liefern Sie klare Belege:
    • Screenshots, die Compliance belegen
    • Verweise auf konkrete Guidelines
    • Erklärung, wie Sie die Anforderungen erfüllen
  3. Bleiben Sie professionell und sachlich
  4. Testaccount angeben, falls Funktionen schwer zu finden sind

Beispiel für Dokumentationsanfragen

Wenn weiterhin Probleme auftreten:

Probleme beim App Review oder brauchst du individuelle Unterstützung? Beratungstermin mit unserem Team buchen für gezielten Support bei:

  • IAP-Implementierung prüfen & optimieren
  • App-Store-Review: Vorbereitung & Strategie
  • Einreichungs-Checkliste prüfen
  • Ablehnungen beheben & Einsprüche einlegen
  • Vollständiges Testing & Validierung

Unsere Experten haben schon hunderten Apps erfolgreich durchs Review geholfen!

Weiterlesen: iOS App Store Review Guidelines zu IAP

Abschnitt: „Weiterlesen: iOS App Store Review Guidelines für IAP“

Wenn du es nutzt iOS App Store Review Guidelines für IAP um Store-Zulassung und Distribution zu planen, verknüpfen Sie es mit @capgo/native-purchases verwenden für die native Funktionalität bei der Nutzung von @capgo/native-purchases, @capgo/capacitor-in-app-review für die Implementierungsdetails in @capgo/capacitor-in-app-review, @capgo/capacitor-in-app-review nutzen für die native Funktion bei der Nutzung von @capgo/capacitor-in-app-review, @capgo/capacitor-native-market für das Implementierungsdetail in @capgo/capacitor-native-market, und @capgo/capacitor-native-market nutzen für die native Funktionalität bei der Nutzung von @capgo/capacitor-native-market.