Saltare al contenuto

iOS App Store Review Guidelines per IAP

GitHub

Per ottenere l'approvazione del tuo'app sullo Store richiede molta attenzione alle linee guida di Apple, soprattutto quando si implementano acquisti e abbonamenti all'interno dell'app. Questa guida copre tutto ciò di cui hai bisogno per superare la revisione alla tua prima sottoscrizione.

Processo di revisione dell'App Store di iOS

Prima che Apple esamini il tuo flusso di acquisto, assicurati che il record dell'app stesso sia completo:

  • Aggiungi un URL della politica sulla privacy nella sezione App Store Connect
  • Aggiungi un Supporto URL che porta a informazioni di contatto reali per gli utenti
  • Completa il questionario di valutazione di età perché l'app sia pubblicabile
  • Aggiungi dettagli di contatto per la revisione dell'app e note chiare per i revisori
  • Se è richiesto l'accesso, fornisce un account di demo che non scade durante la revisione
Metadati di lista App Store con link di politica e supporto
  • Utilizzare screenshot correnti dal build reale in rassegna
  • Per iPhone, 1290 x 2796 (6,7 pollici) è la dimensione di default più facile da utilizzare
  • Se la tua app funziona su iPad, carica anche screenshot di iPad
  • Le dimensioni di iPad accettate includono 2064 x 2752 (13 pollici) e 2048 x 2732 (12,9 pollici)
  • Non allungare le schermate iPhone per fingere il supporto iPad

Eseguire il percorso di valutazione del revisore in TestFlight in modalità di prova

Sezione intitolata “Eseguire il percorso di valutazione del revisore in TestFlight”

Eseguire il percorso esatto che Apple seguirà su un dispositivo reale:

  • Installare l'ultima versione da TestFlight
  • Accedere con l'account di valutazione che si prevede di fornire
  • Raggiungere la barriera pagamenti senza gesti nascosti o menu di debug
  • Flussi di acquisto, ripristino e gestione abbonamenti
  • Verificare che l'app si comporti correttamente anche se vengono negati i permessi

L'Apple richiede una trasparenza dei prezzi cristallina prima di qualsiasi acquisto:

Elementi da non mancare:

  • Mostra il prezzo esatto prima del pulsante di acquisto
  • Mostra la frequenza di fatturazione (ad esempio, “$9,99/mese”)
  • Stabilisci con chiarezza cosa gli utenti ottengono per il loro denaro
  • Indica quando si verificheranno le spese

Rifiuto comune:

“La tariffazione per abbonamento deve essere chiara e immediata.”

:::avviso Coerenza dei prezzi Tutti i prezzi devono corrispondere a:

  • Elenco dei metadati della Store
  • Pulsanti di acquisto all'interno dell'app
  • Schermate di gestione delle sottoscrizioni

Even a $1 discrepancy between store listing ($4.99) and app ($5.99) will trigger automatic rejection.

Presentazione del piano di sottoscrizione

Informazioni obbligatorie:

Tutti i piani di sottoscrizione disponibili visualizzati insieme

  • Comparazione chiara delle caratteristiche per livello
  • Nessuna impostazione automatica dei livelli premium attraverso trucchi di interfaccia utente
  • Istruzioni di cancellazione facili da trovare
  • Linee guida per il design dell'interfaccia utente

Paywall con ripristino delle acquisti e collegamenti legali

Esempio di interfaccia utente conforme alle norme

Schermate di gestione delle sottoscrizioni

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>
);
}

Implementazione richiesta:

Ogni app con IAP deve fornire un modo per gli utenti per ripristinare gli acquisti precedenti senza contattare il supporto.

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>

Perché fallisce:

  • L'app si blocca al lancio
  • Flusso di acquisto non riesce a completarsi
  • I caratteristiche mostrate nelle schermate non funzionano

Prevenzione:

  • Testa su dispositivi reali (non solo simulatori)
  • Testa tutti i flussi di abbonamento end-to-end
  • Verifica che la validazione del ricevuto funzioni
  • Controlla il trattamento degli errori di rete

Perché Fallisce:

  • Le schermate mostrano caratteristiche non presenti nella versione corrente
  • La descrizione menziona funzionalità che non esistono
  • Prezzi in metadati differiscono da quelli in-app

Elenco di controllo dei metadati

Prevenzione:

// 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

Perché fallisce:

  • Richiesta di camera/ubicazione/salute senza spiegazione
  • Richieste di permessi nascoste a più schermate di profondità
  • Descrizioni di permessi vaghe o generiche

Prevenzione:

Aggiorna il tuo Info.plist con spiegazioni chiare:

Permesso copia che è troppo vago per la revisione Permesso copia con spiegazioni più chiare
<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>

Perché Fallisce:

  • Affermazioni come “#1 app nel mondo” senza prova
  • “Caratteristiche illimitate” che hanno limiti nascosti
  • Tattiche di urgenza false (“Solo 2 posti disponibili!”)

Esempi di Linee Guida per la Descrizione

Linee Guida per la Descrizione aggiuntive

Prevenzione:

  • Sii specifico e fattuale nelle descrizioni
  • Evita superlativi senza prove
  • Non costringere gli utenti con scarsità fittizia

Perché Fallisce:

  • Assenza di indicazioni su come cancellare
  • Bottone di cancellazione nascosto o oscurato
  • Procedura di cancellazione a più passaggi senza flusso nativo di Apple

Prevenzione:

// 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 ha significativamente rafforzato le norme sulla privacy nel 2025.

Per ogni Autorizzazione:

  1. Perché ce ne serve (caso d'uso specifico)
  2. Quando verrà utilizzato
  3. Come viene memorizzato e condiviso i dati
  4. Se è facoltativo o obbligatorio
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';
}

Assicurati che le etichette sulla privacy delle tue app store siano accurate e riflettano:

  • Raccolta dei dati di acquisto
  • Indirizzi email (per le ricevute)
  • ID dispositivi (per la prevenzione dei frodi)
  • Dati di utilizzo (per gli analytics)

Le etichette sulla privacy inaccurate sono una delle principali ragioni di rifiuto nel 2025. Verifica con attenzione la raccolta dei dati.

Elenco di controllo pre-invio

  1. Testare tutti i flussi di acquisto protetti

    • Acquistare ogni livello di abbonamento
    • Testare le prove gratuite
    • Verificare che le offerte introduttive siano applicate correttamente
    • Testare la ripristino degli acquisti
    • Verificare che la condivisione della famiglia (se abilitata) funzioni correttamente
    • Testare su più dispositivi
  2. Verificare la consistenza dei prezzi

    • Controllare che i metadati dell'App Store corrispondano ai prezzi in-app
    • Verificare che tutti i valori di valuta siano corretti
    • Confermare che le durate delle prove gratuite corrispondano alle descrizioni
    • Controllare che le condizioni delle offerte introduttive siano accurate
  3. Verifica Tutta la Copia

    • Elimina il testo di placeholder
    • Verifica che le affermazioni siano testabili
    • Controlla grammatica e ortografia
    • Assicurati che le descrizioni corrispondano alla versione corrente
    • Elimina le menzioni dei concorrenti
  4. Testa le autorizzazioni

    • Richiedi solo le autorizzazioni necessarie
    • Mostra spiegazioni chiare prima di richiedere
    • Testa i flussi di
    • Verifica che le descrizioni di Info.plist siano chiare
  5. Prepara un account di test

    • Crea un account di recensione che rimane valido durante la recensione
    • Documenta le credenziali di accesso nell'informazione di valutazione dell'app
    • Verifica che il revisore possa raggiungere la paywall e completare il flusso di acquisto
    • Includi conti aggiuntivi o interruttori specifici dell'app nel campo Note se necessario
  6. Controlla i Metadati

    • Le schermate corrispondono all'interfaccia utente attuale
    • L'URL di supporto include informazioni di contatto reali
    • L'URL della politica sulla privacy è compilato
    • La classificazione di età corrisponde al contenuto nella build
    • Il video di anteprima dell'app (se presente) mostra la versione corrente
    • La descrizione descrive fedelmente le funzionalità
    • La politica sulla privacy è accessibile all'interno dell'app e nella lista degli store
  7. Scrivi Note di Recensione Dettagliate

    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.

Cronologia delle Recensioni dell'App Store

Recensione Standard: 24-48 ore Periodi di punta: 3-5 giorni (rilevazioni dell'App Store durante le festività) Weekend: Nessuna recensione elaborata Recensione Accelerata: Disponibile per correzioni di bug critici (richiedi tramite App Store Connect)

Stati comuni che vedrai in App Store Connect:

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

1. Chiarezza della Sottoscrizione

  • Richiede confronti a lato dei piani
  • Nessun 'trucco oscuro' che nasconda opzioni più economiche
  • Percorsi di downgrade/upgrade chiari

2. Precisione dei metadati

  • Le schermate devono corrispondere alla versione in esame
  • Sono richieste le schermate per iPad se è abilitata la supporto per iPad
  • L'URL di supporto e la politica sulla privacy dovrebbero essere già attivi prima della sottoscrizione

3. Qualità della dettagliatazza sulla privacy e sulla recensione

  • Le dichiarazioni sulla privacy devono corrispondere a ciò che i propri SDK raccolgono effettivamente
  • L'informazione di contatto e le note dell'App Review dovrebbero essere complete nella prima sottoscrizione
  • I credenziali del demo devono rimanere valide per tutta la finestra di revisione

4. Prontezza della sottoscrizione

  • Apple aggiorna regolarmente i requisiti minimi SDK, quindi conferma la scadenza corrente prima di caricare una versione di rilascio
  • TestFlight è il luogo più sicuro per verificare l'esatto percorso del revisore prima di sottoscrivere
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>
);
}
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>
);
}

Se il tuo App viene Rifiutato

Se la tua App viene rifiutata
  1. Leggi attentamente la motivazione del rifiuto

    • Nota la specifica norma citata (ad esempio, 3.1.1, 5.1.1)
    • Capisci esattamente cosa Apple ha segnalato
  2. Risolve il problema in modo approfondito

    • Non solo ripara - risolvi la causa radice
    • Testa estensivamente la soluzione
    • Documenta le modifiche apportate
  3. Rispondi nel Centro Risoluzione

    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. Risubmetti prontamente

    • Le risubmissioni vengono solitamente esaminate più velocemente
    • Di solito entro 24 ore

Se ritiene che la rifiutazione sia errata:

Procedura di chiarimento per l'App Store

  1. Clicca su “Appello” in App Store Connect
  2. Fornisci prove chiare:
    • Screenshot che mostrano la conformità
    • Riferimenti a specifiche linee guida
    • Spiegazione di come si soddisfano i requisiti
  3. Sii professionale e fattuale
  4. Includere un account di prova se la funzionalità è difficile da trovare

Esempio di richiesta di documenti

Se hai ancora problemi:

Stai lottando con la revisione dell'app o hai bisogno di assistenza personalizzata? Prenota una chiamata di consultazione con il nostro team per un supporto dedicato con:

  • Revisione e ottimizzazione dell'implementazione IAP
  • Preparazione e strategia per la revisione dell'App Store
  • Revisione della checklist di sottoscrizione
  • Risoluzione delle rimostranze e ricorsi di rifiuto
  • Test e validazione completi

I nostri esperti hanno già aiutato centinaia di app a superare la revisione!

Continua da iOS App Store Review Guidelines per IAP

Sezione intitolata “Continua da iOS App Store Review Guidelines per IAP”

Se stai utilizzando iOS App Store Review Guidelines per IAP per pianificare l'approvazione e la distribuzione della store, connettilo con Utilizza @capgo/native-purchases per la capacità nativa in Utilizzare @capgo/native-purchases, @capgo/capacitor-in-app-review per il dettaglio di implementazione in @capgo/capacitor-in-app-review, Utilizzare @capgo/capacitor-in-app-review per la capacità nativa in Utilizzare @capgo/capacitor-in-app-review, @capgo/capacitor-native-market per il dettaglio di implementazione in @capgo/capacitor-native-market, e Utilizzare @capgo/capacitor-native-market per la capacità nativa in Utilizzare @capgo/capacitor-native-market.