2016-09-30 31 views
0

在我的应用程序中应用程序内购买正常。iOS应用程序内购买应用程序转到后台时处理(未完成的中断事务)

我面临的问题是:

  • 如果我启动订阅过程并通过按iPhone上的Home按钮将应用程序发送到后台。
  • 然后在应用内购买API坚持工作,并提示用户的iTunes的凭证,而应用程序是在后台和用户成功完成购买订阅的过程。

  • 现在用户已经通过应用程序内API购买了订阅,而应用程序在后台,但我没有得到如何处理这种情况,因为如果用户杀死应用程序而不将其带回前台,则订阅购买信息将会永远不会被转发到我们的服务器,我们将无法更新我们的服务器中的用户帐户,用户将无法使用应用程序的特殊功能。

要发送的最新收据和In-App Purchase的信息到服务器,我得到如下方式通知通过:

- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions 
{ 
    NSLog(@"updated transaction"); 
    for (SKPaymentTransaction *transaction in transactions) 
    { 
     switch (transaction.transactionState) 
     { 
      case SKPaymentTransactionStatePurchased: 
       NSLog(@"transationStatePurchased"); 
       // here I send data to server, but it never runs if app is in background. 
       [self completeTransaction:transaction]; 
       break; 
      case SKPaymentTransactionStateFailed: 
       NSLog(@"transationStateFailed"); 
       [self failedTransaction:transaction]; 
       break; 
      default: 
       break; 
     } 
    } 
} 

但是,当应用程序在前台所以问题是上述方法总是工作即使上述方法没有执行,我如何得到关于完整事务的通知。

+0

当你启动应用商店套件将检查您的付款队列中等待交易,并提供给您的队列观察员。在购买过程完成并且您保留了交易之前,您不应将交易标记为完成,因此即使用户杀死应用程序,交易仍将在队列中处于未决状态。 – Paulw11

回答

0

好的,所以我已经得到了答案。

对于别人来说简单。

如果你有一个中断应用程序内购买,以任何理由已完成,但在应用程序内购买的是交易的收据/信息,无法发送到您的服务器这是由于。只要做到这一点

最重要:永远不会调用[[SKPaymentQueue defaultQueue] finishTransaction:transaction];在保存前收到您的服务器,把它当保存收据的过程成功完成,因此,如果交易被中断你将有相关的信息IT,下一次在用户将开始APP。

在你的应用程序代理或在你的第一个视图控制器或任何你想要的,加上这一句:(我的方案,我需要登录之前更新用户数据,使用户可以使用该应用程序的特殊功能)

  1. #import <StoreKit/StoreKit.h>加到您的.h文件中。
  2. 将代表<SKPaymentTransactionObserver>添加到.h文件。
  3. 添加观察者 [[SKPaymentQueue defaultQueue] addTransactionObserver:self];- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
  4. 和委托方法

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

for (SKPaymentTransaction *transaction in transactions) { 
    switch (transaction.transactionState) { 
     case SKPaymentTransactionStatePurchasing: 
      NSLog(@"Purchasing"); 
      break; 
     case SKPaymentTransactionStatePurchased: 
      if ([transaction.payment.productIdentifier isEqualToString:kProductID]) { 

       NSLog(@"Purchased "); 
       UIAlertView *alertView = [[UIAlertView alloc]initWithTitle: 
              @"Purchase is completed succesfully" message:nil delegate: 
              self cancelButtonTitle:@"Ok" otherButtonTitles: nil]; 
       [alertView show]; 
      } 
      [self sendReceiptDataToServer:transaction]; 
      break; 
     case SKPaymentTransactionStateRestored: 
      NSLog(@"Restored "); 
      [self methodAfterTransactionSuccessful:transaction]; 
      break; 
     case SKPaymentTransactionStateFailed: 
      NSLog(@"Purchase failed "); 
      break; 
     default: 
      break; 
    } 
}} 

-(void) sendReceiptDataToServer:(SKPaymentTransaction*)transaction { 
    NSLog(@"transaction successful"); 
    [[SKPaymentQueue defaultQueue] finishTransaction:transaction]; 
} 
相关问题