In-app purchases iOS: implementazione

In-app purchases iOS: implementazione

Gli in-app purchase su iOS sono uno dei flussi più delicati per un'app: gestiscono pagamenti reali e devono rispettare regole stringenti di Apple. Con StoreKit 2 (iOS 15+) il codice diventa molto più semplice grazie a Swift async/await e ai tipi nativi per transazioni e prodotti.

Tipi di prodotto

Consumable (es. monete in-app), non-consumable (es. funzionalita premium una tantum), auto-renewable subscription (abbonamenti), non-renewable subscription. La distinzione e fondamentale per come gestire lo storage del diritto utente: i consumable scompaiono dopo l'uso, i non-consumable e gli abbonamenti devono essere ripristinabili.

StoreKit 2 in pratica

Carica i prodotti con Product.products(for:), avvia un'acquisto con product.purchase(), gestisci il VerificationResult per validare la transazione. Il verification result include un JWS firmato che il tuo backend puo validare tramite la libreria App Store Server.

Verifica server-side

Non fidarti mai del client: ogni acquisto va verificato con l'App Store Server API. Apple fornisce endpoint per validare ricevute, controllare stato abbonamento e gestire refund. Implementa anche un webhook per le App Store Server Notifications V2 (rinnovi, cancellazioni, refund).

Server-to-Server Notifications V2

Apple invia eventi server-to-server su una URL configurata in App Store Connect: rinnovi, refund, grace period, expire, revoke. Configura il webhook fin dal day 1: senza, non puoi reagire a refund o cancellazioni se non con polling. Il payload e firmato con JWT, da verificare con la chiave pubblica Apple.

Offer code e promotional offer

Apple permette tre tipi di sconto: introductory offer (per nuovi sottoscrittori), promotional offer (per esistenti che riattivano), offer code (per marketing campaign). Configurali nel App Store Connect e gestiscili nel client con SKPaymentDiscount. Strumento potente per retention e win-back.

Family Sharing

Da iOS 14, gli IAP non-consumable e abbonamenti possono essere condivisi via Family Sharing. Abilita il flag in App Store Connect. Lato client, la transaction history espone le purchase del Family Organizer. Importante: la tua logica server-side deve gestire il caso in cui due Apple ID accedono allo stesso entitlement.

App Store Server API

API REST per query lo stato abbonamenti, refund, history. Necessaria per backend che gestiscono entitlement. Autenticazione via JWT firmato con .p8. Endpoints: getTransactionInfo, getSubscriptionStatus, lookupOrder. Sostituisce le vecchie ricevute Base64 di StoreKit 1.

Cancellazione account e revoke

Apple richiede che gli abbonamenti possano essere annullati dall'app o gestiti chiaramente. La cancellazione richiede di indirizzare l'utente alle Settings di iOS dove e gestita ufficialmente. Il revoke (cancellazione + refund) puo essere fatto solo via Apple Support, non dal developer. Documenta questo limite nel customer support workflow.

Win-back e re-engagement

Win-back offers sono offerte speciali per utenti che hanno cancellato l'abbonamento, mostrate quando tornano sull'app. Promotional offers sono per esistenti utenti con scopi vari (downgrade prevention, cross-sell). Configurali in App Store Connect e includili nello SKPaymentDiscount lato client. ROI tipicamente alto su segmenti di valore.

Procedura passo-passo

  1. Crea i prodotti in App Store Connect (consumable, abbonamento, ecc.).
  2. Compila i metadata localizzati e i prezzi per ogni territorio.
  3. Implementa StoreKit 2 nel client: caricamento prodotti, acquisto, restore.
  4. Salva il JWS sul backend ad ogni acquisto valido.
  5. Verifica le ricevute con App Store Server API.
  6. Configura le App Store Server Notifications V2 per eventi server-to-server.
  7. Testa in sandbox con un'account tester dedicato.

Sandbox testing best practice

Crea sandbox tester accounts in App Store Connect con email diverse (no Apple ID reali). Logout dell'Apple ID da Settings, login con sandbox account quando l'app prompt. Sandbox accelera tempi: 1 settimana = pochi minuti, 1 anno = 1 ora. Test esaustivamente: nuovo acquisto, restore, downgrade, upgrade, cancellazione, refund. Documenta tutti i casi per QA.

Errori comuni e come risolverli

  • Prodotti non caricati: verifica che siano approvati e abilitati per il paese tester.
  • Sandbox loop: il sandbox account a volte richiede di accettare termini ripetutamente.
  • Manca restore: obbligatorio per abbonamenti e non-consumable.
  • Mancata validazione server: rischio frodi e rejection.
  • Subscription group sbagliato: impedisce upgrade/downgrade corretti.

Domande frequenti

D: Posso usare Stripe per beni digitali?
R: No, Apple richiede StoreKit per beni e servizi digitali consumati nell'app.

D: La commissione e sempre il 30%?
R: Dopo il primo anno di abbonamento scende al 15%, e per i Small Business Program e 15% fin da subito.

D: Posso offrire prove gratuite?
R: Si, con introductory offer o promotional offer su abbonamenti.

D: Posso vendere consumable a prezzi variabili?
R: No, ogni prodotto iOS ha prezzo fisso definito in App Store Connect. Usa multipli prodotti per pricing tiers.

Strategie pricing

Definisci prezzi locali per regione (Apple supporta tier predefiniti). Considera psicologia (3.99 vs 4.00). Annuale con sconto vs mensile per maggior conversion. Trial gratuito per ridurre friction iniziale. Win-back offer per ridurre churn. A/B test pricing con tool come RevenueCat per ottimizzare ARPU.

Strumenti come RevenueCat, Adapty, Qonversion semplificano enormemente la gestione di IAP cross-platform astraendo StoreKit e Google Billing dietro un'unica API. Forniscono dashboard analytics unificati, A/B testing pricing, web hook per eventi, gestione subscription. ROI alto per team che vogliono focus su prodotto invece di plumbing.

Hai bisogno di aiuto?

Se vuoi sviluppare la tua app con G Tech Group, scrivici tramite il modulo di contatto.

Hai trovato utile quest'articolo?