2011-10-13 132 views
8

我正在实施应用内购买功能还原按钮。StoreKit:Catch失败的恢复?

我有一个全新的测试用户设置,没有任何付款。

当我点击恢复按钮并使用新的测试用户登录时,我找不到任何委托方法告诉我恢复事务失败(因为没有任何恢复)。

被调用的唯一方法是-(void)paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue*)queue,但在还原成功时也会调用此方法。

我现在能做什么?我怎么能抓住这样的情况?


增加:我有说“联系App Store的”进度指示器,我需要调用,我可以在失败的情况下隐藏这一点。

+0

由于该问题不是由Test用户购买的,您将不会从iTunesConnect获得'SKPaymentTransactionStateRestored'作为回复,最终完成您的转换。 – Hisenberg

+0

这很清楚。但是我发现了一个“联系App Store”进度指示器,并且我仍然需要一个事件来在失败时隐藏它。 – Geri

+1

没有失败,当没有事务存在时还原。其实这个案件是作为成功处理的。 – Felix

回答

1

当恢复交易,这里有两种方法下放:

- (void)paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue 
- (void)paymentQueue:(SKPaymentQueue *)queue restoreCompletedTransactionsFailedWithError:(NSError *)error 

当所有的交易都将恢复第一个(paymentQueueRestoreCompletedTransactionsFinished)被调用。如果您以前没有任何购买,它也会调用此方法,因为恢复的工作正常,但无法恢复。

另一种方法(restoreCompletedTransactionsFailedWithError)在恢复事务时出错时被调用。

如果需要显示一条消息给用户,告诉他,他没有任何交易,以恢复您可以使用:

- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions 

这里有一个小片段为这个代表:

// 
// called when the transaction status is updated 
// 
- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions 
{ 
    for (SKPaymentTransaction *transaction in transactions) 
    { 
     switch (transaction.transactionState) 
     { 
      case SKPaymentTransactionStatePurchased: 
       [self completeTransaction:transaction]; 
       break; 
      case SKPaymentTransactionStateFailed: 
       [self failedTransaction:transaction]; 
       break; 
      case SKPaymentTransactionStateRestored: 
       [self restoreTransaction:transaction]; 
       restoredTransaction++; 
       break; 
      default: 
       break; 
     } 
    } 
} 

然后你可以使用restoredTransaction可变知道,如果任何交易已经恢复对paymentQueueRestoreCompletedTransactionsFinished

+0

但Geri是如何解决这个问题的?他说,如果以前没有购买任何产品,他将返回从NSLog返回的0来解决此问题。 – MasterRazer

0

对于还原事务,可以使用以下委托方法。

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

} 
+0

只有在还原被取消或互联网连接错误时才会调用委托。我想如果用户之前没有做过任何购买,那就是问题所在。看看这个问题的评论。有一个解决方案返回一个值,但我不知道如何。 – MasterRazer

6

诺亚:这里是你的代码片段:

-(void)restore { 

    [self.delegate showLoadingScreen]; 
    [[SKPaymentQueue defaultQueue] restoreCompletedTransactions]; 


} 

,按照下述方式:

-(void)paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue { 

    if (!queue.transactions || [queue.transactions count] == 0) { 

     [self showAlertScreenWithTitle:@"Error Restoring Subscription" message:@"No subscription was found to restore."]; 

    } else { 

     BOOL didRestore = NO; 

     for (SKPaymentTransaction *t in queue.transactions) { 

      if (t.transactionState == SKPaymentTransactionStateRestored || t.transactionState == SKPaymentTransactionStatePurchased) { 

       NSTimeInterval now = [[NSDate date] timeIntervalSince1970] - _timeOffset; 
       NSTimeInterval expire = [t.transactionDate timeIntervalSince1970] + kExplorerSubscriptionSecondLength; 
       NSTimeInterval purchase = [t.transactionDate timeIntervalSince1970]; 

       if (purchase <= now && now <= expire) { 

        didRestore = YES; 
       } 

      } 


     } 

     if (!didRestore) 
      [self showAlertScreenWithTitle:@"Error Restoring Subscription" message:@"No subscription was found to restore."]; 

    }  

    [self.delegate dismissLoadingScreen]; 

} 

让我知道如果这能帮助你....

+0

感谢您的维修人员。要检查现在 – MasterRazer

+0

thx,解决了......用这一行:D(!queue.transactions || [queue.transactions count] == 0) – MasterRazer

+0

我仍然发现我需要else语句。但我现在记得在什么情况下......如果用户的订阅已过期,并且您尝试还原,它仍然会返回用户订阅每月的以前购买。这就是为什么我检查时间段。如果“现在”不属于任何时间段,则不会恢复任何内容。这可能不适用于你的情况 –