Apple отвергает из-за того, что в приложении покупка не реализует восстановление - программирование
Подтвердить что ты не робот

Apple отвергает из-за того, что в приложении покупка не реализует восстановление

Я получил отказ от Apple с сообщением:

... Кроме того, мы обнаружили, что, хотя ваше приложение предлагает In-App Purchase (s) который может быть восстановлен, он не включает требуемое "Восстановление", чтобы пользователи могли восстановить ранее приобретенное приложение In-App Покупка (ы), как указано в разделе "Восстановление транзакций" Руководство по программированию при покупке приложений:

"... если ваше приложение поддерживает типы продуктов, которые должны быть восстанавливаемый, вы должны включить интерфейс, который позволяет пользователям восстанавливать эти покупки. Этот интерфейс позволяет пользователю добавлять продукт в других устройств или, если оригинальное устройство было вытерто, чтобы восстановить транзакции на исходном устройстве."

Чтобы восстановить ранее приобретенные продукты In-App Purchase, это будет чтобы обеспечить кнопку "Восстановить" и инициировать восстановление когда кнопка "Восстановить" нажата пользователем.

Дополнительные сведения о восстановлении транзакций и проверке хранилища получения, обратитесь к Руководству по программированию при покупке приложений....

И я нашел эту страницу, и я последовал примеру кода, но после того, как я позвонил

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

другой делегат не был уволен!

- (void) paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue

Он только отображает предупреждение, чтобы вы могли ввести свой идентификатор Apple... и ничего не произошло?

Я установил точку останова, но это не остановится, как сказал пример.

Любые идеи о том, что не так с моим кодом?

4b9b3361

Ответ 1

В дополнение к добавлению restoreCompletedTransactions вам необходимо обработать, как ваши iaps фактически восстанавливаются пользователю и как контент предоставляется пользователю.

В принципе, вам нужно вспомнить, как вы предоставляете этот элемент своему пользователю, когда они его купили.

Вот хороший учебник.

Для примера, это то, как я восстанавливаю продукты в одном из моих приложений.

Восстановить транзакцию

- (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];
}

Ответ 2

[[SKPaymentQueue defaultQueue] addTransactionObserver:self];
[[SKPaymentQueue defaultQueue] restoreCompletedTransactions];

Добавить предыдущую строку. Ваша функция paymentQueueRestoreCompletedTransactionsFinished должна быть вызвана.