domingo, 16 de dezembro de 2012

iOS: Restaurar Transações

Algum tempo atrás trabalhei para aplicar o in-app purchase num aplicativo, entretanto foi uma experiência muito frustrante. Era para eu ter escrito aqui, mas os projetos ficaram tão atrasado nesse caso que nem tive tempo de documentar aqui no blog essa experiência. Enfim, precisei retomar o código do in-App Purchase devido a uma exigência da Apple: tem que haver um botão para restaurar todas as compras de uma só vez. 

Como era de se esperar, pouca documentação decente sobre isso, mas consegui fazer. Vamos então ao procedimento:

Primeiro vamos programar a função do botão que vai ativar o processo:

-(IBAction)restaurarInAppPurchase:(id)sender{

}



Até aqui, normal. Agora vamos verificar se o usuário pode utilizar a loja. Se não puder, já damos a mensagem de que a loja está indisponível devido as configuração do usuário:

-(IBAction)restaurarInAppPurchase:(id)sender{
   if([SKPaymentQueue canMakePayments]){

   }else{
      [[NSNotificationCenter defaultCenter]
       postNotificationName:@"Loja não disponível" 
       object:self];
   }
}

Aqui colocamos uma condição, se ele pode usar a loja através do método [SKPaymentQueue canMakePayments]. Se pode, vamos fazer o processo de restauração. Senão, notificamos o usuário que a loja não está disponível. Agora vamos ao código que vai caso tenhamos permissão.

-(IBAction)restaurarInAppPurchase:(id)sender{
   if([SKPaymentQueue canMakePayments]){
      [[SKPaymentQueue defaultQueue]
          addTransactionObserver:self];
     
      [[SKPaymentQueue defaultQueue]
          restoreCompletedTransaction];
   }else{
      [[NSNotificationCenter defaultCenter]
          postNotificationName:@"Loja não disponível." 
          object:self];
   }
}

E terminamos a nossa função por aqui, colocando o próprio objeto como observador da transação, ou seja, é o próprio objeto que vai controlar a transação. Para isso, na definição do objeto, temos incluir o protocolo <SKPaymentTransactionObserver>. Uma vez que esteja satisfeito essa condição, agora temos que implementar dois métodos que o protocolo usa para efetivar os produtos. Um é o para caso falhe. Aqui só vou colocar o código, já que não tem nada demais para ele:

-(void)paymentQueue:(SKPaymentQueue *)queue restoreCompletedTransactionsFailedWithError: (NSError *) error{
  [[NSNotificationCenter defaultCenter]
          postNotificationName:@"Erro ao restaurar." 
          object:self];
}

Esse foi o método que vai ser chamado quando der algum erro. Importante lembrar que o nome do método tem que ser exatamente esse, pois o nome é definido pelo protocolo, não pelo programador. Agora vamos implementar o método que vai ser chamado quando for sucesso:

-(void) paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *) queue{
  for(SKPaymentTransaction *transaction in queue.transactions){
    [self provideContent: transaction];    
  }



}

Aqui termina o nosso tutorial, uma vez que o provideContent vai ser a função onde você setará as flags do seu programa e restaurando o produto que estiver sendo enviado para ela.


Só mais uma coisa, lembre-se que não é possível testar qualquer coisa do in-App Purchase através do emulador. Só é possível em um aparelho físico.

Então pessoal, por hoje é só.

Nenhum comentário:

Postar um comentário