2012-06-20 11 views
12

Desafortunadamente, Apple ha rechazado mi aplicación por no tener un botón restaurar. Quería tener una experiencia perfecta para el usuario, pero hay algunos problemas.Botón Restaurar para iOS no consumible en la compra en la aplicación

- (void)purchaseProUpgrade 
{ 
    [[SKPaymentQueue defaultQueue] addTransactionObserver:self]; 

    // User is prompted for iTunes username and password here (1) 
    [[SKPaymentQueue defaultQueue] restoreCompletedTransactions]; 
} 

// Then this delegate Function Will be fired 
- (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]; 
    } 
    } 

¿Es lo de arriba una buena solución? La lógica sería:

  1. El usuario presiona el botón para eliminar la compra en la aplicación.
  2. Comprobar si el usuario ya ha realizado una compra (usuario tiene que introducir nombre de usuario y contraseña)
  3. Si el usuario ya ha realizado una compra, restaurar
  4. Si el usuario no lo ha hecho una compra, pronta para el pago (usuario tiene que ingresar la contraseña nuevamente).

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

¿Alguien ha implementado realmente un botón Restaurar que puedan demostrar?

+0

¿Por qué tiene un botón para que el usuario elimine una compra en la aplicación? Una desinstalación de la aplicación hará eso. ¿Cómo harías tu paso número 2 sin forzar un nombre de usuario y contraseña? – whatchamacallit

+0

¿Cómo sé si mostrar o no el botón restaurar? Es decir, mi código no sabe si ya hicieron una compra o no. O lo hace? –

Respuesta

11

No hay necesidad de poner en práctica su propia lógica Sólo implementar esta

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

Esto llamará a este método

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

Esto llamar a estos métodos de delegado para el éxito de la transacción o el fracaso

- (void)restoreTransaction:(SKPaymentTransaction *)transaction 
-(void)paymentQueue:(SKPaymentQueue *)queue restoreCompletedTransactionsFailedWithError:(NSError *)error 
-(void)paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue 
+0

me encontré con un problema. cuando presiono el botón restaurar y uso la ID de la tienda de aplicaciones por la cual no se realiza la compra desde la aplicación, en este caso - (nulo) paymentQueue: (SKPaymentQueue *) queue restoreCompletedTransactionsFailedWithError: (NSError *) error no se llama. ¿Es normal o algo está mal? – Tornado

+1

Sí, es normal. En su lugar, llamará a ** - (void) paymentQueueRestoreCompletedTransactionsFinished: (SKPaymentQueue *) queue ** con 0 en 'SKPaymentQueue', es decir, queue. – Sumanth

+0

Necesita verificar el valor de la cola es 0 o no – Sumanth

7

Agregue este código a la página donde había agregado la restauración botón:

- (void)paymentQueue:(SKPaymentQueue *)queue restoreCompletedTransactionsFailedWithError:(NSError *)error { 
    NSLog(@"%@",error); 
} 

// Call This Function 
- (void) checkPurchasedItems 
{ 
    [[SKPaymentQueue defaultQueue] addTransactionObserver:self]; 
    [[SKPaymentQueue defaultQueue] restoreCompletedTransactions]; 
} 

//Then this delegate Function Will be fired 
- (void) paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue 
{ 
    purchasedItemIDs = [[NSMutableArray alloc] init]; 
    NSLog(@"received restored transactions: %i", queue.transactions.count); 

    for (SKPaymentTransaction *transaction in queue.transactions) 
    { 
     NSString *productID = transaction.payment.productIdentifier; 

     [purchasedItemIDs addObject:productID]; 

     NSLog(@"%@",purchasedItemIDs); 
    } 
} 
0

Apple rechaza la aplicación con la compra en la aplicación, que no tiene un botón de restaurar la compra. En la vista de la aplicación, agrega un botón restaurar. Luego, en la clase de Compra ayudante en la aplicación, agregue el siguiente método:

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

Ahora llama a este método de la acción de clic de botón y se restaurará la compra anterior.

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