Restore button for iOS non-consumable in-app purchase

后端 未结 4 1674
梦如初夏
梦如初夏 2020-12-05 15:38

Apple have unfortunately rejected my app for not having a restore button. I wanted to have a seamless experience for the user but there are some problems.

-         


        
相关标签:
4条回答
  • 2020-12-05 16:20

    Add this code to the page where you had added the restore button:

    - (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 讨论(0)
  • 2020-12-05 16:22

    Apple rejects application with In App Purchase, that does not have a restore purchase button. In the app view, add a restore button. Then in the In App Purchase helper class, add the following method:

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

    Now call this method from the button click action and it will restore the previous purchase.

    0 讨论(0)
  • 2020-12-05 16:22
    *- (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);
        }
    }*
    
    0 讨论(0)
  • 2020-12-05 16:37

    No need of implementing your own logic Just implement this

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

    This will call this method

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

    This will call these delegate methods for transaction success or failure

    - (void)restoreTransaction:(SKPaymentTransaction *)transaction
    -(void)paymentQueue:(SKPaymentQueue *)queue restoreCompletedTransactionsFailedWithError:(NSError *)error
    -(void)paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue
    
    0 讨论(0)
提交回复
热议问题