Vai al contenuto

Linee guida dell'App Store per gli acquisti in-app

GitHub

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.

Processo di revisione dell'App Store iOS

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
Metadati della scheda App Store con link a policy e supporto
  • 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) e 2048 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.

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

Cosa fare e non fare nel design della UI

Paywall con ripristino acquisti e link legali

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

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>

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

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

Checklist 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é 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:

Testo dei permessi troppo vago per la revisione Testo dei permessi 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é 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!”)

Linee guida, descrizioni ed esempi

Ulteriori linee guida per la descrizione

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

Nel 2025, Apple ha inasprito sensibilmente i requisiti sulla privacy.

Per ogni permesso:

  1. Perché è necessario (caso d'uso specifico)
  2. Quando verrà utilizzato
  3. Come i dati vengono salvati/condivisi
  4. Se è opzionale 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';
}

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

  1. 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
  2. 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
  3. 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
  4. 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
  5. 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
  6. 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
  7. Scrivi note dettagliate per la revisione

    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.

Timeline di revisione App Store

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 Review
  • In Review
  • Pending Developer Release
  • Rejected

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

Cosa fare se l'app viene rifiutata

Sezione: “Se la tua app viene rifiutata”
  1. Leggi attentamente il rifiuto

    • Prendi nota della linea guida citata (es. 3.1.1, 5.1.1)
    • Capisci esattamente cosa ha segnalato Apple
  2. Risolvi il problema in modo approfondito

    • Don’t just patch - fix root cause
    • Testa la correzione in modo approfondito
    • Documenta ogni modifica apportata
  3. Rispondi tramite il Resolution Center

    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. Ripresenta subito

    • Le nuove submission vengono riviste più in fretta
    • In genere entro 24 ore

Se ritieni che il rifiuto sia errato:

Procedura di chiarimento App Store

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

Esempio di richiesta di documenti

Se riscontri ancora problemi:

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.