9

アプリケーション内に 1 回限りの購入 IAP がたくさんあります。ユーザーは問題なく購入できます。

私の問題は、Flurry と統合して実際の購入を追跡するのではなく、購入の復元だけを追跡していることですが、私SKPaymentTransactiontransactionStateは常にSKPaymentTransactionStatePurchasedではなくとして返されSKPaymentTransactionStateRestoredます。

どうやらSKPaymentTransactionStateRestoredのみ呼び出されるようです- (void)restoreCompletedTransactionsが、いつこのメソッドを呼び出すのですか?

私の思考プロセスは、購入は次のように行われるべきであるということです。3)サーバーは、ユーザーが以前に購入したことがあるかどうか、および設定によって復元したかどうかを確認しますSKPaymentTransactionStateRestored。それ以外の場合は、トランザクションを処理して を設定しSKPaymentTransactionStatePurchasedます。どうやらこれは間違っているよう- (void)restoreCompletedTransactionsで、その間のどこかに電話することになっていますか???

ありがとう、

意思

4

5 に答える 5

9

編集:

もともと、私は必要なことを行うために非常に長い不必要なメソッドを投稿していましたが、以下に示すように、Matt は私が探していた変数を理解するのを助けてくれました。

例として、ユーザーが以前に私のアプリを購入し、利用可能な非消費型 IAP をすべて購入してからアプリを削除したとします。ユーザーがアプリを再インストールしたときに、製品を再び「購入」する時期を判断できるようにしたいと考えています。

「すべての購入を復元」ボタンを実装しましたが、ユーザーがそれを無視/表示せず、以前に購入した製品を選択しようとしたとします。

通常の購入と同様に、次のことを行います。

if ([SKPaymentQueue canMakePayments])
{
      self.productRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:[NSSet setWithObject:productID]];

      self.productRequest.delegate = self;
      [self.productRequest start];
}
else
{
     //error message here
}

ユーザーが自分の iTunes アカウントにログインすると、アプリはユーザーがこれを購入済みであることを通知し、復元されます。次のデリゲート メソッドが呼び出されます。

 -(void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions
{   
    for (SKPaymentTransaction *transaction in transactions)
    {
        switch (transaction.transactionState)
        {
            case SKPaymentTransactionStatePurchased:
            {
                [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
                if(transaction.originalTransaction)
                {
                    NSLog(@"Just restoring the transaction");
                }
                else
                {
                    NSLog(@"First time transaction");
                }

                break;
            }
            default:
                break;
        }
    }
}

トランザクションが復元または初めての購入であるかに関係なく、transaction.transactionStateは に等しくなりSKPaymentTransactionStatePurchasedます。

この時点から、その購入品がオリジナルの購入品か復元品の購入品かをどのように判断すればよいでしょうか?

シンプル: 上記のように、transaction.originalTransactionが初期化されているかどうかを確認するだけです。Apple のメモ: // 状態が SKPaymentTransactionStateRestored の場合にのみ有効。

が初期化されている場合は、以前SKPaymentTransactionoriginalTransactionトランザクションがあったことを意味します。そうでなければ、この取引はオリジナルのものです!

繰り返しになりますが、私を正しい方向に導き、ロジックをよりきれいにしてくれた Matt に感謝します!

于 2013-04-18T19:52:50.193 に答える