2016-09-30 64 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]; 
} 
相關問題