16

私は次のようなメッセージでAppleに拒否されました。

...さらに、アプリには復元可能なアプリ内購入が含まれていますが、ユーザーが以前に購入したアプリ内購入を復元できるようにするために必要な「復元」機能が含まれていないことがわかりました。アプリ内購入プログラミングガイドの「トランザクションの復元」セクションで指定されているとおり:

「...アプリケーションが復元可能でなければならない製品タイプをサポートしている場合、ユーザーがこれらの購入を復元できるインターフェースを含める必要があります。このインターフェースにより、ユーザーは製品を他のデバイスに追加できます。元のデバイスがワイプされている場合は、元のデバイスでトランザクションを復元します。」

以前に購入したアプリ内購入製品を復元するには、[復元]ボタンを提供し、ユーザーが[復元]ボタンをタップしたときに復元プロセスを開始するのが適切です。

トランザクションの復元とストアの領収書の確認の詳細については、アプリ内購入プログラミングガイドを参照してください。..。

そして、私はこのページを見つけました、そして私はサンプルコードに従いました、しかし私が電話した後

- (void) checkPurchasedItems{
   [[SKPaymentQueue defaultQueue] restoreCompletedTransactions];
}

別の代表は解雇されませんでした!

- (void) paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue

アラートビューをポップアップするだけで、Apple IDを入力できます...何も起こりませんか?

ブレークポイントを設定しましたが、例のように止まりません。

私のコードの何が問題になっているのかについて何かアイデアはありますか?

4

2 に答える 2

18

追加に加えてrestoreCompletedTransactions、iapsが実際にユーザーに復元される方法と、コンテンツがユーザーに提供される方法を処理する必要があります。

基本的に、ユーザーが最初に購入したときにアイテムをユーザーに提供した方法を思い出す必要があります。

これが良いチュートリアルです。

たとえばこれは私のアプリの1つで製品を復元する方法です。

トランザクションの復元

- (void)restoreTransaction:(SKPaymentTransaction *)transaction
{
    isRestoring = YES;

    [self recordTransaction: transaction];

    /* This is where I provide the content to the user: */
    [self provideContent: transaction.originalTransaction.payment.productIdentifier];

    [[SKPaymentQueue defaultQueue] finishTransaction: transaction];
}

トランザクションが完了しました

- (void)completeTransaction:(SKPaymentTransaction *)transaction
{
    [self recordTransaction: transaction];
    [self provideContent: transaction.payment.productIdentifier];
    [[SKPaymentQueue defaultQueue] finishTransaction: transaction];
}

支払いキュー

- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions
{
    for (SKPaymentTransaction *transaction in transactions)
    {
        switch (transaction.transactionState)
        {
            case SKPaymentTransactionStatePurchased:
                [self completeTransaction:transaction];
                break;
            case SKPaymentTransactionStateFailed:
                if (transaction.error.code == SKErrorPaymentCancelled) {
                    /// user has cancelled
                    [[NSNotificationCenter defaultCenter] postNotificationName:@"hideRestoring" object:nil];
                }
                [self failedTransaction:transaction];
                break;
            case SKPaymentTransactionStateRestored:
                [self restoreTransaction:transaction];
            default:
                break;
        }
    }
}

コンテンツを提供する

- (void)provideContent:(NSString *)productIdentifier
{
    int index;

    NSMutableDictionary * purchased = [NSMutableDictionary dictionaryWithContentsOfFile:EXTRAS_PATH];

    NSArray * availableProducts = [NSArray arrayWithContentsOfURL:[NSURL URLWithString:SCANNER_IN_APP_PURCHASES]];

    if ( isRestoring )
    {
        for ( index = 0; index < [availableProducts count]; index++ )
        {
            //NSLog(@"productIdentifier: %@",productIdentifier);
            //NSLog(@"Product: %@",[availableProducts objectAtIndex:index]);

            if ( [productIdentifier isEqualToString:[[availableProducts objectAtIndex:index] objectForKey:@"BundleID"]] )
            {
                [purchased setObject:[availableProducts objectAtIndex:index] forKey:productIdentifier];

                [purchased writeToFile:EXTRAS_PATH atomically:YES];

                [_purchasedProducts addObject:productIdentifier];
            }
        }
    }
    else
    {
        index = [[[NSUserDefaults standardUserDefaults] objectForKey:@"kTempProductPurchasingIndex"] intValue];

        if ( [productIdentifier isEqualToString:[[availableProducts objectAtIndex:index] objectForKey:@"BundleID"]] )
        {
            [purchased setObject:[availableProducts objectAtIndex:index] forKey:productIdentifier];

            [purchased writeToFile:EXTRAS_PATH atomically:YES];

            [_purchasedProducts addObject:productIdentifier];
        }
    }

    [[NSNotificationCenter defaultCenter] postNotificationName:kProductPurchasedNotification object:productIdentifier];
}
于 2012-06-26T03:47:00.367 に答える
10
[[SKPaymentQueue defaultQueue] addTransactionObserver:self];
[[SKPaymentQueue defaultQueue] restoreCompletedTransactions];

前の行も追加します。関数paymentQueueRestoreCompletedTransactionsFinishedが呼び出されるはずです。

于 2012-06-26T04:10:59.403 に答える