Linee guida dell'App Store per gli acquisti in-app
Copia un prompt di configurazione con i passaggi di installazione e la guida markdown completa per questo plugin.
Ottenere l'approvazione della tua app sull'App Store richiede un'attenzione scrupolosa alle linee guida di Apple, soprattutto quando si implementano acquisti in-app e abbonamenti. Questa guida copre tutto ciò che devi sapere per superare la revisione al primo invio.

Prima dell'invio
Sezione intitolata “Prima dell'invio”Completa la configurazione di App Store Connect
Sezione intitolata “Completa la configurazione di App Store Connect”Prima che Apple revisioni il tuo flusso di acquisto, assicurati che la scheda dell'app sia completa:
- Aggiungi un URL della Privacy Policy in App Store Connect
- Aggiungi un URL di supporto che rimandi a informazioni di contatto reali per gli utenti
- Completa la age rating questionario per rendere l'app pubblicabile
- Aggiungi Contatti per la revisione dell'app e note chiare per i revisori
- Se è richiesto il login, fornisci un account demo che non scade durante la revisione
Prepara screenshot reali
Sezione intitolata “Prepara screenshot reali”- Usa gli screenshot attuali della build reale in fase di revisione
- Per iPhone,
1290 x 2796(6.7 pollici) è la dimensione predefinita più semplice - Se la tua app gira su iPad, carica anche gli screenshot per iPad
- Le dimensioni iPad più grandi attualmente accettate includono
2064 x 2752(13 pollici) e2048 x 2732(12.9 pollici) - Non distorcere mai gli screenshot di iPhone per simulare il supporto iPad
Simula il percorso del revisore in TestFlight
Sezione: “Simula il percorso del revisore con TestFlight”Esegui l'esatto percorso che Apple seguirà su un dispositivo reale:
- Installa l'ultima build da TestFlight
- Effettua l'accesso con l'account di revisione che intendi fornire
- Raggiungi il paywall senza gesture nascoste o menu di debug
- Completa i flussi di acquisto, ripristino e gestione abbonamento
- Verifica che l'app funzioni correttamente anche se i permessi sono negati
Requisiti per gli In-App Purchase
Sezione: “Requisiti per gli acquisti in-app”Trasparenza dei prezzi (Critico)
Sezione: “Trasparenza dei prezzi (Critica)”Apple richiede una trasparenza totale sui prezzi prima di ogni acquisto:
Elementi indispensabili:
- Mostra il prezzo esatto prima del tasto di acquisto
- Indica la frequenza di fatturazione (es. “9,99 $/mese”)
- Specifica chiaramente cosa ottiene l'utente con il pagamento
- Indica quando avverranno gli addebiti
Motivo comune di rifiuto:
“Il prezzo dell'abbonamento deve essere chiaro e immediato.”
:::caution Coerenza dei prezzi Tutti i prezzi devono corrispondere in:
- Metadati della scheda sull'App Store
- Schermate di acquisto in-app
- Schermate di gestione abbonamenti
Anche una discrepanza di soli 1 $ tra la scheda dello store ($4,99) e l'app ($5,99) causerà il rifiuto automatico.
Presentazione dei piani di abbonamento
Sezione intitolata “Presentazione dei piani di abbonamento”Informativa obbligatoria:
- Tutti i livelli di abbonamento disponibili mostrati insieme
- Confronto chiaro delle feature per ogni livello
- Nessuna preselezione automatica dei piani premium tramite trucchi di UI
- Istruzioni di cancellazione facili da trovare

Esempio di UI conforme:
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> );}Ripristina acquisti
Sezione intitolata “Ripristina acquisti”Implementazione richiesta:
Ogni app con IAP deve offrire agli utenti un modo per ripristinare gli acquisti precedenti senza contattare l'assistenza.
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>Motivi comuni di rifiuto
Sezione intitolata “Motivi comuni di rifiuto”1. Crash dell'app o funzionalità non funzionanti
Sezione intitolata “1. Crash dell'app o malfunzionamenti”Perché viene rifiutato:
- L'app crasha all'avvio
- Il flusso di acquisto non va a buon fine
- Le funzioni negli screenshot non funzionano
Prevenzione:
- Testa su dispositivi reali (non solo simulatori)
- Testa tutti i flussi di abbonamento end-to-end
- Verifica la validazione degli scontrini
- Controlla la gestione degli errori di rete
2. Incongruenze nei metadati
Sezione intitolata “2. Incongruenze dei metadati”Perché viene rifiutato:
- Gli screenshot mostrano funzioni non presenti nel build
- La descrizione cita funzioni inesistenti
- Il prezzo nei metadati non corrisponde a quello in-app

Prevenzione:
// Document exactly what's in each tierconst 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 description3. Spiegazioni mancanti sui permessi
Sezione intitolata “3. Spiegazioni mancanti sui permessi”Perché viene rifiutato:
- Richiedere fotocamera/posizione/salute senza spiegazione
- Richieste di permessi nascoste dopo varie schermate
- Descrizioni dei permessi vaghe o generiche
Prevenzione:
Aggiorna il tuo Info.plist con spiegazioni 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>4. Marketing ingannevole
Sezione intitolata “4. Marketing ingannevole”Perché viene rifiutato:
- Affermazioni come “l'app n. 1 al mondo” senza prove
- Funzioni “illimitate” che hanno limiti nascosti
- Tattiche di falsa urgenza (“Solo 2 posti rimasti!”)


Prevenzione:
- Sii specifico e basati sui fatti
- Evita superlativi senza prove
- Non forzare l'utente con falsa scarsità
5. Procedura di cancellazione nascosta
Sezione: “5. Processo di cancellazione nascosto”Perché viene rifiutato:
- Nessuna indicazione su come cancellare
- Pulsante di cancellazione nascosto o poco visibile
- Processo di cancellazione multi-step senza il flow nativo di Apple
Prevenzione:
// Always inform users about cancellationfunction 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();}Privacy & Utilizzo dei Dati (Sezione 5.1.1)
Sezione intitolata “Privacy & Utilizzo dei Dati (Sezione 5.1.1)”Nel 2025, Apple ha inasprito sensibilmente i requisiti sulla privacy.
Informative obbligatorie
Sezione intitolata “Informativa Obbligatoria”Per ogni permesso:
- Perché è necessario (caso d'uso specifico)
- Quando verrà utilizzato
- Come i dati vengono salvati/condivisi
- Se è opzionale o obbligatorio
Esempio: Flusso di Permessi Corretto
Sezione intitolata “Esempio: Flusso di Permessi Corretto”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';}Etichette sulla privacy (Privacy Nutrition Labels)
Sezione intitolata “Privacy Nutrition Labels”Assicurati che le privacy label dell'App Store riflettano accuratamente:
- Raccolta della cronologia acquisti
- Indirizzi email (per le ricevute)
- ID dispositivo (per la prevenzione delle frodi)
- Dati di utilizzo (per l'analytics)
Privacy label inaccurate sono un comune motivo di rifiuto nel 2025. Verifica attentamente la raccolta dei dati.
Checklist pre-invio
Sezione intitolata “Checklist pre-invio”
-
Testa tutti i flussi di acquisto
- Acquista ogni livello di abbonamento
- Testa i periodi di prova gratuiti
- Verifica l'applicazione delle offerte introduttive
- Testa la funzionalità di ripristino
- Verifica il Family Sharing (se attivo)
- Testa su più dispositivi
-
Verifica la coerenza dei prezzi
- Verifica che i metadati dell'App Store corrispondano ai prezzi in-app
- Verifica che tutte le valute siano corrette
- Conferma che la durata delle prove gratuite sia corretta
- Controlla l'accuratezza dei termini dell'offerta introduttiva
-
Revisione di tutti i testi
- Rimuovere il testo segnaposto
- Verificare che le affermazioni siano testabili
- Controllare grammatica e ortografia
- Ensure descriptions match current build
- Rimuovere i riferimenti ai competitor
-
Testare i permessi
- Richiedere solo i permessi necessari
- Mostrare spiegazioni chiare prima della richiesta
- Testa i flussi di "Deny" (l'app deve continuare a funzionare)
- Verificare che le descrizioni in Info.plist siano chiare
-
Preparare l'account di test
- Crea un account di test valido per tutta la revisione
- Inserisci le credenziali di login nelle info di App Review
- Verifica che il revisore acceda al paywall e completi l'acquisto
- Aggiungi account extra o switch nel campo Notes, se necessario
-
Controlla i Metadati
- Gli screenshot corrispondono alla UI attuale
- L'URL di supporto contiene contatti reali
- L'URL della privacy policy è compilato
- Il rating dell'età è coerente con il build
- Il video preview (se presente) mostra la versione attuale
- La descrizione riporta correttamente le feature
- La privacy policy è accessibile dall'app e dallo store
-
Scrivi note dettagliate per la revisione
Contact:Name: Jane DeveloperEmail: review@yourapp.comPhone: +1 555-0100Test Account:Email: reviewer@test.comPassword: TestPass123!This account does not expire during review.Testing Instructions:1. Log in with test account above2. Tap "Upgrade to Premium" button3. Select "Monthly Premium" subscription4. Complete purchase (no charge in sandbox)5. Verify premium features unlockNote: Subscription pricing is clearly shown before purchase.Cancellation instructions are in Settings > Account.
Timeline della revisione
Sezione intitolata “Timeline di revisione”
Revisione standard: 24-48 ore Periodi di picco: 3-5 giorni (rilasci festivi App Store) Weekend: Nessuna revisione in corso Revisione accelerata: Disponibile per bug critici (richiesta tramite App Store Connect)
Stati comuni che vedrai in App Store Connect:
Waiting for ReviewIn ReviewPending Developer ReleaseRejected
Focus Sottomissioni 2026
Sezione intitolata “Focus Sottomissioni 2026”Aree di Focus Attuali
Sezione intitolata “Aree di Focus Attuali”1. Chiarezza degli Abbonamenti
- Confronto affiancato dei piani richiesto
- Nessun “dark pattern” per nascondere opzioni più economiche
- Percorsi di downgrade/upgrade chiari
2. Accuratezza dei metadati
- Gli screenshot devono corrispondere alla build in revisione
- Sono richiesti screenshot per iPad se il supporto iPad è attivo
- L'URL di supporto e la privacy policy devono essere già online prima dell'invio
3. Qualità della privacy e dei dettagli di revisione
- Le informative privacy devono corrispondere a ciò che gli SDK raccolgono davvero
- I contatti e le note per l'App Review devono essere completi già al primo invio
- Le credenziali demo devono rimanere valide per tutta la durata della revisione
4. Preparazione all'invio
- Apple aggiorna regolarmente i requisiti minimi di SDK, quindi verifica la scadenza attuale prima di caricare una release build
- TestFlight è il modo più sicuro per verificare il percorso esatto del revisore prima dell'invio
Best practice per il plugin Native Purchases
Sezione intitolata “Best practice per il plugin Native Purchases”Implementa una corretta gestione degli errori
Sezione intitolata “Implementa una corretta gestione degli errori”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.'); } }}Mostra gli stati di caricamento
Sezione intitolata “Mostra gli stati di caricamento”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> );}Mostra chiaramente i termini
Sezione intitolata “Mostra chiaramente i termini”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> );}Cosa fare se l'app viene rifiutata
Sezione: “Se la tua app viene rifiutata”Passaggi per risolvere
Sezione: “Passaggi per risolvere”-
Leggi attentamente il rifiuto
- Prendi nota della linea guida citata (es. 3.1.1, 5.1.1)
- Capisci esattamente cosa ha segnalato Apple
-
Risolvi il problema in modo approfondito
- Don’t just patch - fix root cause
- Testa la correzione in modo approfondito
- Documenta ogni modifica apportata
-
Rispondi tramite il Resolution Center
Thank you for your feedback. I have addressed the issue:Issue: Subscription pricing not clear upfrontFix: Added explicit pricing display on subscription selectionscreen showing "$9.99/month" before purchase button. Also addedcancellation instructions on the same screen.The changes are in this submission and can be tested using theprovided test account. -
Ripresenta subito
- Le nuove submission vengono riviste più in fretta
- In genere entro 24 ore
Procedura di ricorso
Sezione intitolata “Procedura di ricorso”Se ritieni che il rifiuto sia errato:

- Clicca su “Appeal” in App Store Connect
- Fornisci prove chiare:
- Screenshot che dimostrano la conformità
- Riferimenti a linee guida specifiche
- Spiegazione di come soddisfi i requisiti
- Sii professionale e concreto
- Includi un account di test se la funzionalità è difficile da trovare

Risorse aggiuntive
Sezione “Risorse aggiuntive”- Linee guida per la revisione dell'App Store
- Linee guida per gli acquisti in-app
- Best practice per gli abbonamenti
- Guida di App Store Connect
- Specifiche degli screenshot
- Informazioni sulla versione della piattaforma
Supporto
Sezione intitolata “Supporto”Se riscontri ancora problemi:
- Consulta l' Documentazione Native Purchases
- Verifica problemi comuni di troubleshooting
- Contatta Apple Developer Support per chiarimenti sulle linee guida
Ti serve aiuto da un esperto?
Sezione intitolata “Serve l'aiuto di un esperto?”Hai difficoltà con la revisione dell'app o ti serve assistenza personalizzata? Prenota una call di consulenza con il nostro team per supporto dedicato su:
- Revisione e ottimizzazione IAP
- Strategia e preparazione per l'App Store
- Checklist per la sottomissione
- Risoluzione rifiuti e ricorsi
- Testing e validazione completi
I nostri esperti hanno aiutato centinaia di app a superare la review!
Approfondisci le iOS App Store Review Guidelines per IAP
Sezione intitolata “Approfondisci le iOS App Store Review Guidelines per IAP”Se stai usando iOS App Store Review Guidelines per IAP per pianificare l'approvazione e la distribuzione negli store, collegalo a Utilizzo di @capgo/native-purchases per la funzionalità nativa in Utilizzo di @capgo/native-purchases, @capgo/capacitor-in-app-review per i dettagli di implementazione in @capgo/capacitor-in-app-review, Utilizzo di @capgo/capacitor-in-app-review per la funzionalità nativa in Utilizzo di @capgo/capacitor-in-app-review, @capgo/capacitor-native-market per i dettagli di implementazione in @capgo/capacitor-native-market, e Utilizzo di @capgo/capacitor-native-market per la funzionalità nativa in Utilizzo di @capgo/capacitor-native-market.