SKPaymentTransactionStateFailed, но не NSError

У нас есть приложение с покупками монет IAP. Недавно мы получили письма от нескольких наших пользователей, заявив, что они не могут купить какие-либо монеты. Я посмотрел их журналы сеансов и увидел Failed IAP events, каждый из которых не был зарегистрирован с ошибкой. Вот связанный код:

- (void)_purchaseRequestFailed:(SKPaymentTransaction *)transaction state:(StoreTransactionState)state error:(NSError *)error
{
    IAPProduct *product = [self getProductWithId:transaction.payment.productIdentifier];
    if (error.code==SKErrorPaymentCancelled) {
        [_metricsManager logFailIAP:product failReason:@"Payment canceled"];
    } else {
        [_metricsManager logFailIAP:product failReason:error.localizedDescription];
    }
    if ([_delegate respondsToSelector:@selector(didSucceedPurchasingProduct:)]) {
        [_delegate didFailPurchasingProduct:product];
    }
}

внутри logFailIAP, я регистрирую такие вещи, как время, UDID, имя события и error.localizedDescription.

 if (failReason != nil && failReason.length > 0) {
        [metricsDictionary setObject:failReason forKey:MetricsEventParameterFailReason];
 }

В журналах я получаю Failed IAP-события, но у меня нет причин для сбоев. Есть ли случай, когда вы получаете "SKPaymentTransactionStateFailed", но имеете пустую ошибку .localizedDescription? Я могу подтвердить, что журналы работают, и видели ошибки, такие как "Отмена платежа" и "Не удается подключиться к iTunes", которые регистрируются на других устройствах. Проблема не относится к устройству или iOS.

Ответ 1

Я столкнулся с nil error в следующем сценарии:

  • Пользователь обновляет iOS на своем устройстве.

  • Сразу после обновления пользователь переходит в ваше приложение и пытается совершить покупку.

  • Вместо обычного диалогового окна покупки они получают "условия обслуживания iTunes". Вам нужно принять новые T & C's (или что-то в этом роде), которые перенаправляют их в приложение iTunes и показывают их новые T & C. Затем платеж отменяется, и вы получаете нуль error и, очевидно, nil error.localizedDescription.

Для этого сценария ваше приложение должно быть первым пунктом взаимодействия пользователя с iTunes Store после обновления системы.