Condividi tramite


Modifiche di StoreKit in iOS 6

iOS 6 ha introdotto due modifiche all'API dello Store Kit: la possibilità di visualizzare iTunes (e App Store/iBookstore) prodotti dall'interno dell'app e una nuova opzione di acquisto in-app in cui Apple ospiterà i file scaricabili. Questo documento illustra come implementare queste funzionalità con Xamarin.iOS.

Le principali modifiche apportate a Store Kit in iOS6 sono le due nuove funzionalità seguenti:

  • Visualizzazione e acquisto di contenuti in-app: gli utenti possono acquistare e scaricare app, musica, libri e altri contenuti iTunes senza uscire dalla tua app. Puoi anche collegarti alle tue app per promuovere l'acquisto o semplicemente incoraggiare recensioni e valutazioni.
  • Contenuto ospitato per l'acquisto in-app: Apple archivia e distribuisce il contenuto associato ai prodotti di acquisto in-app, che rimuove la necessità di un server separato per ospitare i file, supporta automaticamente il download in background e consente di scrivere meno codice.

Per informazioni dettagliate sulle API StoreKit, vedere le guide all'acquisto in-app.

Requisiti

Le funzionalità di Store Kit descritte in questo documento richiedono iOS 6 e Xcode 4.5, insieme a Xamarin.iOS 6.0.

Visualizzazione e acquisto di contenuti in-app

La nuova funzionalità di acquisto in-app in iOS consente agli utenti di visualizzare le informazioni sul prodotto e acquistare o scaricare il prodotto dall'interno dell'app. In precedenza, le applicazioni devono attivare iTunes, l'App Store o iBookstore, in modo che l'utente lasci l'applicazione originale. Questa nuova funzionalità restituisce automaticamente l'utente all'app al termine.

Ritorno automatico a un'app dopo l'acquisto

Di seguito sono riportati alcuni esempi di come questo può essere usato:

  • Incoraggiare gli utenti a valutare la tua app : puoi aprire la pagina dell'App Store in modo che l'utente possa valutare ed esaminare l'app senza lasciarla.
  • App di promozione incrociata: consente all'utente di visualizzare altre app pubblicate, con la possibilità di acquistare/scaricare immediatamente.
  • Aiutare gli utenti a trovare e scaricare contenuti : consente agli utenti di acquistare contenuti che l'app trova, gestisce o aggrega (ad esempio, un'app correlata alla musica potrebbe fornire una playlist di brani e consentire l'acquisto di ogni brano dall'interno dell'app).

Una volta che l'oggetto SKStoreProductViewController è stato visualizzato, l'utente può interagire con le informazioni sul prodotto come se fossero in iTunes, nell'App Store o nell'iBookstore. L'utente può:

  • Visualizzare screenshot (per le app),
  • Canzoni di esempio o video (per musica, programmi TV e film),
  • Leggere (e scrivere) recensioni,
  • Acquisto e download, che avviene interamente all'interno del controller di visualizzazione e del Kit dello Store.

Alcune opzioni all'interno SKStoreProductViewController di forzano comunque l'utente a lasciare l'app e aprire l'app dello Store pertinente, ad esempio facendo clic sul collegamento Prodotti correlati o supporto di un'app.

SKStoreProductViewController

L'API per visualizzare un prodotto all'interno di qualsiasi app è semplice: richiede solo la creazione e la visualizzazione di un oggetto SKStoreProductViewController. Seguire questa procedura per creare e mostrare un prodotto:

  1. Creare un StoreProductParameters oggetto per passare parametri al controller di visualizzazione, incluso productId nel costruttore .
  2. Creare un'istanza di SKProductViewController. Assegnarlo a un campo a livello di classe.
  3. Assegnare un gestore all'evento del controller di Finished visualizzazione, che deve ignorare il controller di visualizzazione. Questo evento viene chiamato quando l'utente preme annulla; o in caso contrario finalizza una transazione all'interno del controller di visualizzazione.
  4. Chiamare il LoadProduct metodo passando e StoreProductParameters un gestore di completamento. Il gestore di completamento deve verificare che la richiesta del prodotto sia stata completata correttamente e, in tal caso, presentare il SKProductViewController modally. È consigliabile aggiungere una gestione degli errori appropriata nel caso in cui il prodotto non possa essere recuperato.

Esempio

Il progetto ProductView nel codice di esempio StoreKit per questo articolo implementa un Buy metodo che accetta l'ID Apple di qualsiasi prodotto e visualizza .SKStoreProductViewController Il codice seguente visualizza le informazioni sul prodotto per qualsiasi ID Apple specificato:

void Buy (int productId)
{
    var spp = new StoreProductParameters(productId);
    var productViewController = new SKStoreProductViewController ();
    // must set the Finished handler before displaying the view controller
    productViewController.Finished += (sender, err) => {
        // Apple's docs says to use this method to close the view controller
        this.DismissModalViewControllerAnimated (true);
    };
    productViewController.LoadProduct (spp, (ok, err) => { // ASYNC !!!
        if (ok) {
            PresentModalViewController (productViewController, true);
        } else {
            Console.WriteLine (" failed ");
            if (err != null)
                Console.WriteLine (" with error " + err);
        }
    });
}

L'app è simile alla schermata seguente durante l'esecuzione: il download o l'acquisto si verifica interamente all'interno di SKStoreProductViewController:

L'app ha un aspetto simile al seguente durante l'esecuzione

Supporto di sistemi operativi meno recenti

L'applicazione di esempio include codice che mostra come aprire l'App Store, iTunes o iBookstore nelle versioni precedenti di iOS. Usare il OpenUrl metodo per aprire un URL itunes.com creato correttamente.

È possibile implementare un controllo della versione per determinare il codice da eseguire, come illustrato di seguito:

if (UIDevice.CurrentDevice.CheckSystemVersion (6,0)) {
    // do iOS6+ stuff, using SKStoreProductViewController as shown above
} else {
    // don't do stuff requiring iOS 6.0, use the old syntax
    // (which will take the user out of your app)
    var nsurl = new NSUrl("http://itunes.apple.com/us/app/angry-birds/id343200656?mt=8");
    UIApplication.SharedApplication.OpenUrl (nsurl);
}

Errori

L'errore seguente si verificherà se l'ID Apple usato non è valido, che può generare confusione perché implica un problema di rete o di autenticazione di qualche tipo.

Error Domain=SKErrorDomain Code=5 "Cannot connect to iTunes Store"

Lettura della Objective-C documentazione

Gli sviluppatori che leggono su Store Kit nel portale per sviluppatori di Apple vedranno un protocollo , SKStoreProductViewControllerDelegate , descritto in relazione a questa nuova funzionalità. Il protocollo delegato ha un solo metodo, productViewControllerDidFinish, che è stato esposto come Finished evento SKStoreProductViewController in in Xamarin.iOS.

Determinazione degli ID Apple

L'ID Apple richiesto da SKStoreProductViewController è un numero (da non confondere con GLI ID bundle come "com.xamarin.mwc2012"). Esistono alcuni modi diversi per scoprire l'ID Apple per i prodotti da visualizzare, elencati di seguito:

iTunes Connessione

Per le applicazioni pubblicate, è facile trovare l'ID Apple in iTunes Connessione:

Ricerca dell'ID Apple in iTunes Connessione

Cerca l'API

Apple offre un'API di ricerca dinamica per eseguire query su tutti i prodotti in App Store, iTunes e iBookstore. Le informazioni su come accedere all'API di ricerca sono disponibili nelle risorse affiliate di Apple, anche se l'API è esposta a chiunque (non solo alle consociate registrate). Il codice JSON risultante può essere analizzato per individuare che trackId è l'ID Apple da usare con SKStoreProductViewController.

I risultati includono anche altri metadati, tra cui informazioni di visualizzazione e URL di grafica che possono essere usati per eseguire il rendering del prodotto nell'app.

Di seguito sono riportati alcuni esempi.

Enterprise Partner Feed

Apple offre ai partner approvati un dump completo dei dati di tutti i loro prodotti, sotto forma di file flat scaricabili pronti per il database. Se si è idonei per l'accesso al feed Enterprise Partner, l'ID Apple per qualsiasi prodotto è disponibile in tale set di dati.

Molti utenti del feed Enterprise Partner sono membri del Programma affiliata che consente di ottenere commissioni sulle vendite di prodotti. SKStoreProductViewController non supporta gli ID affiliate (al momento della scrittura).

L'ID Apple per un prodotto può essere dedotto dal collegamento dell'URL di anteprima di iTunes. In tutti i collegamenti ai prodotti iTunes (per app, musica o libri) trovare la parte dell'URL che inizia con id e usare il numero che segue.

Ad esempio, il collegamento diretto a iBooks è

http://itunes.apple.com/us/app/ibooks/id364709193?mt=8

e l'ID Apple è 364709193. Analogamente per l'app MWC2012, il collegamento diretto è

http://itunes.apple.com/us/app/mwc-2012-unofficial/id496963922?mt=8

e l'ID Apple è 496963922.

Contenuto ospitato per l'acquisto in-app

Se gli acquisti in-app sono costituiti da contenuti scaricabili (ad esempio libri o altri supporti, grafica e configurazione a livello di gioco o altri file di grandi dimensioni), questi file venivano ospitati nel server Web e le app dovevano incorporare il codice per scaricarli in modo sicuro dopo l'acquisto. A partire da iOS 6, Apple ospiterà i file nei server, rimuovendo la necessità di un server separato. La funzionalità è disponibile solo per i prodotti non di consumo (non di consumo o sottoscrizioni). I vantaggi dell'uso del servizio di hosting di Apple includono:

  • Risparmiare sui costi di hosting e larghezza di banda.
  • Probabilmente più scalabile di qualsiasi host server in uso.
  • Meno codice da scrivere, poiché non è necessario compilare alcuna elaborazione lato server.
  • Il download in background viene implementato automaticamente.

Nota: il test del contenuto di acquisto in-app ospitato nel simulatore iOS non è supportato, quindi è necessario eseguire il test con un dispositivo reale.

Nozioni di base sul contenuto ospitato

Prima di iOS 6, esistono due modi per fornire un prodotto (descritto in modo più dettagliato nella documentazione relativa all'acquisto in-app di Xamarin):

  • Prodotti predefiniti: funzionalità "sbloccate" tramite l'acquisto, ma integrate nell'applicazione (come codice o risorse incorporate). Esempi di prodotti predefiniti includono filtri fotografici sbloccati o power-up in-game.
  • Prodotti recapitati dal server: dopo l'acquisto, l'applicazione deve scaricare il contenuto da un server che si opera. Questo contenuto viene scaricato durante l'acquisto, archiviato nel dispositivo e quindi sottoposto a rendering come parte della fornitura del prodotto. Gli esempi includono libri, problemi di rivista o livelli di gioco costituiti da file di base e di configurazione.

In iOS 6 Apple offre una variante dei prodotti forniti dal server: ospiteranno i file di contenuto nei server. In questo modo è molto più semplice creare prodotti recapitati dal server perché non è necessario operare un server separato e Store Kit offre funzionalità di download in background che in precedenza era necessario scrivere manualmente. Per sfruttare i vantaggi dell'hosting di Apple, abilitare l'hosting di contenuti per i nuovi prodotti di acquisto in-app e modificare il codice del Kit dello Store per sfruttarlo. I file di contenuto del prodotto vengono quindi compilati usando Xcode e caricati nei server Apple per la revisione e il rilascio.

Processo di compilazione e recapito

L'uso dell'App Store per fornire l'acquisto in-app con contenuto ospitato richiede la configurazione e la configurazione seguenti:

  • iTunes Connessione – Devi aver fornito le tue informazioni bancarie e fiscali ad Apple in modo che possano rimettere i fondi raccolti per tuo conto. È quindi possibile configurare i prodotti da vendere e configurare account utente sandbox per testare l'acquisto. È anche necessario configurare contenuto ospitato per i prodotti non di consumo che si desidera ospitare con Apple.
  • Portale di provisioning iOS: creazione di un identificatore del bundle e abilitazione dell'accesso all'App Store per l'app, come per qualsiasi applicazione che supporti l'acquisto in-app.
  • Store Kit : aggiunta di codice all'app per la visualizzazione di prodotti, acquisti di prodotti e ripristino delle transazioni. In iOS 6 Store Kit gestirà anche il download del contenuto del prodotto, in background, con gli aggiornamenti dello stato.
  • Codice personalizzato: per tenere traccia degli acquisti effettuati dai clienti e fornire i prodotti o i servizi acquistati. Usare nuove classi di iOS 6 Store Kit come SKDownload per recuperare il contenuto ospitato da Apple.

Le sezioni seguenti illustrano come implementare il contenuto ospitato, dalla creazione e caricamento del pacchetto alla gestione del processo di acquisto e download, usando il codice di esempio per questo articolo.

Codice di esempio

Il progetto di esempio HostedNonConsumables (in StoreKitiOS6.zip) usa contenuto ospitato. L'app offre due "capitoli libro" in vendita, il contenuto per il quale è ospitato nei server Apple. Il contenuto è costituito da un file di testo e un'immagine, anche se il contenuto molto più complesso può essere usato in un'applicazione reale.

L'app è simile alla seguente prima, durante e dopo un acquisto:

L'app ha questo aspetto prima, durante e dopo un acquisto

Il file di testo e l'immagine vengono scaricati e copiati nella directory Documents dell'applicazione. Per altre informazioni sulle diverse directory disponibili per l'archiviazione delle applicazioni, vedere la documentazione del file system.

iTunes Connect

Quando si creano nuovi prodotti che useranno l'hosting di contenuti di Apple, assicurarsi di selezionare il tipo di prodotto non di consumo . Altri tipi di prodotti non supportano l'hosting di contenuti. Inoltre, non è consigliabile abilitare l'hosting di contenuti per i prodotti esistenti venduti. Attivare solo l'hosting di contenuti per i nuovi prodotti.

Selezionare il tipo di prodotto non di consumo

Immettere un ID prodotto. Questo ID sarà necessario in un secondo momento quando si crea il contenuto per questo prodotto.

Immettere un ID prodotto

L'hosting del contenuto è impostato nella sezione Dettagli. Prima dell'acquisto in-app in tempo reale, deselezionare la casella di controllo Contenuto host con Apple se si vuole annullare (anche se sono stati caricati alcuni contenuti di test). Tuttavia, l'hosting del contenuto non può essere rimosso dopo che l'acquisto in-app è scaduto.

Hosting di contenuti con Apple

Dopo aver attivato l'hosting del contenuto, il prodotto immetterà In attesa dello stato di caricamento e visualizzerà questo messaggio:

Il prodotto immetterà In attesa dello stato di caricamento e visualizzerà questo messaggio

Il pacchetto di contenuto deve essere creato con Xcode e caricato usando lo strumento Archivio. Le istruzioni per la creazione di pacchetti di contenuto sono disponibili nella sezione successiva Creazione di . File PKG.

Creazione. File PKG

I file di contenuto caricati in Apple devono soddisfare le restrizioni seguenti:

  • Non può superare i 2 GB di dimensioni.
  • Impossibile contenere codice eseguibile (o collegamenti simbolici che puntano all'esterno del contenuto).
  • Deve essere formattato correttamente (incluso un file con estensione plist ) e avere un'estensione di file .pkg . Questa operazione verrà eseguita automaticamente se si seguono queste istruzioni usando Xcode.

È possibile aggiungere molti file e tipi di file diversi, purché soddisfino queste restrizioni. Il contenuto viene compresso prima della distribuzione all'applicazione e decompresso da Store Kit prima che il codice vi accesa.

Dopo aver caricato un pacchetto di contenuto, può essere sostituito con contenuto più recente. Il nuovo contenuto deve essere caricato e inviato per la revisione/approvazione tramite il normale processo. Incrementare il ContentVersion campo nei pacchetti di contenuto aggiornati per indicare che è più recente.

Progetti Xcode In-App Purchase Content

La creazione di pacchetti di contenuto per i prodotti di acquisto in-app richiede attualmente Xcode. Non è richiesto ALCUN CODICE OBJECTIVE-C; Xcode ha un nuovo tipo di progetto per questi pacchetti che contiene solo i file e un plist.

L'applicazione di esempio include capitoli di libri in vendita: ogni pacchetto di contenuto del capitolo conterrà:

  • un file di testo e
  • immagine che rappresenta il capitolo.

Per iniziare, scegliere File > nuovo progetto dal menu e scegliere Contenuto acquisto in-app:

Scegliere Contenuto di acquisto in-app

Immettere il nome prodotto e l'identificatore della società in modo che l'identificatoredel bundle corrisponda all'ID prodotto immesso in iTunes Connessione per questo prodotto.

Immettere il nome e l'identificatore

Ora si avrà un progetto contenuto di acquisto in-app vuoto. È possibile fare clic con il pulsante destro del mouse e aggiungere file o trascinarli nello strumento di navigazione del progetto. Assicurarsi che ContentVersion sia corretto (deve iniziare da 1.0, ma se in un secondo momento si sceglie di aggiornare il contenuto, ricordarsi di incrementarlo).

Questo screenshot mostra Xcode con i file di contenuto inclusi nel progetto e le voci plist visibili nella finestra principale:

Questo screenshot mostra Xcode con i file di contenuto inclusi nel progetto e le voci plist visibili nella finestra principale

Dopo aver aggiunto tutti i file di contenuto, è possibile salvare il progetto e modificarlo di nuovo in un secondo momento oppure iniziare il processo di caricamento.

Caricamento. File PKG

Il modo più semplice per caricare i pacchetti di contenuto consiste nello strumento di archiviazione Xcode. Scegliere Archivio prodotti> dal menu per iniziare:

Scegliere Archivio

Il pacchetto di contenuto verrà quindi visualizzato nell'archivio, come illustrato di seguito. Il tipo di archivio e l'icona mostrano questa riga è un archivio contenuto di acquisto in-app. Fare clic su Convalida per verificare la presenza di errori nel pacchetto di contenuto senza eseguire effettivamente il caricamento.

Convalidare il pacchetto

Accedi con le credenziali di iTunes Connessione:

Accedere con le credenziali di iTunes Connessione

Scegliere l'applicazione corretta e l'acquisto in-app per associare il contenuto a:

Scegliere l'applicazione corretta e l'acquisto in-app per associare il contenuto a

Verrà visualizzato un messaggio simile allo screenshot seguente:

Un esempio di nessun messaggio di problemi

A questo momento, eseguire un processo simile, ma facendo clic su Distribuisci , il contenuto verrà effettivamente caricato.

Distribuire l'app

Selezionare la prima opzione per caricare il contenuto:

Caricare il contenuto

Accedi di nuovo:

Accedere in

Scegliere l'applicazione corretta e il record di acquisto in-app per caricare il contenuto in:

Scegliere l'applicazione e il record di acquisto in-app

Attendere il caricamento dei file:

Finestra di dialogo di caricamento del contenuto

Al termine del caricamento, verrà visualizzato un messaggio che informa che il contenuto è stato inviato all'App Store.

Un esempio di messaggio di caricamento riuscito

Al termine, quando si torna alla pagina del prodotto in iTunes Connessione mostrerà i dettagli del pacchetto e sarà pronto per inviare lo stato. Quando il prodotto è in questo stato, è possibile iniziare a testare nell'ambiente sandbox. Non è necessario "inviare" il prodotto per il test nella sandbox.

iTunes Connessione mostrerà i dettagli del pacchetto e sarà pronto per l'invio

Possono essere necessari alcuni minuti tra il caricamento dell'archivio e l'aggiornamento dello stato di iTunes Connessione. È possibile inviare il prodotto per la revisione separatamente o inviarlo insieme a un file binario dell'applicazione. Solo dopo che Apple ha ufficialmente approvato il contenuto sarà disponibile nell'App Store di produzione per l'acquisto nella tua app.

Formato file PKG

L'uso di Xcode e dello strumento di archiviazione per creare e caricare un pacchetto di contenuto ospitato significa che non viene mai visualizzato il contenuto del pacchetto stesso. I file e le directory nei pacchetti creati per l'app di esempio sono simili allo screenshot seguente, con il file plist nella radice e i file di prodotto in una sottodirectory Contents :

Il file plist nella radice e i file del prodotto in una sottodirectory Contents

Si noti la struttura di directory del pacchetto (in particolare il percorso dei file nella Contents sottodirectory) perché sarà necessario comprendere queste informazioni per estrarre i file dal pacchetto nel dispositivo.

Aggiornamento del contenuto del pacchetto

Procedura per l'aggiornamento del contenuto dopo l'approvazione:

  • Modificare il progetto Contenuto acquisto in-app in Xcode.
  • Aggiornare il numero di versione.
  • Carica in iTunes Connessione di nuovo. Gli acquirenti successivi riceveranno automaticamente la versione più recente, ma gli utenti che hanno già la versione precedente non riceveranno alcuna notifica.
  • L'app è responsabile della notifica degli utenti e dell'incoraggiamento a recuperare una versione più recente del contenuto. L'app deve anche creare una funzione che scarica la nuova versione usando la funzionalità Di ripristino di Store Kit.
  • Per determinare se esiste una versione più recente, puoi compilare una funzionalità nella tua app per recuperare SKProducts (ad esempio lo stesso processo usato per recuperare i prezzi dei prodotti) e confrontare la proprietà ContentVersion.

Panoramica sugli acquisti

Prima di leggere questa sezione, esaminare la documentazione di acquisto in-app esistente.

La sequenza di eventi che si verifica quando un prodotto con contenuto ospitato viene acquistato e scaricato è illustrato in questo diagramma:

Sequenza di eventi che si verificano quando un prodotto con contenuto ospitato viene acquistato e scaricato

  1. I nuovi prodotti possono essere creati in iTunes Connessione con contenuto ospitato abilitato. Il contenuto effettivo viene costruito separatamente in Xcode (semplicemente trascinando i file in una cartella) e quindi Archiviato e caricato in iTunes (non è necessario scrivere codice). Ogni prodotto viene quindi inviato per l'approvazione, dopo di che diventa disponibile per l'acquisto. Nel codice di esempio questi ID prodotto sono hardcoded, ma l'hosting di contenuti con Apple è più flessibile se si archivia l'elenco di prodotti disponibile in un server remoto in modo che possa essere aggiornato quando si inviano nuovi prodotti e contenuti a iTunes Connessione.
  2. Quando l'utente acquista un prodotto, una transazione viene inserita nella coda di pagamento per l'elaborazione.
  3. Store Kit inoltra la richiesta di acquisto ai server iTunes per l'elaborazione.
  4. La transazione viene completata sui server iTunes (ad esempio, viene addebitato il cliente) e viene restituita una ricevuta all'app, con informazioni sul prodotto associate, incluso se è scaricabile (e in tal caso, le dimensioni del file e altri metadati).
  5. Il codice deve verificare se il prodotto è scaricabile e, in tal caso, effettuare una richiesta di download del contenuto inserita anche nella coda di pagamento. Store Kit invia questa richiesta ai server iTunes.
  6. Il server restituisce il file di contenuto a Store Kit, che fornisce un callback per restituire lo stato di avanzamento del download e le stime rimanenti nel codice.
  7. Al termine, si riceve una notifica e viene passato un percorso di file nella cartella Cache.
  8. Il codice deve copiare i file e verificarli, salvare qualsiasi stato che è necessario ricordare che il prodotto è stato acquistato. È possibile impostare correttamente il flag di backup nei nuovi file (suggerimento: se provengono da un server e non vengono mai modificati dall'utente, probabilmente è consigliabile ignorarli, perché l'utente può sempre recuperarli dai server Apple in futuro).
  9. Chiamare FinishTransaction. Questo passaggio è IMPORTANTE perché rimuove la transazione dalla coda di pagamento. È anche importante non chiamare FinishTransaction finché NON è stato copiato il contenuto dalla directory cache. Dopo aver chiamato FinishTransaction, è probabile che i file memorizzati nella cache vengano eliminati rapidamente.

Implementazione dell'acquisto di contenuti ospitati

Le informazioni seguenti devono essere lette insieme alla documentazione completa sugli acquisti in-app. Le informazioni contenute in questo documento sono incentrate sulle differenze tra il contenuto ospitato e l'implementazione precedente.

Classi

Le classi seguenti sono state aggiunte o modificate per supportare il contenuto ospitato in iOS 6:

  • SKDownload : nuova classe che rappresenta un download in corso. L'API consente più di un prodotto, ma inizialmente ne è stata implementata una sola.
  • SKProduct : nuove proprietà aggiunte: Downloadable, ContentVersion, ContentLengths matrice.
  • SKPaymentTransaction : nuova proprietà aggiunta: Downloads, che contiene una raccolta di SKDownload oggetti se il prodotto ha contenuto ospitato disponibile per il download.
  • SKPaymentQueue : nuovo metodo aggiunto: StartDownloads. Chiamare questo metodo con SKDownload oggetti per recuperare il contenuto ospitato. Il download può verificarsi in background.
  • SKPaymentTransactionObserver - Nuovo metodo: UpdateDownloads. Store Kit chiama questo metodo con informazioni sullo stato di avanzamento sulle operazioni di download correnti.

Dettagli della nuova SKDownload classe:

  • Progress : valore compreso tra 0 e 1 che è possibile usare per visualizzare un indicatore di percentuale di completamento per l'utente. Non usare Progress == 1 per rilevare se il download è stato completato, verificare la presenza di State == Finished.
  • TimeRemaining : stima del tempo di download rimanente, in secondi. -1 significa che sta ancora calcolando la stima.
  • Stato : attivo, in attesa, completato, non riuscito, sospeso, annullato.
  • ContentURL : percorso del file in cui il contenuto è stato inserito su disco, nella Cache directory . Popolamento solo dopo che il download è terminato.
  • Errore : controllare questa proprietà se lo stato non è riuscito.

Le interazioni tra le classi nel codice di esempio sono illustrate in questo diagramma (il codice specifico per gli acquisti di contenuti ospitati viene visualizzato in verde):

Gli acquisti di contenuti ospitati sono visualizzati in verde in questo diagramma

Il codice di esempio in cui sono state usate queste classi è illustrato nella parte restante di questa sezione:

CustomPaymentObserver (SKPaymentTransactionObserver)

Modificare l'override esistente UpdatedTransactions per verificare la presenza di contenuto scaricabile e chiamare StartDownloads , se necessario:

public override void UpdatedTransactions (SKPaymentQueue queue, SKPaymentTransaction[] transactions)
{
    foreach (SKPaymentTransaction transaction in transactions) {
        switch (transaction.TransactionState) {
        case SKPaymentTransactionState.Purchased:
            // UPDATED FOR iOS 6
            if (transaction.Downloads != null && transaction.Downloads.Length > 0) {
                // Purchase complete, and it has downloads... so download them!
                SKPaymentQueue.DefaultQueue.StartDownloads (transaction.Downloads);
                // CompleteTransaction() call has moved after downloads complete
            } else {
                // complete the transaction now
                theManager.CompleteTransaction(transaction);
            }
            break;
        case SKPaymentTransactionState.Failed:
            theManager.FailedTransaction(transaction);
            break;
        case SKPaymentTransactionState.Restored:
            // TODO: you must decide how to handle restored transactions.
            // Triggering all the downloads at once is not advisable.
            theManager.RestoreTransaction(transaction);
            break;
        default:
            break;
        }
    }
}

Di seguito è riportato un nuovo metodo UpdatedDownloads sottoposto a override. Store Kit chiama questo metodo dopo StartDownloads l'attivazione in UpdatedTransactions. Questo metodo viene chiamato più volte a intervalli indeterminato per fornire lo stato di avanzamento del download e quindi di nuovo al termine del download. Si noti che il metodo accetta una matrice di SKDownload oggetti, in modo che ogni chiamata al metodo possa fornire lo stato di più download nella coda. Come illustrato nell'implementazione seguente, gli stati di download vengono controllati ogni volta che vengono eseguite azioni appropriate.

// ENTIRELY NEW METHOD IN iOS6
public override void PaymentQueueUpdatedDownloads (SKPaymentQueue queue, SKDownload[] downloads)
{
    Console.WriteLine (" -- PaymentQueueUpdatedDownloads");
    foreach (SKDownload download in downloads) {
        switch (download.DownloadState) {
        case SKDownloadState.Active:
            // TODO: implement a notification to the UI (progress bar or something?)
            Console.WriteLine ("Download progress:" + download.Progress);
            Console.WriteLine ("Time remaining:   " + download.TimeRemaining); // -1 means 'still calculating'
            break;
        case SKDownloadState.Finished:
            Console.WriteLine ("Finished!!!!");
            Console.WriteLine ("Content URL:" + download.ContentUrl);

            // UNPACK HERE! Calls FinishTransaction when it's done
            theManager.SaveDownload (download);

            break;
        case SKDownloadState.Failed:
            Console.WriteLine ("Failed"); // TODO: UI?
            break;
        case SKDownloadState.Cancelled:
            Console.WriteLine ("Canceled"); // TODO: UI?
            break;
        case SKDownloadState.Paused:
        case SKDownloadState.Waiting:
            break;
        default:
            break;
        }
    }
}

InAppPurchaseManager (SKProductsRequestDelegate)

Questa classe contiene un nuovo metodo SaveDownload chiamato dopo il completamento di ogni download.

Il contenuto ospitato è stato scaricato correttamente e decompresso nella Cache directory. Struttura dell'oggetto . Il file PKG richiede che tutti i file vengano salvati in una Contents sottodirectory, quindi il codice seguente estrae i file dall'interno della Contents sottodirectory.

Il codice scorre tutti i file nel pacchetto di contenuto e li copia nella Documents directory, in una sottocartella denominata per .ProductIdentifier CompleteTransactionChiama infine , che chiama FinishTransaction per rimuovere la transazione dalla coda di pagamento.

// ENTIRELY NEW METHOD IN iOS 6
public void SaveDownload (SKDownload download)
{
    var documentsPath = Environment.GetFolderPath (Environment.SpecialFolder.Personal); // Documents folder
    var targetfolder = System.IO.Path.Combine (documentsPath, download.Transaction.Payment.ProductIdentifier);
    // targetfolder will be "/Documents/com.xamarin.storekitdoc.montouchimages/" or something like that
    if (!System.IO.Directory.Exists (targetfolder))
        System.IO.Directory.CreateDirectory (targetfolder);
    foreach (var file in System.IO.Directory.EnumerateFiles
             (System.IO.Path.Combine(download.ContentUrl.Path, "Contents"))) { // Contents directory is the default in .PKG files
        var fileName = file.Substring (file.LastIndexOf ("/") + 1);
        var newFilePath = System.IO.Path.Combine(targetfolder, fileName);
        if (!System.IO.File.Exists(newFilePath)) // HACK: this won't support new versions...
            System.IO.File.Copy (file, newFilePath);
        else
            Console.WriteLine ("already exists " + newFilePath);
    }
    CompleteTransaction (download.Transaction); // so it gets 'finished'
}

Quando FinishTransaction viene chiamato, i file scaricati non sono più garantiti nella Cache directory. Tutti i file devono essere copiati prima di chiamare FinishTransaction.

Altre considerazioni

Il codice di esempio precedente illustra un'implementazione piuttosto semplice dell'acquisto di contenuto ospitato. Esistono alcuni aspetti aggiuntivi da considerare:

Rilevamento del contenuto aggiornato

Anche se è possibile aggiornare i pacchetti di contenuto ospitati, Store Kit non fornisce alcun meccanismo per eseguire il push di questi aggiornamenti agli utenti che hanno già scaricato e acquistato il prodotto. Per implementare questa funzionalità, il codice può controllare regolarmente la nuova SKProduct.ContentVersion proprietà (se SKProduct è Downloadable) e rilevare se il valore viene incrementato. In alternativa, è possibile creare un sistema di notifica push.

Installazione di versioni del contenuto aggiornate

Il codice di esempio precedente ignora la copia del file se il file esiste già. Questa non è una buona idea se si desidera supportare le versioni più recenti del contenuto da scaricare.

Un'alternativa potrebbe essere copiare il contenuto in una cartella denominata per la versione e tenere traccia della versione corrente, ad esempio in NSUserDefaults o ovunque si archiviino i record di acquisto completati.

Ripristino delle transazioni

Quando SKPaymentQueue.DefaultQueue.RestoreCompletedTransactions viene chiamato, Store Kit restituisce tutte le transazioni precedenti per l'utente. Se hanno acquistato un numero elevato di elementi o se ogni acquisto ha pacchetti di contenuto di grandi dimensioni, il ripristino potrebbe comportare un sacco di traffico di rete perché tutto viene accodato per il download in una sola volta.

È consigliabile tenere traccia del fatto che un prodotto sia stato acquistato separatamente dal download effettivo del pacchetto di contenuto associato.

Sospensione, riavvio e annullamento dei download

Anche se il codice di esempio non dimostra questa funzionalità, è possibile sospendere e riavviare i download di contenuti ospitati. l'oggetto dispone di SKPaymentQueue.DefaultQueue metodi per PauseDownloadse ResumeDownloadsCancelDownloads.

Se il codice chiama FinishTransaction la coda di pagamento prima del download Finished , il download viene annullato automaticamente.

Impostazione del flag SKIP-Backup nel contenuto scaricato

Le linee guida per il backup di iCloud di Apple suggeriscono che il contenuto non utente che viene facilmente ripristinato da un server non deve essere sottoposto a backup (perché potrebbe inutilmente usare l'archiviazione iCloud). Per altre informazioni sull'impostazione dell'attributo di backup, vedere la documentazione del file system .

Riepilogo

Questo articolo ha introdotto due nuove funzionalità di Store Kit in iOS6: l'acquisto di iTunes e altri contenuti dall'interno dell'app e l'uso del server apple per ospitare i propri acquisti in-app. Questa introduzione deve essere letta insieme alla documentazione esistente relativa all'acquisto in-app per una copertura completa dell'implementazione della funzionalità di Store Kit.