Partilhar via


Alterações no StoreKit no iOS 6

O iOS 6 introduziu duas mudanças na API Store Kit: a capacidade de exibir produtos iTunes (e App Store/iBookstore) de dentro do seu aplicativo e uma nova opção de compra no aplicativo em que a Apple hospedará seus arquivos para download. Este documento explica como implementar esses recursos com o Xamarin.iOS.

As principais mudanças no Store Kit no iOS6 são esses dois novos recursos:

  • Exibição e compra de conteúdo no aplicativo – os usuários podem comprar e baixar aplicativos, músicas, livros e outros conteúdos do iTunes sem sair do aplicativo. Você também pode vincular seus próprios aplicativos para promover compras ou apenas incentivar avaliações e classificações.
  • Conteúdo hospedado de compra no aplicativo – A Apple armazenará e entregará o conteúdo associado aos seus produtos de compra no aplicativo, o que elimina a necessidade de um servidor separado para hospedar seus arquivos, suporta automaticamente o download em segundo plano e permite que você escreva menos código.

Consulte os guias de compra no aplicativo para obter uma cobertura detalhada das APIs do StoreKit.

Requisitos

Os recursos do Store Kit discutidos neste documento exigem o iOS 6 e o Xcode 4.5, juntamente com o Xamarin.iOS 6.0.

Exibição e compra de conteúdo no aplicativo

O novo recurso de compra no aplicativo no iOS permite que os usuários visualizem informações do produto e comprem ou baixem o produto de dentro do seu aplicativo. Anteriormente, os aplicativos teriam que acionar o iTunes, a App Store ou a iBookstore, o que resultaria na saída do usuário do aplicativo original. Esse novo recurso retorna automaticamente o usuário ao seu aplicativo quando ele termina.

Retornar automaticamente a um aplicativo após a compra

Exemplos de como isso pode ser usado incluem:

  • Incentivar os usuários a avaliar seu aplicativo – Você pode abrir a página da App Store para que o usuário possa avaliar e avaliar seu aplicativo sem sair dele.
  • Aplicativos de promoção cruzada – Permita que o usuário veja outros aplicativos que você publica, com a capacidade de comprar/baixar imediatamente.
  • Ajudar os usuários a encontrar e baixar conteúdo – Ajude os usuários a comprar conteúdo que seu aplicativo encontra, gerencia ou agrega (por exemplo, um aplicativo relacionado a música pode fornecer uma lista de reprodução de músicas e permitir que cada música seja comprada de dentro do aplicativo).

Uma vez exibido, SKStoreProductViewController o usuário pode interagir com as informações do produto como se estivessem no iTunes, na App Store ou na iBookstore. O usuário pode:

  • Visualizar capturas de tela (para aplicativos),
  • Exemplos de músicas ou vídeos (para músicas, programas de TV e filmes),
  • Leia (e escreva) comentários,
  • Compra e download, que acontece inteiramente dentro do controlador de visualização e do Kit de Armazenamento.

Algumas opções dentro do SKStoreProductViewController ainda forçarão o usuário a sair do aplicativo e abrir o aplicativo da loja relevante, como clicar em Produtos relacionados ou no link de suporte de um aplicativo.

SKStoreProductViewController

A API para mostrar um produto em qualquer aplicativo é simples: requer apenas que você crie e exiba um SKStoreProductViewControllerarquivo . Siga estas etapas para criar e exibir um produto:

  1. Crie um StoreProductParameters objeto para passar parâmetros para o controlador de exibição, incluindo o productId no construtor.
  2. Instancie o SKProductViewControllerarquivo . Atribua-o a um campo de nível de classe.
  3. Atribua um manipulador ao evento do controlador de Finished exibição, que deve ignorar o controlador de exibição. Esse evento é chamado quando o usuário pressiona cancelar; ou finaliza uma transação dentro do controlador de exibição.
  4. Chame o LoadProduct método passando o StoreProductParameters e um manipulador de conclusão. O manipulador de conclusão deve verificar se a solicitação do produto foi bem-sucedida e, em caso afirmativo, apresentar o SKProductViewController modal. O tratamento de erros apropriado deve ser adicionado caso o produto não possa ser recuperado.

Exemplo

O projeto ProductView no código de exemplo do StoreKit para este artigo implementa um Buy método que aceita a ID Apple de qualquer produto e exibe o SKStoreProductViewController. O código a seguir exibe as informações do produto para qualquer ID Apple:

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

O aplicativo se parece com a captura de tela abaixo durante a execução - o download ou a compra ocorre inteiramente dentro do SKStoreProductViewController:

O aplicativo fica assim ao ser executado

Suporte a sistemas operacionais mais antigos

O aplicativo de exemplo inclui código que mostra como abrir a App Store, o iTunes ou a iBookstore em versões anteriores do iOS. Use o OpenUrl método para abrir um URL de itunes.com criado corretamente.

Você pode implementar uma verificação de versão para determinar qual código executar, conforme mostrado aqui:

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

Errors

O erro a seguir ocorrerá se o ID Apple que você usa não for válido, o que pode ser confuso, pois implica algum tipo de problema de rede ou autenticação.

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

Documentação de leitura Objective-C

Os desenvolvedores que lerem sobre o Store Kit no Portal do Desenvolvedor da Apple verão um protocolo – SKStoreProductViewControllerDelegate – discutido em relação a esse novo recurso. O protocolo delegado tem apenas um método – productViewControllerDidFinish – que foi exposto como o Finished evento no SKStoreProductViewController Xamarin.iOS.

Determinando IDs Apple

A ID da Apple exigida SKStoreProductViewController pelo é um número (não deve ser confundido com IDs de pacote como "com.xamarin.mwc2012"). Existem algumas maneiras diferentes de descobrir o ID Apple dos produtos que deseja exibir, listadas abaixo:

iTunesConnect

Para aplicativos que você publica, é fácil encontrar o ID Apple no iTunes Connect:

Encontrando o ID Apple no iTunes Connect

API de Pesquisa

A Apple fornece uma API de pesquisa dinâmica para consultar todos os produtos na App Store, iTunes e iBookstore. Informações sobre como acessar a API de pesquisa podem ser encontradas nos Recursos de Afiliados da Apple, embora a API seja exposta a qualquer pessoa (não apenas afiliados registrados). O JSON resultante pode ser analisado trackId para descobrir que é o ID Apple a ser usado com SKStoreProductViewControllero .

Os resultados também incluirão outros metadados, incluindo informações de exibição e URLs de arte que podem ser usados para renderizar o produto em seu aplicativo.

Veja alguns exemplos:

Feed de parceiros corporativos

A Apple fornece aos parceiros aprovados um despejo de dados completo de todos os seus produtos, na forma de arquivos simples prontos para download e prontos para o banco de dados. Se você se qualificar para acessar o Enterprise Partner Feed, o ID Apple de qualquer produto poderá ser encontrado nesse conjunto de dados.

Muitos usuários do Enterprise Partner Feed são membros do Programa de Afiliados que permite que comissões sejam ganhas sobre as vendas de produtos. SKStoreProductViewController não suporta IDs de afiliados (no momento da redação).

O ID Apple de um produto pode ser inferido a partir do link do URL de visualização do iTunes. Em qualquer link de produto do iTunes (para apps, músicas ou livros), encontre a parte do URL que começa com id e use o número a seguir.

Por exemplo, o link direto para o iBooks é

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

e o ID Apple é 364709193. Da mesma forma, para o aplicativo MWC2012, o link direto é

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

e o ID Apple é 496963922.

Conteúdo hospedado de compra no aplicativo

Se suas compras no aplicativo consistem em conteúdo para download (como livros ou outras mídias, arte e configuração no nível do jogo ou outros arquivos grandes), esses arquivos costumavam ser hospedados em seu servidor da Web e os aplicativos precisavam incorporar código para baixá-los com segurança após a compra. A partir do iOS 6, a Apple hospedará seus arquivos em seus servidores, eliminando a necessidade de um servidor separado. O recurso está disponível apenas para produtos não consumíveis (não consumíveis ou assinaturas). As vantagens de usar o serviço de hospedagem da Apple incluem:

  • Economize custos de hospedagem e largura de banda.
  • Provavelmente mais escalável do que qualquer host de servidor que você esteja usando atualmente.
  • Menos código para escrever, já que você não precisa criar nenhum processamento do lado do servidor.
  • O download em segundo plano é implementado para você.

Observação: não há suporte para o teste de conteúdo de compras no aplicativo hospedado no Simulador do iOS, portanto, você deve testar com um dispositivo real.

Noções básicas de conteúdo hospedado

Antes do iOS 6, havia duas maneiras de fornecer um produto (descritas com mais detalhes na documentação de compra no aplicativo do Xamarin):

  • Produtos integrados – Recursos que são "desbloqueados" pela compra, mas que são incorporados ao aplicativo (como código ou recursos incorporados). Exemplos de produtos integrados incluem filtros de fotos desbloqueados ou power-ups no jogo.
  • Produtos entregues pelo servidor – Após a compra, o aplicativo deve baixar o conteúdo de um servidor que você opera. Esse conteúdo é baixado durante a compra, armazenado no dispositivo e, em seguida, renderizado como parte do fornecimento do produto. Os exemplos incluem livros, edições de revistas ou níveis de jogos que consistem em arte de fundo e arquivos de configuração.

No iOS 6, a Apple oferece uma variação de produtos entregues pelo servidor: eles hospedarão seus arquivos de conteúdo em seus servidores. Isso torna muito mais simples criar produtos entregues pelo servidor porque você não precisa operar um servidor separado, e o Store Kit fornece funcionalidade de download em segundo plano que você mesmo precisava escrever anteriormente. Para aproveitar a hospedagem da Apple, habilite a hospedagem de conteúdo para novos produtos de compra no aplicativo e modifique o código do Store Kit para aproveitá-lo. Os arquivos de conteúdo do produto são criados usando o Xcode e carregados nos servidores da Apple para revisão e lançamento.

O processo de construção e entrega

Usar a App Store para fornecer compras no aplicativo com conteúdo hospedado requer a seguinte configuração e configuração:

  • iTunes Connect – Você deve ter fornecido suas informações bancárias e fiscais à Apple para que eles possam remeter os fundos coletados em seu nome. Em seguida, você pode configurar produtos para vender e configurar contas de usuário de sandbox para testar a compra. Você também deve configurar o Conteúdo Hospedado para os produtos não consumíveis que deseja hospedar com a Apple.
  • Portal de provisionamento do iOS – Criando um identificador de pacote e habilitando o acesso à App Store para seu aplicativo, como faria para qualquer aplicativo que ofereça suporte a compras no aplicativo.
  • Kit da Loja – Adicionar código ao seu aplicativo para exibir produtos, comprar produtos e restaurar transações. No iOS 6, o Store Kit também gerenciará o download do conteúdo do seu produto, em segundo plano, com atualizações de progresso.
  • Código personalizado – para rastrear compras feitas por clientes e fornecer os produtos ou serviços que eles compraram. Utilize as novas classes do iOS 6 Store Kit, como SKDownload recuperar o conteúdo hospedado pela Apple.

As seções a seguir explicam como implementar o conteúdo hospedado, desde a criação e o carregamento do pacote até o gerenciamento do processo de compra e download, usando o código de exemplo para este artigo.

Exemplo de código

O projeto de exemplo HostedNonConsumables (em StoreKitiOS6.zip) usa conteúdo hospedado. O aplicativo oferece dois "capítulos de livros" para venda, cujo conteúdo está hospedado nos servidores da Apple. O conteúdo consiste em um arquivo de texto e uma imagem, embora um conteúdo muito mais complexo possa ser usado em um aplicativo real.

O aplicativo se parece com isso antes, durante e depois de uma compra:

O aplicativo se parece com isso antes, durante e depois de uma compra

O arquivo de texto e a imagem são baixados e copiados para o diretório Documentos do aplicativo. Para obter mais informações sobre os diferentes diretórios disponíveis para armazenamento de aplicativos, consulte a documentação do sistema de arquivos.

iTunes Connect

Ao criar novos produtos que usarão a hospedagem de conteúdo da Apple, certifique-se de selecionar o tipo de produto Não consumível . Outros tipos de produtos não suportam hospedagem de conteúdo. Além disso, você não deve habilitar a hospedagem de conteúdo para produtos existentes que você vende; ative a hospedagem de conteúdo apenas para novos produtos.

Selecione o tipo de produto Não consumível

Insira uma ID do produto. Essa ID será necessária posteriormente, quando você criar o conteúdo para este produto.

Insira uma ID do produto

A hospedagem de conteúdo é definida na seção Detalhes. Antes de a compra no aplicativo ser publicada, desmarque a caixa de seleção Hospedar Conteúdo com a Apple se desejar cancelar (mesmo que tenha carregado algum conteúdo de teste). No entanto, a hospedagem de conteúdo não pode ser removida após a compra no aplicativo ter sido publicada.

Hospedando conteúdo com a Apple

Depois de ativar o conteúdo de hospedagem, o produto entrará no status Aguardando upload e mostrará esta mensagem:

O produto entrará no status Aguardando upload e mostrará esta mensagem

O pacote de conteúdo deve ser criado com o Xcode e carregado usando a ferramenta Arquivo. As instruções para a criação de pacotes de conteúdo são fornecidas na próxima seção Criando . Arquivos PKG.

Criar. Arquivos PKG

Os arquivos de conteúdo que você envia para a Apple devem atender às seguintes restrições:

  • Não pode exceder 2 GB de tamanho.
  • Não pode conter código executável (ou links simbólicos que apontam para fora do conteúdo).
  • Deve ser formatado corretamente (incluindo um arquivo .plist ) e ter uma extensão de arquivo .pkg . Isso será feito automaticamente se você seguir estas instruções usando o Xcode.

Você pode adicionar muitos arquivos e tipos de arquivos diferentes, desde que eles atendam a essas restrições. O conteúdo é compactado antes da entrega ao seu aplicativo e descompactado pelo Store Kit antes que seu código o acesse.

Depois de carregar um pacote de conteúdo, ele pode ser substituído por um conteúdo mais recente. O novo conteúdo deve ser carregado e enviado para revisão/aprovação por meio do processo normal. Incremente o ContentVersion campo em pacotes de conteúdo atualizados para indicar que ele é mais recente.

Projetos de conteúdo de compras no aplicativo do Xcode

A criação de pacotes de conteúdo para produtos de compra no aplicativo atualmente requer o Xcode. NÃO HÁ OBJECTIVE-C CODIFICAÇÃO necessária; O Xcode tem um novo tipo de projeto para esses pacotes que contém apenas seus arquivos e um plist.

Nosso aplicativo de amostra tem capítulos de livros à venda – cada pacote de conteúdo de capítulo conterá:

  • um arquivo de texto e
  • uma imagem para representar o capítulo.

Comece selecionando Arquivo Novo Projeto no menu e escolhendo Conteúdo de > Compra no Aplicativo:

Escolha o conteúdo de compra no aplicativo

Insira o Nome do Produto e o Identificador da Empresa de forma que o Identificador do Pacote corresponda ao ID do Produto que você inseriu no iTunes Connect para este produto.

Digite o nome e o identificador

Agora você terá um projeto de conteúdo de compra no aplicativo em branco. Você pode clicar com o botão direito do mouse e Adicionar arquivos... ou arrastá-los para o Navegador de projetos. Certifique-se de que o ContentVersion esteja correto (ele deve começar na versão 1.0, mas se você optar por atualizar seu conteúdo posteriormente, lembre-se de incrementá-lo).

Esta captura de tela mostra o Xcode com os arquivos de conteúdo incluídos no projeto e as entradas plist visíveis na janela principal:

Esta captura de tela mostra o Xcode com os arquivos de conteúdo incluídos no projeto e as entradas plist visíveis na janela principal

Depois de adicionar todos os seus arquivos de conteúdo, você pode salvar este projeto e editá-lo novamente mais tarde ou iniciar o processo de upload.

Upload. Arquivos PKG

A maneira mais fácil de carregar pacotes de conteúdo é com a Xcode Archive Tool. Escolha Arquivo de produtos > no menu para começar:

Escolha Arquivar

O pacote de conteúdo aparecerá no arquivo, conforme mostrado abaixo. O tipo de arquivo e o ícone mostram que esta linha é um Arquivo de conteúdo de compras no aplicativo. Clique em Validar... para verificar se há erros em nosso pacote de conteúdo sem realmente realizar o upload.

Validar o pacote

Faça login com suas credenciais do iTunes Connect:

Faça login com suas credenciais do iTunes Connect

Escolha o aplicativo e a compra no aplicativo corretos para associar este conteúdo a:

Escolha o aplicativo correto e a compra no aplicativo para associar esse conteúdo

Você deve ver uma mensagem como esta captura de tela:

Um exemplo de mensagem sem problemas

Agora passe por um processo semelhante, mas clicar em Distribuir... fará o upload do conteúdo.

Distribuir o aplicativo

Selecione a primeira opção para fazer o upload do conteúdo:

Carregar o conteúdo

Faça login novamente:

Iniciar sessão

Escolha o aplicativo correto e o registro de compras no aplicativo para carregar o conteúdo:

Escolha o aplicativo e o registro de compras no aplicativo

Aguarde enquanto seus arquivos são carregados:

A caixa de diálogo de upload de conteúdo

Quando o upload for concluído, aparecerá uma mensagem informando que o conteúdo foi enviado para a App Store.

Um exemplo de mensagem de upload bem-sucedida

Feito isso, quando você retornar à página do produto no iTunes Connect, ele mostrará os detalhes do pacote e estará no status Pronto para enviar . Quando o produto estiver nesse status, você poderá começar a testar no ambiente de sandbox. Você NÃO precisa 'enviar' o produto para teste na sandbox.

iTunes Connect mostrará os detalhes do pacote e estará no status Pronto para enviar

Pode levar algum tempo (por exemplo, alguns minutos) entre o upload do arquivo e a atualização do status do iTunes Connect. Você pode enviar o produto para revisão separadamente ou enviá-lo em conjunto com um binário de aplicativo. Somente depois que a Apple aprovar oficialmente o conteúdo, ele estará disponível na App Store de produção para compra em seu aplicativo.

Formato de arquivo PKG

Usar o Xcode e a Ferramenta de Arquivamento para criar e carregar um pacote de conteúdo hospedado significa que você nunca verá o conteúdo do pacote em si. Os arquivos e diretórios nos pacotes criados para o aplicativo de exemplo são semelhantes à captura de tela abaixo, com o arquivo plist na raiz e os arquivos do produto em um subdiretório Contents :

O arquivo plist na raiz e os arquivos do produto em um subdiretório Contents

Observe a estrutura de diretórios do pacote (especialmente a localização dos arquivos no Contents subdiretório) porque você precisará entender essas informações para extrair os arquivos do pacote no dispositivo.

Atualizando o conteúdo do pacote

O procedimento para atualizar o conteúdo após sua aprovação:

  • Edite o projeto de Conteúdo de Compra no Aplicativo no Xcode.
  • Aumente o número da versão.
  • Carregue para o iTunes Connect novamente. Os compradores subsequentes receberão automaticamente a versão mais recente, MAS os usuários que já possuem a versão antiga não receberão nenhuma notificação.
  • Seu aplicativo é responsável por notificar os usuários e incentivá-los a recuperar uma versão mais recente do conteúdo. O aplicativo também deve criar uma função que baixe a nova versão, usando o recurso Restaurar do Store Kit.
  • Para determinar se existe uma versão mais recente, você pode criar um recurso em seu aplicativo para buscar SKProducts (por exemplo, o mesmo processo usado para recuperar preços de produtos) e comparar a propriedade ContentVersion.

Visão geral de compras

Antes de ler esta seção, examine a documentação existente de compras no aplicativo.

A sequência de eventos que ocorre quando um produto com conteúdo hospedado é comprado e baixado é ilustrada neste diagrama:

A sequência de eventos que ocorre quando um produto com conteúdo hospedado é comprado e baixado

  1. Novos produtos podem ser criados no iTunes Connect com o Conteúdo Hospedado ativado. O conteúdo real é construído separadamente no Xcode (tão simples quanto arrastar arquivos para uma pasta) e, em seguida, arquivado e carregado no iTunes (nenhuma codificação é necessária). Cada produto é então submetido à aprovação, após o que fica disponível para compra. No código de exemplo, essas IDs de Produto são codificadas, mas hospedar conteúdo com a Apple é mais flexível se você armazenar a lista de produtos disponível em um servidor remoto para que ela possa ser atualizada quando você enviar novos produtos e conteúdo para o iTunes Connect.
  2. Quando o usuário compra um produto, uma transação é colocada na fila de pagamento para processamento.
  3. O Store Kit encaminha a solicitação de compra para os servidores do iTunes para processamento.
  4. A transação é concluída nos servidores do iTunes (por exemplo, o cliente é cobrado) e um recibo é devolvido ao aplicativo, com informações do produto anexadas, incluindo se ele pode ser baixado (e, em caso afirmativo, o tamanho do arquivo e outros metadados).
  5. Seu código deve verificar se o produto pode ser baixado e, em caso afirmativo, fazer uma solicitação de download de conteúdo que também seja colocada na fila de pagamento. O Store Kit envia essa solicitação para os servidores do iTunes.
  6. O servidor retorna o arquivo de conteúdo para o Store Kit, que fornece um retorno de chamada para retornar o progresso do download e as estimativas de tempo restante para o código.
  7. Depois de concluído, você é notificado e passa um local de arquivo na pasta Cache.
  8. Seu código deve copiar os arquivos e verificá-los, salvar qualquer estado que você precise lembrar que o produto foi comprado. Aproveite esta oportunidade para definir o sinalizador de backup corretamente nos novos arquivos (dica: se eles vierem de um servidor e nunca forem editados pelo usuário, você provavelmente deve pular o backup deles, pois o usuário sempre pode recuperá-los dos servidores da Apple no futuro).
  9. Chame FinishTransaction. Esta etapa é IMPORTANTE, pois remove a transação da fila de pagamentos. Também é importante que você NÃO chame FinishTransaction até DEPOIS de ter copiado o conteúdo do diretório Cache. Depois de chamar FinishTransaction, os arquivos armazenados em cache provavelmente serão limpos rapidamente.

Implementando a compra de conteúdo hospedado

As informações a seguir devem ser lidas em conjunto com a documentação completa de compras no aplicativo. As informações neste documento se concentram nas diferenças entre o conteúdo hospedado e a implementação anterior.

Classes

As seguintes classes foram adicionadas ou alteradas para dar suporte ao conteúdo hospedado no iOS 6:

  • SKDownload – Nova classe que representa um download em andamento. A API permite mais de um por produto, no entanto, inicialmente apenas um foi implementado.
  • SKProduct – Novas propriedades adicionadas: Downloadable, ContentVersion, ContentLengths array.
  • SKPaymentTransaction – Nova propriedade adicionada: Downloads, que contém uma coleção de SKDownload objetos se este produto tiver conteúdo hospedado disponível para download.
  • SKPaymentQueue – Novo método adicionado: StartDownloads. Chame esse método com SKDownload objetos para buscar seu conteúdo hospedado. O download pode ocorrer em segundo plano.
  • SKPaymentTransactionObserver – Novo método: UpdateDownloads. O Store Kit chama esse método com informações de progresso sobre as operações de download atuais.

Detalhes da nova SKDownload classe:

  • Progresso – Um valor entre 0 e 1 que você pode usar para exibir um indicador de porcentagem concluída para o usuário. NÃO use Progress == 1 para detectar se o download foi concluído, verifique o Estado == Concluído.
  • TimeRemaining – Estimativa do tempo restante de download, em segundos. -1 significa que ainda está calculando a estimativa.
  • Estado – Ativo, Aguardando, Concluído, Com Falha, Pausado, Cancelado.
  • ContentURL – Local do arquivo onde o conteúdo foi colocado no disco, no Cache diretório. SOMENTE preenchido quando o download for concluído.
  • Erro – Verifique esta propriedade se o Estado for Falha.

As interações entre as classes no código de exemplo são mostradas neste diagrama (o código específico para compras de conteúdo hospedado é mostrado em verde):

As compras de conteúdo hospedado são mostradas em verde neste diagrama

O código de exemplo em que essas classes foram usadas é mostrado no restante desta seção:

CustomPaymentObserver (SKPaymentTransactionObserver)

Altere a substituição existente UpdatedTransactions para verificar se há conteúdo para download e chame StartDownloads , se necessário:

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

O novo método UpdatedDownloads substituído é mostrado abaixo. O Store Kit chama esse método depois StartDownloads de ser acionado no UpdatedTransactions. Esse método é chamado várias vezes em intervalos indeterminados para fornecer o progresso do download e, em seguida, novamente quando o download for concluído. Observe que o método aceita uma matriz de SKDownload objetos, portanto, cada chamada de método pode fornecer o status de vários downloads na fila. Conforme mostrado na implementação abaixo, os status de download são verificados sempre e as ações apropriadas são tomadas.

// 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)

Essa classe contém um novo método SaveDownload que é chamado após a conclusão bem-sucedida de cada download.

O conteúdo hospedado foi baixado com êxito e descompactado no Cache diretório. A estrutura do . PKG requer que todos os arquivos sejam salvos em um Contents subdiretório, portanto, o código abaixo extrai arquivos de dentro do Contents subdiretório.

O código itera por todos os arquivos no pacote de conteúdo e os copia para o Documents diretório, em uma subpasta com o nome do ProductIdentifier. Por fim, ele chama CompleteTransaction, que chama FinishTransaction para remover a transação da fila de 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 é chamado, os arquivos baixados não têm mais garantia de estar no Cache diretório. Todos os arquivos devem ser copiados antes de chamar FinishTransactiono .

Outras considerações

O código de exemplo acima demonstra uma implementação bastante simples da compra de conteúdo hospedado. Existem alguns pontos adicionais que você deve considerar:

Detectando conteúdo atualizado

Embora seja possível atualizar seus pacotes de conteúdo hospedado, o Store Kit não fornece nenhum mecanismo para enviar essas atualizações para usuários que já baixaram e compraram o produto. Para implementar essa funcionalidade, seu código pode verificar a nova SKProduct.ContentVersion propriedade (se for SKProduct Downloadable) regularmente e detectar se o valor é incrementado. Como alternativa, você pode criar um sistema de notificação por push.

Instalando versões de conteúdo atualizadas

O código de exemplo acima ignora a cópia do arquivo se o arquivo já existir. Esta NÃO é uma boa ideia se você deseja oferecer suporte a versões mais recentes do conteúdo que está sendo baixado.

Uma alternativa pode ser copiar o conteúdo para uma pasta com o nome da versão e acompanhar qual é a versão atual (por exemplo, em NSUserDefaults ou onde quer que você armazene registros de compra concluídos).

Restaurando transações

Quando SKPaymentQueue.DefaultQueue.RestoreCompletedTransactions é chamado, o Store Kit retorna todas as transações anteriores para o usuário. Se eles compraram um grande número de itens ou se cada compra tem grandes pacotes de conteúdo, a restauração pode resultar em muito tráfego de rede, pois tudo fica na fila para download de uma só vez.

Considere acompanhar se um produto foi comprado separadamente do download real do pacote de conteúdo associado.

Pausar, reiniciar e cancelar downloads

Embora o código de exemplo não demonstre esse recurso, é possível pausar e reiniciar downloads de conteúdo hospedado. O SKPaymentQueue.DefaultQueue tem métodos para PauseDownloads, ResumeDownloads e CancelDownloads.

Se o código for chamado FinishTransaction na fila de pagamento antes do download Finished , esse download será cancelado automaticamente.

Definindo o sinalizador SKIP-Backup no conteúdo baixado

As Diretrizes de backup do iCloud da Apple sugerem que o conteúdo que não é do usuário que é facilmente restaurado de um servidor não deve ser copiado (porque isso usaria desnecessariamente o armazenamento do iCloud). Para obter mais informações sobre como configurar o atributo de backup, consulte a documentação do sistema de arquivos.

Resumo

Este artigo introduziu dois novos recursos do Store Kit no iOS6: comprar o iTunes e outros conteúdos de dentro do seu aplicativo e utilizar o servidor da Apple para hospedar suas próprias compras no aplicativo. Esta introdução deve ser lida em conjunto com a documentação existente de Compras no Aplicativo para obter uma cobertura completa da implementação da funcionalidade do Store Kit.