Q: How I can detect when this event (currently subscribed) has occurred so that I can process the transaction and grant access to my app.
Apple との検証 (私はこれを行うために PHP Web サイト コードを使用します) を介してサブスクリプションが存在することを検出し、「ステータス コード」応答を取得し、それがコード 21006 (サブスクリプションの有効期限が切れている) であるか、またはその他 (私は0 と 21006 以外は実際のエラーと見なします)。
私が行う方法は、トランザクションの詳細をドキュメント ディレクトリに保存する PLIST ファイル内に保存することです。
expiryDates、ブール値フラグなどの追加フィールドを PLIST に追加できます。
この方法で領収書のコピーを取得できますが、有効期限が切れている可能性があるため、常に検証する必要があります。
Q: オブザーバーの paymentQueue:updatedTransactions: メソッドで、SKPaymentTransactionStateFailed として通過しています。このタイプの失敗と、ユーザーがキャンセル ボタンを押したなどの他の失敗をどのように区別すればよいですか?
updatedTransactions メソッドで switch ステートメントを使用して、さまざまな種類の応答を決定します。
例
-(void)paymentQueue:(SKPaymentQueue *)queue restoreCompletedTransactionsFailedWithError:(NSError *)error
{
NSString *message = [NSString stringWithFormat:@"Transaction failed with error - %@", error.localizedDescription];
NSLog(@"Error - %@", message);
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Error"
message:message
delegate:nil
cancelButtonTitle:@"OK"
otherButtonTitles:nil];
[alertView show];
[alertView release];
}
-(void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions
{
NSLog(@"updatedTransactions");
for (SKPaymentTransaction *transaction in transactions)
{
switch (transaction.transactionState)
{
case SKPaymentTransactionStatePurchasing:
// take action whilst processing payment
break;
case SKPaymentTransactionStatePurchased:
// take action when feature is purchased
break;
case SKPaymentTransactionStateRestored:
// take action to restore the app as if it was purchased
break;
case SKPaymentTransactionStateFailed:
if (transaction.error.code != SKErrorPaymentCancelled)
{
// Do something with the error
} // end if
break;
default:
break;
} // end switch
} // next
TransactionStateFailed は失敗を処理しますが、アプリでキャンセルを行う理由がないため、キャンセルのコーディングは行いません。
Q: 返されたトランザクションを送信しますか、それとも restorePreviousTransactions を呼び出す必要がありますか?
私は、StoreKitがfinishTransactionメソッドとrestorePreviousTransactionメソッドでこれを内部的に処理すると信じています
つまり、
[[SKPaymentQueue defaultQueue] finishTransaction: transaction];
取引を終了する
これが役立つことを願っています