#iphone #in-app-purchase
#iPhone #покупка в приложении
Вопрос:
Нарушены ли восстановленные транзакции в SDK 4.3?
Я пытаюсь восстановить свою подписку с автоматическим продлением. Это не приводит к обратному вызову обновленных транзакций. Вот мой код.
{
....
[appDelegate.inapp loadStore];
[[SKPaymentQueue defaultQueue] restoreCompletedTransactions];
....
}
Ожидаете обратного вызова для updatedTransactions, но не получаете его.
- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions
{
NSLog(@"IN updatedTransactions, transaction.transactionState");
for (SKPaymentTransaction *transaction in transactions)
{
switch (transaction.transactionState)
{
...
...
case SKPaymentTransactionStateRestored:
NSLog(@"IN updatedTransactions, SKPaymentTransactionStateRestored");
[self restoreTransaction:transaction];
break;
}
}
}
Но я получаю вызов этого в конце.
-(void) paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue {
}
Комментарии:
1. Это исправлено? У меня такая же проблема, и я нигде не могу найти решение.
Ответ №1:
Это все еще может (1) произойти, если вы тестируете в среде изолированной среды и ваш тестовый пользователь поврежден. Создайте нового тестового пользователя в iTunes Connect и повторите попытку.
Не совсем ясно, что заставляет тестовых пользователей выходить из строя; насколько я понимаю, это может привести к их однократному использованию в среде, отличной от изолированной среды, но могут быть и другие причины.
(1) Xcode 4.3.1, iOS SDK 5.1
Комментарии:
1. Я столкнулся с несколькими «поврежденными тестовыми пользователями» (создав более 400 текстовых пользователей песочницы). Я не вижу, что, по-видимому, их нарушает, но я еще не использовал тестовых пользователей для покупки приложения «prod».
2. Отлично, спасибо. Эти тестовые пользователи очень деликатны — создание дополнительных тестовых пользователей во время тестирования стало моим процессом тестирования.
3. Ого! Мой тестовый пользователь «испортился» too…It это очень маленький образец, но мой, похоже, испортился после того, как мое приложение прошло проверку Apple … возможно, это связано?
4. Вау — вот еще одна жертва «плохого» тестируемого пользователя. Я подозреваю, что если вы попытаетесь настроить учетную запись в системных настройках и продолжите проверять ее как реальную учетную запись (кредитные карты и т.д.), Это приведет к сбою.
5. Как я могу определить, не нарушен ли мой тестовый пользователь?
Ответ №2:
Обязательно добавьте observer перед использованием [[SKPaymentQueue defaultQueue] restoreCompletedTransactions];
Ваш код должен быть чем-то вроде:
[[SKPaymentQueue defaultQueue] addTransactionObserver:self];
[[SKPaymentQueue defaultQueue] restoreCompletedTransactions];
Ответ №3:
Я смог обойти это, но это очень странно. На моем тестовом устройстве iTunes прослушивает меня для входа в несколько учетных записей тестовых пользователей. Обычно я просто нажимаю «Отмена» и тестирую восстановление с помощью учетной записи, которую хочу восстановить. На этот раз я решил ввести пароль для этих других раздражающих полей входа. Это сработало, и в следующий раз, когда я перезапустил свое приложение и нажал «Восстановить», мне не пришлось входить в другие тестовые учетные записи, только в ту, которую я тестировал. Я продолжил восстановление, и оно восстановило элементы, которые я хотел видеть.
Я говорю, что мы сталкивались с глупыми проблемами с песочницей, а также мы знаем, что Apple изменила порядок покупки приложений в целом. Продолжайте играть с этим, у вас все получится.
Надеюсь, это поможет вам.
Комментарии:
1. Apple вернулась к моему запросу. Это ошибка с 4.3.1. Похоже, теперь они ее исправили.
2. все еще сталкиваетесь с той же проблемой в iOS 5.0
3. все еще сталкиваетесь с той же проблемой на iOS 6 и iOS 7. Да ладно, Apple.
4. Ввод пароля для всех тестовых пользователей сработал для меня
Ответ №4:
Расходные материалы восстановлению не подлежат.
Непотребляемые продукты могут быть восстановлены.
Проверьте, относятся ли ваши продукты к типу непотребляемых.
Комментарии:
1. Но в этом методе нет
SKProduct
параметра,SKPaymentQueue.default().restoreCompletedTransactions()
.
Ответ №5:
Обратный вызов updatedTransactions вам не понадобится, если вы получаете paymentQueueRestoreCompletedTransactionsFinished. В «очереди» есть список ваших транзакций, и вы можете просматривать их в цикле.
- (void)paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue
{
for (SKPaymentTransaction *transaction in queue.transactions)
if ([myItem.productID isEqualToString:transaction.payment.productIdentifier])
myItem.purchased = YES;
}
Комментарии:
1. Это из документации Apple. «Этот метод вызывается после того, как все восстанавливаемые транзакции были обработаны очередью платежей. От вашего приложения не требуется ничего делать в этом методе «. Я также чувствую, что это ошибка в iOS, но я сталкиваюсь с ней в iOS 5.0, поэтому не уверен, почему комментарий в приведенном выше ответе okgo говорит, что это исправлено.
Ответ №6:
Убедитесь, что в вашем номере сборки в Xcode нет пробела. Например, «1.0 Beta». С пробелом updatedTransactions вызываться не будут. Также проверка получения может завершиться ошибкой.
Ответ №7:
Два дополнительных момента, которые здесь не были упомянуты:
- Если вы используете Firebase, убедитесь, что вы добавили наблюдателя перед инициализацией Firebase, https://firebase.google.com/docs/analytics/get-started?platform=ios
- Убедитесь, что вы вызываете метод finishTransaction при обработке покупки. Вы не сможете восстановить незавершенные транзакции.