Acquisti In App: iOS in APP Purchase come sviluppare una soluzione completa

in-app-purchase-ios_come-fare_sviluppo_implementaziopneA prima vista, aggiungere alle nostre app la possibilità di acquisti in-app sembra essere una passeggiata di Salute. Apple, infatti, fornisce una vagonata di documentazione (About In-App Purchase or Itunes Connect dev guide) che dovrebbe permettere sviluppatori di preparare un’app con inAPP Purchase ben funzionante in poco tempo.

Ma nella realtà l’aggiunta di acquisti in-app non è così semplice da comprendere e da sviluppare. Apple fornisce una quantità enorme di documenti sugli acquisti in-app, ma bisogna perdere molto tempo per farsi delle idee chiare. All’interno della documentazione è difficile trovare menzione dei passaggi di configurazione che dovete prendere in considerazione per ottenere gli acquisti in-app perfettamente funzionanti.
Da nessuna parte sembra esserci una lista di controllo o un riferimento se la vostra integrazione di StoreKit non funziona. Da nessuna parte c’è un oggetto NSError che ti dice esattamente il motivo per cui l’ID del prodotto non è valido.

Quindi invece di perdere giorni di produttività per studiare la documentazione ufficiale e raccogliere tutti gli appunti abbiamo deciso di creare questo articolo in italiano , rielaborato da una libera traduzione del blog Backspace Prologue Mistakes and learnings of an iPhone developer di Troy Brant (http://troybrant.net/blog/2010/01/in-app-purchases-a-full-walkthrough/) al fine di far risparmiare tempo ad altri intrepidi Sviluppatori iOS. 

Panoramica sugli Acquisti In-App

Per iniziare è necessario dividere il lavoro in  due fasi distinte:

  1.      Creare e recuperare una descrizione del prodotto
  2.      Acquistare un prodotto


Il primo passo è dove probabilmente incorrere in diversi problemi. Una volta che si può recuperare con successo una descrizione del prodotto nel codice, dovremo scrivere il codice per l’acquisto del prodotto.
Affronteremo la descrizione del prodotto nella prima fase.

Creare e recuperare una descrizione del prodotto

Ecco una panoramica molto approssimativa di ogni passo necessario per creare un nuovo prodotto e prendere la sua descrizione (fetch a product description.):

 

  •      Creare un unico App ID
  •      Generare e installare un nuovo profilo di provisioning
  •      Aggiornare il bundle ID e il code signing profile in Xcode
  •      Se non l’hai già, submit your application metadata in iTunes Connect
  •      Aggiungi un nuovo prodotto per l’acquisto in-app
  •      Scrivere il codice per prelevare la descrizione del prodotto
  •      Attendere alcune ore

Nota: in passato era necessario anche sottomettere il binario, ora NON è necessario sottomettere il vostroapplication binary per ottenere il funzionamento del’In App Purchase  (IAP). Per maggiori informazioni vedere la domanda #4 nelle Apple FAQ  in questa pagina http://developer.apple.com/library/ios/#technotes/tn2259/_index.html

Il codice per prelevare una descrizione del prodotto è molto semplice. I passi di installazione, d’altra parte, sono pieni di insidie.

NOTA: non è necessario creare un utente di prova in-app in iTunes Connect per andare a prendere una descrizione del prodotto (fetch a product description.).

 

Creare un App ID univoco

Per supportare gli acquisti in-app, il vostro App ID non può includere alcun carattere jolly (*”). Per vedere se il vostro App ID contiene un jolly, accedere a http://developer.apple.com/iphone, e passare alla iPhone Developer Program Portal. Selezionare “App ID” dal menu a sinistra, e cercare il tuo ID App.

Questo è un ID App univoco :

8IOYUHMHV.com.i3factory.ammappa

Questo non è un ID App univoco :

8IOYUHMHV.com.i3factory. *

Se non si dispone di un ID App univoco , è necessario crearne uno come segue:

 

  1.      Nella scheda App ID nel portale per gli sviluppatori, selezionare “New App ID
  2.      Compilare le seguenti informazioni:

    • DISPLAY NAME (Nome visualizzato): Scegli un  nome App ID per che non si stava utilizzando prima. Non è possibile modificare o eliminare i vecchi App ID, quindi basta dare il vostro App ID un nuovo nome per evitare confusione.
    • PREFIX (Prefisso): Genera uno nuovo, o scegliere uno esistente se la vostra applicazione è uno di una suite di applicazioni che possono condividere dati tramite l’API Servizi Keychain (Keychain Services API)
    • SUFFIX  (Suffisso): com.companyname.appname (questo è il formato consueto danotare la mancanza di jolly)
  3.      Fare clic su “Save” (Salva” )   
  4.      Fare clic sul collegamento “Configure”  (Configura”) accanto al tuo App ID
  5.      Controllare casella accanto a “Enable In App Purchase
  6.      Fare clic su “Done” (Fine”)

 

Creare un nuovo profilo di provisioning

Ora che avete un nuovo App ID , è necessario generare un nuovo Provisioning Profile che punta al App ID.

Ecco qui la descrizione passo-passo per la generazione e l’installazione di un nuovo profilo di provisioning:

 

  1.      Nel iPhone Developer Portal, selezionare la scheda Provisioning a sinistra
  2.      Assicurasi di essere nella scheda di sviluppo (Development tab), e fare clic su “New Profile” (Nuovo profilo”) nell’angolo in alto a destra
  3.      Compilare le informazioni richieste, e puntare alla univoco App ID appena creata
  4.      Se vedi “Pending” (“In sospeso”) nella colonna Azioni, basta fare clic sul titolo della scheda di sviluppo (Development tab) per aggiornare
  5.      Fare clic su Download” per scaricare il nuovo profilo
  6.      Trascinare il profilo sull’icona Xcode nel Dock per installarlo
  7.      In alternativa, se si desidera conservare il nome del profilo di provisioning su disco, è possibile installare il profilo manualmente come segue:

    •          In Xcode, selezionare Finestra> Organizer
    •          Selezionare categoria “Provisioning Profiles” a sinistra
    •          Ctrl-clic un profilo esistente> Mostra nel Finder (Reveal in Finder)
    •          Trascinare e rilasciare (Drag and drop) il nuovo profilo nella finestra profilo del Finder


Aggiornamento Impostazioni  Xcode

Dopo che il profilo viene installato su Xcode, è necessario fare un paio di modifiche al progetto per utilizzare il profilo di provisioning:

 

  1.      Modificare il file plist del progetto in modo che la voce Bundle ID corrisponde all’ pp ID . Ignorare la sequenza alfanumerica all’inizio della ID. Ad esempio, se il vostro App ID è 8IOYUHMHV.com.i3factory.ammappa” nel Developer Portal, basta inserire com.i3factory.ammappaper il Bundle ID .
  2.      Modifica informazioni di destinazione del progetto ( Edit your project’s target info) per utilizzare il nuovo profilo di provisioning:

    •          Selezionare Progetto> Edit Active Target (Modifica target attivo)
    •          Selezionare la scheda “Build”  (“Genera”) nella parte superiore
    •          Selezionare la configurazione desiderata (di solito Debug)
    •          Selezionare il nuovo profilo di provisioning per la riga etichettata Code Signing Identity
    •          Selezionare il nuovo profilo di provisioning per la riga direttamente sotto la riga Identity Code Signing (probabilmente etichettata qualsiasi dispositivo iPhone OS)


Aggiungi la tua applicazione

Se l’applicazione è già disponibile su App Store, è possibile saltare questo passaggio.

Prima di poter aggiungere un prodotto in iTunes Connect, è necessario aggiungere l’applicazione per cui prodotto è destinato. Non preoccupatevi se non avete finito al 100% la vostra applicazione. È ancora possibile inviare i dati app wtih stub data e aggiungere i particolari reali più tardi.

NOTA: Solo la versione e SKU Number sono campi permanenti e non possono essere modificati in seguito.

 

  1.      Passare a http://developer.apple.com/iphone, e log in
  2.      Segui il link a destra di iTunes Connect

    • Nota: Devi essere registrato sul developer.apple.com 
  3.      Sulla home page di iTunes Connect, fare clic sul collegamento “Manage Your Applications” (“Gestione delle applicazioni“)
  4.      Nell’angolo in alto a destra, fai clic su “Create New Application” (“Crea nuova applicazione”)
  5.      Compilare tutte le informazioni richieste per la vostra applicazione. Quando vi viene chiesto di caricare il vostro file binario dell’applicazione, selezionare la casella che indica potrete caricarlo in seguito.

 

Aggiungere il prodotto

Dopo tutto quello abbiamo impostato, siamo finalmente pronti per aggiungere il prodotto per iTunes Connect.

 

  1.      Assicurarsi di aver effettuato l’accesso per http://developer.apple.com/iphone
  2.      Passare alla pagina iTunes Connect
  3.      Fare clic sul link Gestisci il tuo Acquisti In App
  4.      Fare clic su Crea nuovo”
  5.      Selezionare l’applicazione
  6.      Inserisci le informazioni di produzione:

    • Reference Name: nome comune per il prodotto. qui abbiamo usato Pro Upgrade”. Questo nome non è modificabile, e non verrà visualizzato in App Store.
    • Product ID: ID univoco per la vostra applicazione. Tipicamente la forma com.company.appname.product, ma può essere quello che vuoi. Esso non ha bisogno di avere la vostra applicazione App ID come prefisso. Type:
    • Hai 3 scelte:
      Non-consumable: paghi solo una volta (utilizzare questa opzione se si desidera un prodotto free-topro-upgrade)
      Consumable:  pagare per ogni download
      Subscription: pagamento ricorrente
    •   Price Tier: prezzo del prodotto. Predere come riferimentro la matrice di prezzi Apple per i vari Tier.
    •          Cleared for Sale: controllare questo subito. Se non lo fai, si otterrà un ID di prodotto non valido durante i test.
    •           Language to Add: Scegli una lingua. Verranno visualizzati i due campi seguenti:
      •  Displayed Name: Nome del tuo prodotto indicato per l’utente. Ho scelto Upgrade to Pro”.
      •  Descrizione: Che cosa fa il prodotto. Il testo inserito qui viene inviato insieme con il nome visualizzato e il prezzo quando si recupera un SKProduct nel codice.
    •          Screenshot: Un immagine della tua feature acquistabile. Si può tranquillamente aggiungere lo screenshot. Dopo aver salvato il prodotto, basta scegliere l’opzione “Invia con app binario”. Questo lega il prodotto all’applicazione binaria, così quando finalmente si inoltra l’app binary file,  al 100% completa ,anche  il prodotto sarà presentato.

e Ora fai Click su “Save”

 

Scrivere Code

Ora, abbiamo finalmente scrivere il codice che recuperi le informazioni sul prodotto che abbiamo appena aggiunto in iTunes Connect. Per accedere ai dati di prodotto, abbiamo bisogno di usare lo StoreKit framework.

NOTA: StoreKit non funziona sul simulatore. È necessario testare su un dispositivo fisico.

  1. Aggiungere lo StoreKit framework al tuo progetto.
  2. Aggiungere una reference to a SKProduct nel tuo .h file:

// InAppPurchaseManager.h#import <StoreKit/StoreKit.h>

#define kInAppPurchaseManagerProductsFetchedNotification @”kInAppPurchaseManagerProductsFetchedNotification”

@interface InAppPurchaseManager : NSObject <SKProductsRequestDelegate>
{
SKProduct *proUpgradeProduct;
SKProductsRequest *productsRequest;
}

NOTA: InAppPurchaseManager è una classe singleton che gestisce ogni acquisto in app per la nostra applicazione. E ‘utilizzato in tutto questo post come un esempio di implementazione.

  1. Richiedi il prodotto, e implementare il protocollo delegato nel file .m corrispondente: (Request the product, and implement the delegate protocol in the corresponding .m file)

// InAppPurchaseManager.m– (void)requestProUpgradeProductData
{
NSSet *productIdentifiers = [NSSet setWithObject:@”com.i3factory.ammappa.upgradetopro” ];
productsRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:productIdentifiers];
productsRequest.delegate = self;
[productsRequest start];

// we will release the request object in the delegate callback
}

#pragma mark –
#pragma mark SKProductsRequestDelegate methods

– (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response
{
NSArray *products = response.products;
proUpgradeProduct = [products count] == 1 ? [[products firstObject] retain] : nil;
if (proUpgradeProduct)
{
NSLog(@”Product title: %@” , proUpgradeProduct.localizedTitle);
NSLog(@”Product description: %@” , proUpgradeProduct.localizedDescription);
NSLog(@”Product price: %@” , proUpgradeProduct.price);
NSLog(@”Product id: %@” , proUpgradeProduct.productIdentifier);
}

for (NSString *invalidProductId in response.invalidProductIdentifiers)
{
NSLog(@”Invalid product id: %@” , invalidProductId);
}

// finally release the reqest we alloc/init’ed in requestProUpgradeProductData
[productsRequest release];

[[NSNotificationCenter defaultCenter] postNotificationName:kInAppPurchaseManagerProductsFetchedNotification object:self userInfo:nil];
}

Un paio di note sul codice qui sopra:

  • Quando si specifica l’identificatore del prodotto, è necessario utilizzare il full product id. Per esempio, “com.i3factory.ammappa.upgradetopro” è usato sopra. “upgradetopro” da solo non funziona.
  • Se response.products è nil in productsRequest:didReceiveResponse: e il vostro ID prodotto si presenta in response.invalidProductIdentifers array, quindi preparatevi mentalmente per un inseguimento.  The StoreKit API non offre nessun aiuto, nessuna indicazione sul motivo per cui l’identificatore non era valido, solo che è
  • The SKProduct class offre convenientemente versioni localizzate del vostro titolo app e descrizione, ma non al prezzo. Per gestire questa omissione, ecco una categoria che fornirà una stringa localizzata prezzo per il prodotto così:

// SKProduct+LocalizedPrice.h#import <Foundation/Foundation.h>
#import <StoreKit/StoreKit.h>

@interface SKProduct (LocalizedPrice)

@property (nonatomic, readonly) NSString *localizedPrice;

@end

// SKProduct+LocalizedPrice.m#import “SKProduct+LocalizedPrice.h”

@implementation SKProduct (LocalizedPrice)

– (NSString *)localizedPrice
{
NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init];
[numberFormatter setFormatterBehavior:NSNumberFormatterBehavior10_4];
[numberFormatter setNumberStyle:NSNumberFormatterCurrencyStyle];
[numberFormatter setLocale:self.priceLocale];
NSString *formattedString = [numberFormatter stringFromNumber:self.price];
[numberFormatter release];
return formattedString;
}

@end

Dopo aver aggiunto tutto il codice di cui sopra, dovreste vedere le informazioni sul prodotto nella finestra della console. Tuttavia, è più che probabile che vi torni indietro un ID di prodotto valido. A questo proposito suggerisco il post Di Troy Brant all’indirizzo http://troybrant.net/blog/2010/01/invalid-product-ids/ in cui ci spiega esattamente come fare il debug di questo problema, ma la sezione successiva può contenere la vostra soluzione.

 

Attendere del tempo, a volte anche ore

Avete seguito tutti i passaggi di cui sopra alla lettera, e il prodotto è ancora segnalato come non valido? Avete faticosamente controllato due, tre, quattro volte per assicurarvi di aver seguito ogni passo? Quindi, ora non potete far altro che aspettare.

Ci vuole un poco di tempo affinchè il prodotto sia aggiunto a iTunes Connect e permeare nel distribuito ambiente sandbox di Apple in-app. A volte è successo che uno sviluppatori arrivi alla disperazione dopo l’ennesima volta il  prodotto è apparso come non valido. Anche 24 ore più tardi, non avevamo cambiato una riga di un codice, ma il nostro ID tornava valido. Normalmenteci vogfliono pochi minuti o al massimo un paio d’ore per far in modo che il prodotto si possa propagare attraverso la rete distribuita di Apple, ma se ci si può permettere di aspettare, si consiglia di attendere fino 24 ore prima di disperarsi.


Acquistare un prodotto

A questo punto, si dovrebbe essere in grado di recuperare con successo una descrizione SKProduct per il vostro prodotto.L’ Aggiunta del supporto per l’acquisto del prodotto è relativamente semplice rispetto a ottenere la descrizione. Ci sono solo tre passaggi necessari:

 

  •      Scrivere il codice per le operazioni di sostegno
  •      Aggiungere un utente di prova in app in iTunes Connect
  •      Esci dal tuo account iTunes Store sul tuo cellulare
  •      Testare l’acquisto

Cominceremo da dare un’occhiata al codice necessario per supportare le transazioni.

 

Scrivere codice per il sostegno transazioni

In primo luogo,  ricordiamo che siamo solo noi i siete responsabili dello sviluppo dell’interfaccia utente per l’acquisto del prodotto. StoreKit offre assolutamente zero elementi di interfaccia. Se si desidera che la visualizzazione dell’ acquisto sia come per l’App Store, bene, dovete costruirvela da soli.

Tutto il codice qui sotto è per il backend del processo di transazione. Si tratta di una singola classe con una semplice API che una classe esterna (come un controller della vista) possono chiamare per effettuare l’acquisto. Vi consiglio un approccio simile, se si sta cercando di capire come meglio integrare gli acquisti in app  nella vostra applicazione.

In primo luogo, è necessario conformarsi al protocollo SKPaymentTransactionObserver:

// InAppPurchaseManager.h// add a couple notifications sent out when the transaction completes
#define kInAppPurchaseManagerTransactionFailedNotification @”kInAppPurchaseManagerTransactionFailedNotification”
#define kInAppPurchaseManagerTransactionSucceededNotification @”kInAppPurchaseManagerTransactionSucceededNotification”

@interface InAppPurchaseManager : NSObject <SKProductsRequestDelegate, SKPaymentTransactionObserver>
{

}

// public methods
– (void)loadStore;
– (BOOL)canMakePurchases;
– (void)purchaseProUpgrade;

@end

Sopra, abbiamo definito altre due notifiche che verranno inviate con il risultato della transazione di acquisto. Per il bene di questo esempio, stiamo usando di nuovo la classe InAppPurchaseManager, proprio come abbiamo fatto quando quando va a prendere la descrizione del prodotto.

// InAppPurchaseManager.m#define kInAppPurchaseProUpgradeProductId @”com.runmonster.runmonsterfree.upgradetopro”

#pragma –
#pragma Public methods

//
// call this method once on startup
//
– (void)loadStore
{
// restarts any purchases if they were interrupted last time the app was open
[[SKPaymentQueue defaultQueue] addTransactionObserver:self];

// get the product description (defined in early sections)
[self requestProUpgradeProductData];
}

//
// call this before making a purchase
//
– (BOOL)canMakePurchases
{
return [SKPaymentQueue canMakePayments];
}

//
// kick off the upgrade transaction
//
– (void)purchaseProUpgrade
{
SKPayment *payment = [SKPayment paymentWithProductIdentifier:kInAppPurchaseProUpgradeProductId];
[[SKPaymentQueue defaultQueue] addPayment:payment];
}

#pragma –
#pragma Purchase helpers

//
// saves a record of the transaction by storing the receipt to disk
//
– (void)recordTransaction:(SKPaymentTransaction *)transaction
{
if ([transaction.payment.productIdentifier isEqualToString:kInAppPurchaseProUpgradeProductId])
{
// save the transaction receipt to disk
[[NSUserDefaults standardUserDefaults] setValue:transaction.transactionReceipt forKey:@”proUpgradeTransactionReceipt” ];
[[NSUserDefaults standardUserDefaults] synchronize];
}
}

//
// enable pro features
//
– (void)provideContent:(NSString *)productId
{
if ([productId isEqualToString:kInAppPurchaseProUpgradeProductId])
{
// enable the pro features
[[NSUserDefaults standardUserDefaults] setBool:YES forKey:@”isProUpgradePurchased” ];
[[NSUserDefaults standardUserDefaults] synchronize];
}
}

//
// removes the transaction from the queue and posts a notification with the transaction result
//
– (void)finishTransaction:(SKPaymentTransaction *)transaction wasSuccessful:(BOOL)wasSuccessful
{
// remove the transaction from the payment queue.
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];

NSDictionary *userInfo = [NSDictionary dictionaryWithObjectsAndKeys:transaction, @”transaction” , nil];
if (wasSuccessful)
{
// send out a notification that we’ve finished the transaction
[[NSNotificationCenter defaultCenter] postNotificationName:kInAppPurchaseManagerTransactionSucceededNotification object:self userInfo:userInfo];
}
else
{
// send out a notification for the failed transaction
[[NSNotificationCenter defaultCenter] postNotificationName:kInAppPurchaseManagerTransactionFailedNotification object:self userInfo:userInfo];
}
}

//
// called when the transaction was successful
//
– (void)completeTransaction:(SKPaymentTransaction *)transaction
{
[self recordTransaction:transaction];
[self provideContent:transaction.payment.productIdentifier];
[self finishTransaction:transaction wasSuccessful:YES];
}

//
// called when a transaction has been restored and and successfully completed
//
– (void)restoreTransaction:(SKPaymentTransaction *)transaction
{
[self recordTransaction:transaction.originalTransaction];
[self provideContent:transaction.originalTransaction.payment.productIdentifier];
[self finishTransaction:transaction wasSuccessful:YES];
}

//
// called when a transaction has failed
//
– (void)failedTransaction:(SKPaymentTransaction *)transaction
{
if (transaction.error.code != SKErrorPaymentCancelled)
{
// error!
[self finishTransaction:transaction wasSuccessful:NO];
}
else
{
// this is fine, the user just cancelled, so don’t notify
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
}
}

#pragma mark –
#pragma mark SKPaymentTransactionObserver methods

//
// called when the transaction status is updated
//
– (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions
{
for (SKPaymentTransaction *transaction in transactions)
{
switch (transaction.transactionState)
{
case SKPaymentTransactionStatePurchased:
[self completeTransaction:transaction];
break;
case SKPaymentTransactionStateFailed:
[self failedTransaction:transaction];
break;
case SKPaymentTransactionStateRestored:
[self restoreTransaction:transaction];
break;
default:
break;
}
}
}

Al fine di testare questa accozzaglia di nuovo codice, è necessario scrivere il codice che chiama i metodi loadStore, canMakePurchases, e anche purchaseProUpgrade .

Come potete vedere, c’è un bel po ‘di codice necessario per supportare le transazioni. Per una spiegazione completa del codice, consultare la guida ufficiale In App Purchase Guida alla programmazione a questo link: http://developer.apple.com/iphone/library/documentation/NetworkingInternet/Conceptual/StoreKitGuide/AddingaStoretoYourApplication/AddingaStoretoYourApplication.html#//apple_ref/doc/uid/TP40008267-CH101-SW1.

Il codice di cui sopra ha alcune parti che sono specifiche per l’ applicazione di Troy. In particolare, nel provideContent :, il @ isProUpgradePurchased” campo BOOL della NSUserDefaults è impostato su YES. Durante tutto il resto della domanda, questa BOOL viene controllato per determinare se attivare o meno le funzioni pro. Se si sta inoltre attuando un libero di prodotto di aggiornamento pro, si consiglia di utilizzare lo stesso approccio.

Aggiungere un utente di prova

Al fine di provare il delirio di codice appena aggiunto al progetto, è necessario creare un utente di Test in iTunes Connect per testare gli acquisti in app . È possibile utilizzare questo account di prova per l’acquisto di un prodotto senza essere fatturato da Apple.

Per creare un utente di prova, attenersi alla seguente procedura:

 

  •      Entra per http://developer.apple.com/iphone
  •      Passare a iTunes Connect
  •      Selezionare“Manage Users” (“Gestione Utenti”) sulla home page di iTunes Conect
  •      Selezionare “In App Purchase Test User” (“In App Test di Acquisto utente”)
  •      Selezionare “Add New User” (“Aggiungi nuovo utente)
  •      Compila le informazioni dell’utente. Nessuna delle informazioni deve essere legit. Vi consiglio una breve, indirizzo e-mail falso e una breve password in quanto è necessario digitare nel telefono durante il test.
  •      Selezionare “Salva

Esci sul tuo dispositivo

Prima di poter iniziare i test in acquisti app, è necessario uscire da iTunes Store sul dispositivo. Per uscire, attenersi alla seguente procedura:

  • Aprire l’app Impostazioni
  • Toccare la riga Store”
  • Premere Esci”

Prova di Acquisto

Ora, siete finalmente pronti per provare un acquisto in app. Il test è semplice:

 

  •      Eseguire l’app sul tuo dispositivo
  •      Attivare l’acquisto
  •      Quando viene richiesto username e password, inserisci i tuoi dati di utente di prova


Se si ripete l’acquisto con lo stesso account, vi verrà notificato che hai già fatto l’acquisto. Questo va bene, basta cliccare su “Sì” quando viene chiesto se si desidera scaricare nuovamente il prodotto.

 

Ringraziamo Troy e il suo Blog http://troybrant.net/blog/

2 commenti:

  1. Ho seguito esattamente tutte i passaggi ma Apple continua a rifiutare la mia App. Ho inviato un Nuovo Acquisto In-App e il binario con Application Loader. Sono stati accettati senza errori. Però Apple continua a rifiutare la mia pubblicazione dell’App Non Consumabile Gratuita.
    Il messaggio che inviano è sempre lo stesso:

    ——————————————————————————————–
    We are unable to complete the review of your app since one or more of your In-App Purchase products have not been submitted for review.

    Specifically we cannot locate the IAPs in your app.

    Please be sure to take action and submit your In App Purchase(s) AND upload a new binary in iTunes Connect. Learn more about submitting In App Purchases for review in the In-App Purchase Configuration Guide for iTunes Connect.

    Once you’ve submitted your In App Purchases and uploaded a new binary, we can proceed with your review.

    Note: Apps that offer In-App Purchase products that must be restorable are required to include a “Restore” feature. The following In-App Purchase types must be restorable:

    – non-consumable products
    – auto-renewing subscriptions
    – free subscriptions

    For more information, please see the section, Restoring Purchased Products, in the In-App Purchase Programming Guide.
    ——————————————————————————————–

    Però non indicano espressamente l’errore qual’è.
    Mi può aiutare a risolvere questo problema che mi sta snervando?
    Grazie!

    • Igor Wolfango Schiaroli

      Buonasera Fernando,
      sembra che Apple non abbia trovato un codice corretto per l’In-app purchase.
      La questione ‘ lunga da spiegare.
      Ti posso consigliare di leggere con attenzione la documentazione di developer Apple: al seguente indirizzo https://developer.apple.com/app-store/review/guidelines/

      Difficilmente Apple indica con esattezza l’errore di codice poiché l’app che gli sviluppatori inviano è compilata.
      Se non riesci a risolvere non esitare a contattarci in privato.
      Cordialmente

Lascia un commento

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

*