6

iPhone アプリケーションの開発中に、restoreCompletedTransactions にかなりの問題があります。以下に示すすべての問題は、サンドボックス環境で作業しているときに発生します。アプリはまだ販売されていません。シミュレーター 5.0 および 5.1 で実行される Xcode 4.3.2 で開発されています。私が得る問題は次のとおりです。

  1. アプリケーションが起動し、addTransactionObserver への呼び出しが行われるたびに、updatedTransactions が呼び出され、トランザクションが購入されます。コールバックごとに、私のコードは finishTransaction: を呼び出して購入を完了しますが、アプリケーションを起動するたびにこの問題が発生し続けます。まったく同じ購入の確認が入ります。
  2. [[SKPaymentQueue defaultQueue] restoreCompletedTransactions] を呼び出しても、そのアカウントで購入したすべての非消耗品が一覧表示されるわけではありません。非消耗品を 2 回購入しましたが、毎回 1 つしか返品されません。リストにないアイテムを購入しようとすると、そのアイテムが既に購入されていることを示すメッセージが表示されます。リストにないアイテムは、問題 1 (上記のリスト) が発生するアイテムではありません。

この時点で、私は完全に立ち往生しています。私のアプリケーションは、非消耗品に関する情報を返すために AppStore に依存しています。これは、このデータを独自のサーバーに保存していないためです。ただし、AppStoreKit が購入したすべてのアイテムを含むリストを返すことを確認する必要があります。一部だけではありません。

これは、restoreCompletedTransactions をテストするために使用している関連コードです。

- (void) paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions
{
    NSLog(@"updatedTransactions started. -+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ");
    NSLog(@"Number of transactions received: %d.", [transactions count]);
    int count = 0;
    for (SKPaymentTransaction *trans in transactions)
{
    NSLog(@"Data for transaction %d: ", ++count);
    NSString *transId = [trans transactionIdentifier];
    switch ([trans transactionState])
    {
        case SKPaymentTransactionStatePurchasing:
            NSLog(@"Purchasing transaction: %@", transId);
            if (transId == nil)
            {
                NSLog(@"    Original transaction Id: %@", [[trans originalTransaction] transactionIdentifier]);
            }

            NSLog(@"     No action taken in update");
            break;
        case SKPaymentTransactionStateFailed:
            NSLog(@"Purchase transaction failed for transaction %@", transId);
            NSLog(@"     Error %d (%@)", [[trans error] code], [[trans error] localizedDescription]);
            NSLog(@"     Action Taken:  finish transaction.");
            [queue finishTransaction: trans];
            break;
        case SKPaymentTransactionStatePurchased:
            NSLog(@"Purchased transaction %@", transId);
            NSLog(@"     Purchased qty %d of  product %@", [[trans payment] quantity], [[trans payment] productIdentifier]);
            NSLog(@"     Action: called [queue finishTransaction:] to complete purchase");
            [queue finishTransaction: trans];
            break;
        case SKPaymentTransactionStateRestored:
        {
            SKPayment *paym = [trans payment];
            SKPaymentTransaction *origTrans = [trans originalTransaction];
            SKPayment *origPayment = [[trans originalTransaction] payment];
            NSLog(@"Transaction restored: %@ with original transaction %@", transId, [[trans originalTransaction] transactionIdentifier]);
            NSLog(@"     TRANSACTION DATA:");
            NSLog(@"           purchased %d of product %@ on %@.", 
                  [paym quantity], 
                  [paym productIdentifier], 
                  [[trans transactionDate] description]);

            NSLog(@"     ORIGINAL TRANSACTION DATA:");
            NSLog(@"           purchased %d of product %@ on %@.", 
                  [origPayment quantity], 
                  [origPayment productIdentifier], 
                  [[origTrans transactionDate] description]);

            NSLog(@"     No action taken.");
            break;
        }

        default:
            NSLog(@"Unexpected transaction state:  %d", [trans transactionState]);
            NSLog(@"     No action taken.");
            break;
    }
}

NSLog(@"");
NSLog(@"updatedTransactions ended. -+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ");
}

- (void) paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue
{
NSLog(@"Restore completed transactions finished.");
NSLog(@"     Number of transactions in queue:  %d", [[queue transactions] count]);
for (SKPaymentTransaction *trans in [queue transactions])
{
    NSLog(@"          transaction id %@ for product %@.", [trans transactionIdentifier], [[trans payment] productIdentifier]);
    NSLog(@"          original transaction id: %@ for product %@.", [[trans originalTransaction] transactionIdentifier],
          [[[trans originalTransaction] payment]productIdentifier]);
    }
NSLog(@"");
}

// Method to restore transactions when user clicks button in application
- (void) onRestoreCompletedTransactions:(id)sender
{
    [[SKPaymentQueue defaultQueue] restoreCompletedTransactions];
}
4

2 に答える 2

0

アプリケーションが起動するたびに restoreCompletedTransactions を呼び出そうとしていますか? すべてのトランザクションのリストが必要な場合は、SKProductsRequest を作成します。

 SKProductsRequest *productsRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:productsSet];
    productsRequest.delegate = self;
    [productsRequest start];

completedTransactions を取得したいが、すべてを取得していない場合は、ログを表示してください。

于 2012-07-23T17:30:11.693 に答える
0

SKProductsRequest は、SKProduct インスタンスのリストを取得します。SKProduct クラスは、私の読みでは情報を購入していません。本当に restoreCompletedTransactions を使用して SKPaymentTransaction インスタンスのリストを取得したいと思います。そうは言っても、サンドボックス化されたアカウントで同じ問題が発生しています。トランザクションの不完全なリストが返されます (48 のうち 23)。しかし、購入されたが復元されていない非消耗品を購入することを選択した場合、ストアはそれがすでに購入されたアイテムであり、そのアイテムの復元を送り返します.

これを解決する運はありますか?

于 2014-02-07T19:20:20.423 に答える