[iOs] In-App Purchases: come far acquistare dalle nostre app

Volete inserire nelle apps per iOs la possibilità di far acquistare ai vostri utenti contenuti extra di qualsiasi genere (siano essi video, brani audio, ebook, …), ovviamente tutti non protetti da copyright o di cui voi siate proprietari?

Siete obbligatori a utilizzare e rispettare il programma In-App Purchase (IAP) della Apple, di cui vi linko la guida ufficiale: In-App Purchase Programming Guide.

Attenzione. Nelle guidelines di Apple, di cui ho scritto anche un post a questo link, si legge:

11.2 Le apps che utilizzano un sistema differente dalle In App Purchase API (IAP) per acquistare contenuti, funzionalità o servizi nell’app, non vengono accettate

Non potete, dunque, inserire altre modalità di pagamento per i contenuti delle vostre app, di nessun tipo (siano esse PayPal o sistemi esterni di pagamento), se questi contenuti vengono utilizzati direttamente nella vostra app (per esempio, brani audio scaricati, e-book da leggere attraverso l’app stessa, ecc.). Inoltre, questo stesso punto di applica a contenuti “virtuali”, come crediti, bonus, punti, ricariche, …

Quando si può acquistare tramite sistemi differenti per il pagamento (come PayPal) direttamente nelle nostre app ?

Ce lo dice il punto 11.3 delle linee guida:

11.3 Apps using IAP to purchase physical goods or goods and services used outside of the application will be rejected

Non possiamo usare In-App Purchases di Apple quando si tratta di far acquistare beni reali (physical goods) o beni e servizi che vengono usati esternamente all’app. Faccio un esempio: un catalogo di prodotti che vengono venduti da un negozio (sia esso fisico o online), oppure se volete far acquistare un servizio (spedizione di un prodotto comprato ad un cliente, …). Qui dovete utilizzare un sistema esterno per i pagamenti, come PayPal o bonifico.

 

Continuando, nelle linee guida sta anche scritto:

11.14 Le apps possono leggere o riprodurre contenuti (specificamente riviste, giornali, libri, audio, musica e video) ottenuti attraverso sottoscrizione o acquisto al di fuori dall’app, purché l’acquisto stesso non avvenga con un bottone o fornendo un link esterno nell’app per acquistare il contenuto approvato. Apple non chiede porzioni di “revenue“  (introiti) per gli acquisti approvati, acquistati o ottenuti con metodi esterni all’app

 

Apple obbliga gli sviluppatori ad iscriversi al programma IAP per ricavare il 30% degli introiti sulle vendite dei vostri contenuti fruibili attraverso l’app. La cosa assurda è che si vedono, comunque, apps sullo store che permettono anche altre modalità di pagamento (vedi Ebay e Amazon) per l’acquisto di prodotti di qualsiasi genere (siano essi reali o virtuali). Sarà che esistono degli accordi “sotto banco” tra Apple e queste grandi società? Oppure esistono degli “escamotage” per aggirare questo grosso vincolo di Apple? (sembrerebbe che Amazon abbia adottato un sistema di “workaround“, che onestamente non mi convince … Amazon ByPasses the iOs Commission Requirement).

Vi dirò che in un’app avevo inserito come modalità di pagamento PayPal, utilizzando le istruzioni presenti negli articoli scritti su questo blog su OsCommerce e PayPal Express. La Apple mi ha bocciato l’app per non aver rispettato il punto 11.2 suddetto, in quanto la mia app fa acquistare contenuti audio che poi vengono riprodotti nel player interno dell’app stessa.

A quel punto ho iniziato a studiare ed implementare il sistema di pagamento In-App Purchases di Apple, di cui vi allego un pò di articoli utili, alcuni dei quali mi sono serviti per risolvere non pochi problemi che mi hanno portato via un bel pò di settimane di lavoro.

RIFERIMENTI UTILI:

Di seguito vi riporto i passi da seguire per inserire gli In-App Purchases nelle vostre app.

Passo 1 – Creazione del “catalogo” degli in-app purchases. Il primo passo che occorre seguire è quello della creazione dell’App ID associato alla vostra app. Basta accedere alla pagina del vostro account da sviluppatore: https://developer.apple.com/membercenter/index.action, e inserire nella sezione iOs Profisioning Portal, un App ID per la vostra app – ad esempio, com.mydomain.MyAppName).

Questo App ID è molto importante e deve essere univoco (non esisteranno altre app in Apple Store con lo stesso App ID) e verrà utilizzato anche per creare i singoli contenuti del vostro catalogo acquisti. Nota. Non utilizzare il carattere wildcard (*) nel vostro App ID!

Dopo aver creato l’App ID, occorre assicurarsi che il flag “In-App Purchase“, nella sezione App IDs del vostro account da sviluppatore, sia abilitato (sia per l’ambiente di sviluppo che per quello di produzione) e generare i certificati necessari da importare su XCode:

Passo 2 – Registrazione del catalogo acquisti. Per la creazione del catalogo con i vostri contenuti da vendere, occorre accedere al vostro iTunesConnect e, in corrispondenza della vostra app (se non esiste, occorre crearla con “Add New App” in “Manage Your Applications“, seguendo le istruzioni e associandola, ovviamente, all’App ID generato al Passo 1), dovete selezionare il pulsante “Manage In-App Purchases“:

Qui, troverete il tasto “Create New”, con una serie di informazioni da inserire, tra cui l’ In-App Purchase Type“, ossia:

  • Consumable: un acquisto di questa tipologia viene pagato ogni volta che viene scaricato dall’utente, anche se è stato già acquistato precedentemente;
  • Non-Consumable: un acquisto “non consumabile” viene acquistato una sola volta e può essere scaricato più volte dall’utente, anche da dispositivi diversi (con le credenziali di App Store). Io ho utilizzato questa tipologia;
  • Auto-renewable Subscriptions: permette agli utenti di acquistare aggiornamenti o contenuti dinamici per un certo intervallo di tempo. E’ una sorta di abbonamento, molto utile per la vendita di riviste o ebook.
  • Free Subscription: fornisce un modo per rilasciare abbonamenti gratuiti per contenuti nell’Edicola (NewsStand). Quando un utente si registra ad una “free subscription”, i contenuti sono disponibili su più dispositivi (previa login con le proprie credenziali). Le “free subscriptions” non scadono e possono essere distribuite solo in apps che hanno le NewsStand abilitate;
  • Non-Renewing Subscriptions: è una tipologia utile per la vendita di servizi in un periodo di tempo limitato.

Andando avanti, occorre seguire le istruzioni per completare l’inserimento del singolo articolo del vostro catalogo. Io ho inserito tutti prodotti di tipo “non consumabile”, perché nella mia app ci sono brani audio da distribuire che vengono acquistati soltanto una volta dagli utenti e scaricati quante volte vogliono e da qualsiasi dispositivo su cui si loggano con  il proprio Apple ID. Una cosa molto importante da inserire nella fase di creazione del vostro In-App Purchase è il Product ID. Questo deve essere univoco e composto nel seguente modo:

App ID + nome prodotto

(per esempio, se il vostro App ID è com.mydomain.MyAppName allora ProductID=com.mydomain.MyAppName.nomeProdotto)

Se non lo scrivete in questo modo, vi darà un bel pò di problemi. Per maggiori dettagli, vi invito a leggere i riferimenti che vi ho linkato precedentemente.

Passo 3 – Scrittura del codice con le In-App Purchase API. Scriviamo ora il nostro codice, utilizzando il validissimo riferimento che vi ho già linkato:

Importate nel vostro progetto lo StoreKit Frameworkossia le In-App Purchase API che vi permetteranno di implementare la logica transazionale degli acquisti. Non vi scrivo qui il codice, perché basta seguire l’articolo precedente, dove vi trovate anche un progetto di prova da scaricare.

Nota 1. Nell’articolo si legge che lo StoreKit Framework non funziona nel simulatore: in realtà, funziona in parte. A me è capitato di riuscire a fare gli acquisti, ma non il restore degli stessi (ossia, la seconda volta che acquistavo un prodotto, mi visualizza un messaggio di popup di errore nel simulatore).

Nota 2. L’ambiente di test (il Simulatore o il vostro device su cui deployate l’app da XCode) è il vostro ambiente di sandbox. Per simulare gli acquisti, occorre creare degli utenti di test: loggatevi sul vostro account di  iTunesConnect e nella sezione “Manage Users” create i vostri Test Users (un test user è associato ad una nazione per poter simulare l’acquisto dall’Apple Store di quella specifica nazione).

Nota 3. Se avete un iPhone jailbreakato su cui testare le IAP vi dico subito che non funzionano. Vi genera un errore all’atto del download della lista dei prodotti. Leggete il seguente articolo e rispondete a tutte le domande: Invalid Product IDs.
Nota 4. Per poter testare le IAP occorre fare l’upload del binario della vostra app, anche se non è pronta. Tanto potete sempre fare il “Reject Binary“. L’importante è che ci sia un binario caricato sul sito della Apple, come si legge al Passo 5 dell’articolo seguente: In App Purchases: A Full Walkthrough.

Passo 4 –  Restore In-App Purchases. Se avete scelto le tipologie di acquisti per cui occorre fornire un meccanismo di restoring da parte dell’utente (come i prodotti “non consumabili” e “consumabili”), in modo che in seguito ad un ripristino del dispositivo, per esempio, si possa recuperare quanto già acquistato, occorre fornire attraverso le vostre app una interfaccia con tale funzionalità ai vostri utenti. Anzi, Apple “obbliga” ad inserire la logica di restoring degli In-App Purchases, da quanto si legge nella nota che mi hanno inviato dopo un primo rifiuto della mia app che questa funzionalità non aveva:

In App Purchase. Lastly, while your app offers In-App Purchase(s) that can be restored, it does not include the required “Restore” feature to allow users to restore the previously purchased In-App Purchase(s), as specified in Restoring Transactions section of the In-App Purchase Programming Guide:

“…if your application supports product types that must be restorable, you must include an interface that allows users to restore these purchases. This interface allows a user to add the product to other devices or, if the original device was wiped, to restore the transaction on the original device.”

To restore previously purchased In-App Purchase products, it would be appropriate to provide a “Restore” button and initiate the restore process when the “Restore” button is tapped by the user.

Sicché ho inserito una TableView con la lista degli acquisti dell’utente e un bottone “Restore“, utilizzando i due riferimenti già linkati in precedenza:

  

11 pensieri su “[iOs] In-App Purchases: come far acquistare dalle nostre app

    • Ciao Massimo,

      innanzitutto complimenti per l’app F1 Matrix.
      Mi ero fatto anche io il problema della pubblicazione degli in-app purchases free in promozione. A malincuore posso dirti che non esiste la possibilità di settarli a meno di 0.99 dollari (Tier 1).

      Leggi qui: http://support.apple.com/kb/ht4009

      “In-App Purchase can be offered in both free and paid apps—no free In-App Purchases are available.

      You cannot set your in-app purchase FREE and then change it to paid, because you cannot set an in-app purchase price less than $0.99”.

      Mi sa che occorre gestire il tutto programmaticamente.

      Infatti, nel pannello di amministrazione degli in-app purchases in iTunesConnect (Manage In-App Purchases), per ciascuna voce del catalogo, si vede solo la sezione ‘Pricing and Availability’. Qui è possibile decidere il prezzo del singolo in-app purchase, la data di validità di tale prezzo (quindi la possibilità di schedulare più date con relativi prezzi).

      Le strane scelte di Apple!

  1. Ciao.. non ho ancora letto la guida ma ti ringrazio infinitamente già da ora!! è la prima ed unica guida in italiano che ho trovato sull’in app purchase….

  2. Ciao,
    posso farti una domanda? la guida è perfetta, grande.
    ma ho un problemino. Creando nel connect l’utente test nel momento in cui ‘sblocco’ la mia app mi viene detto che ‘l’utente non è mai stato utilizzato nello store’ e successivamente mi viene chiesto il metodo di pagamento.
    Essendo un utente di test come posso saltare questo passaggio?
    Grazie

    • Ciao Emiliano, prova innanzitutto a disconnetterti dall’iTunes Store sul tuo iPhone/iPad: IMPOSTAZIONI>>iTunesStore e AppStore>>ID Apple>>Esci

      Quando testi le IAP non devi avere mai un utente loggato ad iTunesStore.

      Per poter testare le IAP in modalità sandbox devi poi, ovviamente, essere connesso in USB ad xCode e lanciare l’app da lì.

      Quando esegui l’app ti chiederà di loggarti con le credenziali dell’account dell’utente di test. Fammi sapere se hai problemi.

  3. Grande, complimenti per l’ottima analisi.
    Ho problemi però nel gestire, in special modo nel restore, di contenuti hostati da Apple.
    Quindi premo restore, le transazioni vengono ripetute con successo ma non parte il restore dei download.
    Mi chiedevo se tu avessi già affrontato questo aspetto e come lo avresti risolto.

    Ciao grazie è ancora complimenti,
    Luciano

  4. Ciao,
    ho intenzione di fare una app con all’interno dei brani audio (meditazioni) da acquistare separatamente, esattamente nella modalità in-app come descritto da te.
    Ho dato uno sguardo molto veloce al tuo articolo e l’ho trovato comunque molto dettagliato ed esauriente.
    La mia domanda è: l’articolo originale è un po’ vecchiotto, le istruzioni che dai sono comunque valide ancora oggi? Sai se sono state fatte delle modifiche nel frattempo nella piattaforma di sviluppo Apple e/o nella gestione dei prodotti nel proprio catalogo?
    Grazie mille !

    Simone

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *


× tre = 6