Мой вопрос в основном заключается в том, как воспроизвести поведение, которое я вижу в других приложениях в магазине приложений в отношении покупок в приложении:

  • Сразу после того, как пользователь нажимает «Купить», кнопка скрывается, и отображается счетчик (по сути, устраняющий отскок действия «Купить»).
  • Пользователь, нажимающий кнопку "Отмена" в диалоговом окне StoreKit (в приложении или вне его), приводит к исчезновению счетчика.

Я пытаюсь показать и скрыть счетчик на основе наблюдения за состоянием транзакций в SKPaymentQueue.

Моя проблема описана этим плакатом:

В App Purchase пользователь отменяет tx, пока приложение находится в фоновом режиме: состояние tx остается при покупке

Я вижу то же поведение, что и в сообщении выше, независимо от того, вошел ли тестовый пользователь первым или нет. Транзакция в основном «застряла» в очереди с состоянием покупки навсегда (это означает, что мой счетчик отображается навсегда). Когда приложение полностью закрыто и перезапущено (а не просто многозадачно), транзакция больше не находится в очереди платежей, поэтому на самом деле это явно не покупка. Это похоже на то, что SKPaymentQueue «пропустил» изменение состояния.

Еще одна деталь, которую я заметил, заключается в том, что в типичном случае сразу после добавления платежа транзакция появляется в очереди с состоянием покупки. Если пользователь нажимает кнопку «Отмена», транзакция переходит в состояние «сбой».

В случае отмены задачи сразу после добавления платежа транзакция не появляется в очереди до тех пор, пока задача не будет возвращена в приложение. Вместо двух вызовов делегата updatedTransactions (один с состоянием покупки и один с состоянием отказа) есть только один вызов делегата updatedTransactions с состоянием покупки. Транзакция никогда не становится неудачной.

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

Я не могу воспроизвести это поведение в приложениях в магазине приложений (они всегда правильно показывают/скрывают счетчик, независимо от того, отстранены ли они от задачи или нет), но мне не ясно, связано ли это с тем, что они делают что-то хитрое, или это только проблема в песочнице.

Как воспроизвести это поведение, если не отслеживать состояние транзакции? Это не проблема в производстве?

Благодарность!

6
Jeremy 31 Дек 2011 в 05:36
Итак, еще один связанный пост: stackoverflow.com/questions/4938048/…, но просто чтобы уточнить, мой вопрос: что люди делают, чтобы обойти эту ошибку?
 – 
Jeremy
31 Дек 2011 в 05:48

1 ответ

Я использовал MKStoreKit для всех своих приложений.

Он имеет блочный интерфейс, который сообщает вам, когда транзакция началась (чтобы скрыть кнопку и начать анимацию).

Он также сообщит вам, если транзакция не удалась или она была завершена, поэтому вы можете остановить анимацию и восстановить кнопку (если она не удалась) или показать что-то еще, когда она будет завершена.

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

-1
Zebs 7 Мар 2012 в 01:23