Botón Restaurar para la compra in-app no ​​consumible de iOS

Desafortunadamente, Apple rechazó mi aplicación por no tener un button de restauración. Quería tener una experiencia perfecta para el usuario, pero hay algunos problemas.

- (void)purchaseProUpgrade { [[SKPaymentQueue defaultQueue] addTransactionObserver:self]; // User is prompted for iTunes username and password here (1) [[SKPaymentQueue defaultQueue] restreCompletedTransactions]; } // Then this delegate Function Will be finetworking - (void) paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue { if( queue.transactions.count == 0 ) { [self setUpgradeProductId]; // User is prompted for iTunes username and password here (2) SKPayment *payment = [SKPayment paymentWithProductIdentifier:kInAppPurchaseProUpgradeProductId]; [[SKPaymentQueue defaultQueue] addPayment:payment]; }else { [[NSNotificationCenter defaultCenter] postNotificationName:kInAppPurchaseManagerTransactionSucceededNotification object:self userInfo:NULL]; } } 

¿Lo anterior es una buena solución? La lógica sería:

  1. El usuario presiona el button para eliminar la compra en la aplicación.
  2. Verifique si el usuario ya realizó una compra (el usuario debe ingresar su nombre de usuario y contraseña)
  3. Si el usuario ya realizó una compra, restaure
  4. Si el usuario aún no realizó una compra, solicite el pago (el usuario tiene que volver a ingresar la contraseña).

Los problemas con este enfoque son: 1. Una llamada de server adicional 2. El usuario tiene que ingresar detalles dos veces.

¿Alguien ha implementado un button Restaurar que puedan demostrar?

No es necesario implementar su propia lógica. Aplique esto.

 - (IBAction)restrePreviousTransaction:(id)sender { [[SKPaymentQueue defaultQueue] addTransactionObserver:self]; [[SKPaymentQueue defaultQueue] restreCompletedTransactions]; } 

Esto llamará a este método

  - (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions { case SKPaymentTransactionStateRestonetworking: if ([self respondsToSelector:@selector(restreTransaction:)]) { [self restreTransaction:transaction]; return; } 

Esto llamará a estos methods delegates para el éxito o la falla de la transacción.

 - (void)restreTransaction:(SKPaymentTransaction *)transaction -(void)paymentQueue:(SKPaymentQueue *)queue restreCompletedTransactionsFailedWithError:(NSError *)error -(void)paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue 

Agregue este código a la página donde agregó el button de restauración:

 - (void)paymentQueue:(SKPaymentQueue *)queue restreCompletedTransactionsFailedWithError:(NSError *)error { NSLog(@"%@",error); } // Call This Function - (void) checkPurchasedItems { [[SKPaymentQueue defaultQueue] addTransactionObserver:self]; [[SKPaymentQueue defaultQueue] restreCompletedTransactions]; } //Then this delegate Function Will be finetworking - (void) paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue { purchasedItemIDs = [[NSMutableArray alloc] init]; NSLog(@"received restnetworking transactions: %i", queue.transactions.count); for (SKPaymentTransaction *transaction in queue.transactions) { NSString *productID = transaction.payment.productIdentifier; [purchasedItemIDs addObject:productID]; NSLog(@"%@",purchasedItemIDs); } } 

Apple rechaza la aplicación con In App Purchase, que no tiene un button de compra de restauración. En la vista de la aplicación, agrega un button de restauración. Luego, en la class In Help App Purchase, agregue el siguiente método:

 - (void)restreCompletedTransactions { [[SKPaymentQueue defaultQueue] restreCompletedTransactions]; } 

Ahora llame a este método desde el button click acción y restaurará la compra anterior.

 *- (IBAction)restrePreviousTransaction:(id)sender { [[SKPaymentQueue defaultQueue] addTransactionObserver:self]; [[SKPaymentQueue defaultQueue] restreCompletedTransactions]; } delegate method call: - (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions { case SKPaymentTransactionStateRestonetworking: if ([self respondsToSelector:@selector(restreTransaction:)]) { [self restreTransaction:transaction]; return; } - (void) paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue { purchasedItemIDs = [[NSMutableArray alloc] init]; NSLog(@"received restnetworking transactions: %i", queue.transactions.count); for (SKPaymentTransaction *transaction in queue.transactions) { NSString *productID = transaction.payment.productIdentifier; [purchasedItemIDs addObject:productID]; NSLog(@"%@",purchasedItemIDs); } }*