Всегда ли необходимо обновить квитанцию ​​sh, если вы используете проверку квитанции на стороне сервера? - PullRequest
0 голосов
/ 08 апреля 2020

Я создал приложение с автоматически обновляемыми подписками.

Ниже приведен лог c, который я использую, чтобы узнать, есть ли у пользователя активная подписка.

  • Всякий раз, когда вызывается paymentQueue(_:updatedTransactions:) из SKPaymentQueue, я пытаюсь выполнить проверку квитанции, используя следующие шаги
  • Я проверяю, присутствует ли локальная квитанция. Если его нет, я использую SKReceiptRefreshRequest для обновления sh квитанции.
  • Я отправляю информацию о квитанции на конечную точку verifyReceipt сервера App Store.
  • Сервер возвращает ответ который содержит информацию о дате истечения срока подписки.
  • Я храню дату истечения срока действия в приложении и представляю соответствующий пользовательский интерфейс в зависимости от того, есть ли у пользователя активная подписка или нет.

В обзоре App Store мое приложение несколько раз отклонялось из-за ошибки SKReceiptRefreshRequest. Я не могу воспроизвести ошибку, с которой столкнулась доска объявлений App Store.

При поиске в inte rnet для решения проблемы я узнал следующие факты о локальной квитанции -

  • Местный чек всегда присутствует в производственном режиме. Локальная квитанция может не отображаться, если приложение установлено с помощью Testflight или во время тестирования. ( ссылка )
  • Сервер App Store вернет самую последнюю информацию о подписке, даже если он отправил старую локальную квитанцию ​​( ссылка )

Из приведенных выше двух частей информации я делаю вывод, что больше нет необходимости звонить SKReceiptRefreshRequest на производстве, поскольку сервер App Store предоставит самые последние данные, даже если локальная квитанция устарела, а локальная квитанция всегда присутствует на производстве .


Чтобы получить мое приложение через обзор App Store, я решил удалить SKReceiptRefreshRequest, поскольку он выдает ошибки в сборках Testflight и не требуется в рабочей среде.

Кто-нибудь может подтвердить, правильно ли я это сделал?

Ответы [ 2 ]

1 голос
/ 09 апреля 2020

Ваш лог c имеет несколько fl aws:

1) paymentQueue(_:updatedTransactions:) вызывается в фоновом режиме и (насколько я знаю) обновляет уже локальную квитанцию. Также приложение, загруженное из App Store, всегда содержит квитанцию. Таким образом, нет необходимости вызывать SKReceiptRefreshRequest в этом методе.

2) SKReceiptRefreshRequest требует, чтобы пользователи вводили его пароль, чтобы разрешить квитанцию ​​refre sh. Поскольку вы вызвали метод в paymentQueue(_:updatedTransactions:), который вызывался в фоновом режиме, я считаю, что это проблема, из-за которой запрос refre sh не был выполнен, и Apple отклонила ваше приложение. Тем не менее, этот метод имеет свою причину: на производстве вам нужно, чтобы он позволял пользователям восстанавливать покупки после переустановки приложения или на других устройствах, а также для отладки и сборки TestFlight он нужен для получения последней квитанции.

3 ) Не следует отправлять квитанцию ​​из вашего приложения на конечную точку Apple

Предупреждение

Не вызывать конечную точку сервера App Store verifyReceipt из вашего приложения. Вы не можете создать надежное соединение между устройством пользователя и App Store напрямую, потому что вы не контролируете ни один конец этого соединения, что делает его уязвимым для атаки «человек посередине».

Источник

Как действовать?

Я бы порекомендовал сделать следующее:

1) Не вызывайте SKReceiptRefreshRequest в paymentQueue(_:updatedTransactions:)

2) Если это еще не сделано, добавьте в свое приложение кнопку «восстановить покупки» (которая вызывает SKReceiptRefreshRequest)

3) Внедрить локальный или сервер-сервер подтверждение получения

0 голосов
/ 09 апреля 2020

Я использовал следующий способ генерации квитанции и отправки сгенерированной квитанции на сервер для проверки:

https://developer.apple.com/documentation/storekit/in-app_purchase/validating_receipts_with_the_app_store

...