Многозадачность и SKPaymentQueue Я получаю «зависшую» SKPaymentTransaction с транзакциейState of SKPaymentTransactionStatePurchasing - PullRequest
4 голосов
/ 31 декабря 2011

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

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

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

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

При покупке приложения пользователь отменяет передачу, когда приложение в фоновом режиме: состояние покупки остается при покупке

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

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

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

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

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

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

Спасибо!

1 Ответ

0 голосов
/ 07 марта 2012

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...