2016-09-30 15 views
0

私のアプリではアプリ内購入がうまくいきます。アプリがバックグラウンドに移行したときのアプリ内購入処理(中断されていないトランザクション)

私が直面している問題は、

  • 私がサブスクリプションプロセスを開始し、iPhoneのホームボタンを押してアプリをバックグラウンドに送信すると、
  • アプリ内購入APIは動作し続け、アプリはバックグラウンドでユーザーはサブスクリプションを正常に購入するプロセスを完了しますが、ユーザーにiTunes資格情報を要求します。

  • アプリがバックグラウンドでアプリを使用している間にユーザーがアプリ内APIを使用して購読を購入しましたが、ユーザーがアプリを前景に戻さずにサブスクリプション購入情報を私たちのサーバーに転送されることはありません。私たちはサーバー上のユーザーアカウントを更新することができず、ユーザーはアプリの特別な機能を使用することができません。

は、最新の領収書を送信すると、アプリ内のサーバーに購入情報、私は法の下で通知を受ける:

- (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

OK、私は答えを得ました。

簡単な言葉で他の人のために。

理由が原因でアプリの購入が中断されたが、アプリ内購入のトランザクションの領収書/情報がサーバに送信できなかった場合。 、サーバー上の領収書を保存する前に[[SKPaymentQueue defaultQueue] finishTransaction:transaction];を呼び出さない領収書を保存するプロセスが正常に完了したときに、トランザクションが中断された場合は、次回ときに、ユーザーのITに関する情報を持っているなるように、それを呼び出す:単にこれは

最も重要なやりますAPPを開始します。アプリのデリゲートにしたり、最初のビューコントローラで

かどこがしたい、これを追加します(私のシナリオでは、私は、ユーザーがアプリの特別な機能を使用することができるように、ログイン前にユーザーデータを更新する必要があります)

  1. #import <StoreKit/StoreKit.h>.hファイルに追加してください。
  2. 代理人<SKPaymentTransactionObserver>.hファイルを追加します。
  3. - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
  4. にオブザーバー [[SKPaymentQueue defaultQueue] addTransactionObserver:self]; を追加して、アプリ起動ストアキットは、お支払いキューに保留中のトランザクションをチェックして、自分のキューに配信されますたびメソッド

-(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]; 
} 
関連する問題