Покупка в приложении проходит успешно в SandBox, но отклонена группой обзора

Мы недавно были отклонены группой обзора за проблему покупки в приложении.

Мы обнаружили одну или несколько ошибок в вашем приложении при проверке на iPhone под управлением iOS 8.2 как в Wi-Fi, так и в сотовых сетях. В частности, транзакция покупки в приложении не может быть завершена. Шаги для воспроизведения:

  1. Запустить приложение
  2. Перейдите на вкладку "Купить / пополнить"
  3. Приступить к покупке одного из продуктов покупки в приложении
  4. Появится окно подтверждения покупки в приложении
  5. Подтвердите покупку
  6. Покупка в приложении приводит к ошибке

НО! In-App Purchase хорошо работает в песочнице! Мы проверили журнал на нашем сервере, но не можем найти журналы проверки квитанции. Похоже, что окно завершения покупки вообще не появилось.

Мы обнаружили, что иногда будем использовать следующий код:

SKPayment *payment = [SKPayment paymentWithProductIdentifier:productIdentifier];
[[SKPaymentQueue defaultQueue] addPayment:payment];

Это ЕДИНСТВЕННАЯ причина? TT

РЕДАКТИРОВАТЬ: Мы выпустили несколько версий раньше. На этот раз мы добавили новый продукт. Но мы забыли добавить его идентификатор в следующий массив.

-(void)requestProducts
{
    if (_products) {
        return;
    }
    NSSet* identifiers = [NSSet setWithObjects:
                          @"identifier",
                          @"new identifier",  // forgot this line
                          nil];
    SKProductsRequest* _request = [[SKProductsRequest alloc] initWithProductIdentifiers:identifiers];
    _request.delegate = self;
    [_request start];
    _requestProcessing = YES;
}

Таким образом, следующий код вернет ноль:

-(SKProduct*)getProduct:(NSString *)identifier
{
    if (_products) {
        for (SKProduct* product in _products) {
            if ([product.productIdentifier isEqualToString:identifier]) {
                return product;
            }
        }
    } else if (!_requestProcessing) {
        [self requestProducts];
    }
    return nil;
}

Когда пользователь покупает продукт:

-(void)buyProductIdentifier:(NSString *)productIdentifier
{
    if (![self isNetworkOK] || ![SKPaymentQueue canMakePayments]) {
        [[NSNotificationCenter defaultCenter] postNotificationName:NotifyPurchaseFailed object:productIdentifier];
        return;
    }

    NSLog(@"Buying %@...", productIdentifier);
    SKProduct* product = [self getProduct:productIdentifier];
    if (product) { // the new identifier gets nil here
        SKPayment* payment = [SKPayment paymentWithProduct:product];
        [[SKPaymentQueue defaultQueue] addPayment:payment];
    } else {  // calls the deprecated api
        SKPayment *payment = [SKPayment paymentWithProductIdentifier:productIdentifier];
        [[SKPaymentQueue defaultQueue] addPayment:payment];
    }
}

НО, он хорошо работает в песочнице.

-(void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions
{
    for (SKPaymentTransaction *transaction in transactions)
    {
        switch (transaction.transactionState)
        {
            case SKPaymentTransactionStatePurchased:
                [self completeTransaction:transaction];
                break;
            case SKPaymentTransactionStateFailed: // may break here
                [self failedTransaction:transaction];
                break;
            case SKPaymentTransactionStateRestored:
                [self restoreTransaction:transaction];
            default:
                break;
        }
    }
}

Любая идея? Все продукты на itunes connect находятся в утвержденном состоянии, кроме нового. Новый продукт находится в состоянии ожидания проверки.

0 ответов

Другие вопросы по тегам