Покупка в приложении проходит успешно в SandBox, но отклонена группой обзора
Мы недавно были отклонены группой обзора за проблему покупки в приложении.
Мы обнаружили одну или несколько ошибок в вашем приложении при проверке на iPhone под управлением iOS 8.2 как в Wi-Fi, так и в сотовых сетях. В частности, транзакция покупки в приложении не может быть завершена. Шаги для воспроизведения:
- Запустить приложение
- Перейдите на вкладку "Купить / пополнить"
- Приступить к покупке одного из продуктов покупки в приложении
- Появится окно подтверждения покупки в приложении
- Подтвердите покупку
- Покупка в приложении приводит к ошибке
НО! 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 находятся в утвержденном состоянии, кроме нового. Новый продукт находится в состоянии ожидания проверки.