7

iOS アプリのアプリ購入で更新可能なサブスクリプションを使用しています。ユーザーが支払い済みのサブスクリプションを購入しようとすると、iTunes から「現在、これをサブスクリプションしています」というメッセージが表示されます。

このイベントがいつ発生したかを検出して、トランザクションを処理し、アプリへのアクセスを許可する方法。

オブザーバーの paymentQueue:updatedTransactions: メソッドでは、SKPaymentTransactionStateFailed として通過します。このタイプの失敗と、ユーザーがキャンセル ボタンを押したなどの他の失敗をどのように区別すればよいですか?

返されたトランザクションを送信するか、restorePreviousTransactions を呼び出す必要がありますか。

Apple のドキュメントには、「ユーザーが非消費型製品または購入済みの更新可能なサブスクリプションを購入しようとすると、アプリケーションは復元トランザクションではなく、そのアイテムの通常のトランザクションを受け取ります。ただし、ユーザーは再度課金されません。アプリケーションは、これらのトランザクションを元のトランザクションと同じように処理する必要があります。」

4

1 に答える 1

1
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];

取引を終了する

これが役立つことを願っています

于 2011-11-15T11:51:28.290 に答える