編集:
もともと、私は必要なことを行うために非常に長い不必要なメソッドを投稿していましたが、以下に示すように、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 の場合にのみ有効。
が初期化されている場合は、以前SKPaymentTransaction
のoriginalTransaction
トランザクションがあったことを意味します。そうでなければ、この取引はオリジナルのものです!
繰り返しになりますが、私を正しい方向に導き、ロジックをよりきれいにしてくれた Matt に感謝します!