2013-04-18 15 views
7

私は自分のアプリケーションの中にIAPを1回購入しています。ユーザーはそれらをうまく購入することができます。iOS StoreKit - いつ呼び出すか - (void)restoreCompletedTransactions?

私の問題は、私は購入のちょうど回復に対する実際の購入を追跡するためフラリーと統合していますということですが、私のSKPaymentTransactionさんtransactionStateは常にSKPaymentTransactionStatePurchasedではなくSKPaymentTransactionStateRestoredとして戻ってきます。

明らかには、​​の場合にのみ呼び出されますが、このメソッドはいつ呼び出すのですか?

私の思考プロセスは、購入が次のようになることです。1)ユーザーが製品を選択します。2)X量のために製品を購入するかどうかを尋ねられます。 3)サーバは、ユーザが以前に購入したかどうかをチェックし、SKPaymentTransactionStateRestoredを設定して復元したかどうかをチェックします。それ以外の場合は、トランザクションを処理してSKPaymentTransactionStatePurchasedと設定します。どうやらこれは間違っていて、私は​​の間のどこかに電話すると思いますか?

おかげで、

ウィル

+2

あなたはhttp://stackoverflow.com/questions/1757467/when-to-use-restorecompletedtransactions-for-in-app-purchasesをご覧ください。 は、私の場合、私は –

+0

おかげMicazeveを「以前のトランザクションの復元」ボタンでそれを使用しますが、ユーザーはちょうどので、スキップし続け、ボタンを「復元」と買い戻しにしようと経由して復元押すスキップ可能性のような分析的な観点からそれが聞こえますユーザーが購入したかどうか分析します。おそらく、トランザクションをすぐに開始するのではなく、製品を選択するときに、リストア・コンプリート・トランザクションを呼び出すときに、選択された製品がそのリストに含まれているかどうかを確認し、そうでない場合は、 。そのような痛み... – Will

+0

すでに購入したアイテムを買戻ししようとすると、既にこのアイテムを購入したことをユーザーに警告するので、このボタンは不要です。この状況での主な問題は、彼が再び支払いを受け入れた後に警告されているということです。ユーザーが支払い手順をもう一度行う必要がないため、「復元ボタン」は心理的な方法で役立ちます。あなたが言ったように、そのような痛み;) –

答えて

7

EDIT:

元々、私は必要なものを得るために非常に長く、不必要な方法を投稿しましたが、以下に示すように、Mattは私がvari私が探していたことができました。

たとえば、以前にユーザーが自分のアプリを購入し、使用できないIAPをすべて購入してからアプリを削除したとします。ユーザーがアプリを再インストールするとき、私は彼らがいつ再び製品を購入するのかを判断できるようにしたいのですが、これは元の(初めての)購入か修復購入ですか?

私は「すべての購入を復元する」ボタンを実装しましたが、ユーザーはそれを見ていない/見ていないとし、前に購入した商品を選択しようとします。

通常の購入と同じように、私は、次の手順を実行します。ユーザーは自分のiTunesアカウントにログインした

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

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

した後、アプリケーションは、彼らがすでにこれを購入しているし、それが今で復元されますお知らせいたします。以下のデリゲートメソッドが呼び出されます。

-(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.transactionStateSKPaymentTransactionStatePurchasedに等しいことになるだろう。

ここから、その購入が元の購入か修復購入かどうかをどのように判断するのですか?シンプル

:上記からわかるように、transaction.originalTransactionが初期化されている場合だけ表示されます。 Appleの注記://状態がSKPaymentTransactionStateRestoredの場合のみ有効です。

SKPaymentTransactionoriginalTransactionが初期化されている場合は、前回のトランザクションがあったことを意味します。それ以外の場合、このトランザクションは元のトランザクションです。

もう一度、正しい方向に私を指しているためとロジックロットクリーナーを作るためのマットに感謝!

+1

ボタンの周りには実用的な方法はありません」と言い、何かを「再購入」すれば、元の購入か修復購入かを区別できません」と区別する必要はありません。店はそれを差別化します。購入を待ち行列に入れ、このユーザーが既にこの購入を行った場合、店はユーザーに支払いを再度請求することなくそれを供給します。 – matt

+0

Matt、私はそれがユーザーに2回請求されないことを知っていますが、購入記録(私のインスタンスではFlurryでイベントをログに記録しますが、データをデータベースに保存するために使用することもできます)オリジナル購入と修復。 – Will

+2

私はまだ同意しない。店に何をするのかを店に任せてください。ユーザーが店舗のダイアログ(「これを既に購入しました。再ダウンロードしますか?」)を確認します。それが復元であれば、トランザクションオブザーバに通知されると、トランザクションは 'originalTransaction'値を持ち、あなたの差異(およびすべての元のデータ)があります。 – matt

2

あなたはアプリ内購入を実装している場合は、は、あなたのアプリそれ以外の場合は、拒否の理由があるのどこかに、復元ボタンを配置する必要があります。あなたはGet list of purchased products, inApp Purchase iPhoneを1つの発生率で見ることができます。

EDIT 2:拒否を避けるためにボタンを置く以外の方法があるかもしれません。コメントの中で示唆されている1つの方法は、アプリの起動時に復元することです。リンゴのガイドラインに準拠するには十分です。

はまた、このチュートリアルの最後の部分を見て、それは同じ問題に言及し、それを実装する1つの簡単な方法を示しています http://www.raywenderlich.com/21081/introduction-to-in-app-purchases-in-ios-6-tutorial

EDIT:

//Draft implementation of transaction observer delegate 

-(void) paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions 
{ 
    for (SKPaymentTransaction * transaction in transactions) { 
     switch (transaction.transactionState) 
     { 
      case SKPaymentTransactionStatePurchased:     
       ... 
      case SKPaymentTransactionStateFailed: 
       ... 
      case SKPaymentTransactionStateRestored: 
       ... 
      default: 
       break; 
     } 
    }; 
} 
+0

本当に本当ですか?ドキュメントは、ボタンを完全にスキップできることを意味しています。たとえば、起動時にリストアを行うことができます。また、リストアがない場合でも、ユーザーは再度購入を行うことができ、2回目の料金は請求されません。なぜ、復元ボタンがない場合、店舗は気にする必要がありますか? – matt

+0

私は全くあなたに同意します。私が書いたことは、私がここやそこで読んだことのまとめです。私はまだアプリ内サポートでアプリを提出していません。打ち上げ時の復元は最も説得力のある解決策であると思われます。私はあなたの言ったことに基づいて私の答えを更新します、ありがとう。 – guenis

+2

起動時にパスワードを要求することなく、起動時に復元することはできません。 「 – ngb

6

標準的な期待は、あなたがrestoreCompletedTransactionsを呼び出して復元ボタンを提供することをあるように思われます。ユーザーがこれを無視して購入インターフェースを通過しようとすると、購入した機能を復活させるとどうなるでしょうか?あなたは不必要に心配しているかもしれません。 docsは言う:ユーザーが(代わりにあなたが実装され、リストアインタフェースを使用しての)復元製品を購入しようとした場合

、アプリケーションがその項目ではなく、復元トランザクションのための定期的なトランザクションを受け取ります。ただし、は、その製品に対して再度請求されることはありません。アプリケーションは、これらのトランザクションを元のトランザクションと同じように扱う必要があります。

ストアでは、ユーザーと対話するダイアログが表示されます(「これを既に購入していますが、もう一度無料でダウンロードしますか?」)。無料の再購入の通知は、あなたのpaymentQueue:updatedTransactions:はいつものように、originalTransaction.transactionIdentifierを使って元の購入でそれを識別することができます。

それはと言いますと、アップルIOS SDKドキュメントは、実際にこの問題で誤解を招くされ
+0

あなたのコメントの後に私の回答を更新しましたが、「復元ボタンなしでOKです」と推測されたのはこの部分だけです。十分ではないと思います。 – guenis

+0

@guenisそれは私が見つけようとしているものです。 Appleは何を求めていますか?彼らは実際のボタンを主張していますか?一方では、これは必要ではないと思うでしょうが、他方では、「ユーザーがこれらの購入を復元できるようにするインターフェイスを含める必要があります」と言います。それで、あなたにはボタンが必要なように私には聞こえます。だから私のここでのポイントは、大丈夫ですが、ユーザーが復元ボタンを無視して再度購入しようとすると、それはうまくいきません。それは機能し、ユーザーは2回請求されません。 – matt

+0

「購入」が実際に無料で再ダウンロードされたとき(ユーザーが既に所有しているものを「購入」したとき)をいつどのように伝えるかを説明するために私の答えを変更しました。 – matt

0

@property(nonatomic, readonly) SKPaymentTransaction *originalTransaction 
The contents of this property are undefined except when transactionState is set to SKPaymentTransactionStateRestored. 

問題は、ユーザーが購入ボタンをクリックすると、購入プロセスを経ることで、最終的にメッセージが表示されます彼はすでに支払っていると、彼は無料でredownloadすることができます、あなたの観察者はあなたにSKPaymentTransactionStateRestoredを送信しません。それは実際にあなたにSKPaymentTransactionStatePurchasedを送信します。

良いニュースは、あなたのトランザクションの状態がSKPaymentTransactionStatePurchased場合でもドキュメントにもかかわらず、あなたが実際にプロパティoriginalTransactionを取得することです。このプロパティがゼロであるかどうかを確認するだけで、トランザクションが新規購入であるか、無料で購入された古い購入であるかがわかります。

関連する問題