172 похожих чатов

Есть кто-то мастер In-App, подскажите пожалуйста?)) 1. После успешной транзакции покупки

подписки, все ок в очереди приходящих транзакций
2. Если я делаю восстановление покупок, тоже все ок.
3. Если я во время действующей подписки пытаюсь купить снова, то показывает что куплено, транзакция приходит одна, все ок, очередь правильная.
4. Только если я делал п.3, то после перезагрузки приложения единоразово приходит очередь из всех ранее совершенных транзакций с transactionState == .purchased (Например 14 шт, если еще раз подпишусь то теперь будет 15 приходить и тд)

До перезагрузки аппки все отлично, почему после перезагрузеи приходит эта очередь, она совсем нежданная мною. Может есть объяснение и так надо? Может это решаемо? Или это баг и нужно просто добавить костыль?

18 ответов

9 просмотров

А ты завершаешь все транзакции после обработки?

bodich- Автор вопроса
Say my name
А ты завершаешь все транзакции после обработки?

Да. Я для уверенности могу еще несколько раз нажать покупку (при уже купленной подписке), оно возвращает лишь ОДНУ транзакцию, и сообщение что уже куплено. Но как только перезагружаю приложение, прилетают 15 штук .purchased

bodich
Да. Я для уверенности могу еще несколько раз нажат...

this is the Way ;) то есть так задумано самим эпплом. каждый раз когда ты чего то запрашиваешь - генерируется новая транзакция в которой содержится информация об оригинальной транзакции

bodich- Автор вопроса
Say my name
this is the Way ;) то есть так задумано самим эппл...

Но после рестарта прилетают просто все старые, которые я уже завершал ранее и они перестали приходить. Мне их зачем-то снова все пушат... Причем только в случае если я попытался купить уже купленное)))

bodich
Но после рестарта прилетают просто все старые, кот...

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

bodich- Автор вопроса
Say my name
так для этого и пушат чтобы ты проверил и понял чт...

Открыл детали поведения: 1. Если я пытаюсь купить купленное, то в paymentQueue:updatedTransactions приходить только эта одна попытка, но SKPaymentQueue.default() добавляются закулисами все предыдущие, до релоада в делегат они не отправляются. А при рестарте они уже оттуда все приходят в paymentQueue:updatedTransactions

bodich- Автор вопроса
Say my name
так для этого и пушат чтобы ты проверил и понял чт...

Правильно проверять купленные билеты на обновляемую подписку это только через Validate App Store Receipt и вот это все? Без сервера это дело совсем тяжко проверять как я понял? Ибо во входных SKPaymentTransaction только дата покупки хранится, а высчитывать дату окончания это как я понял не принято и вообще может быть ошибочно посчитано?

bodich
Правильно проверять купленные билеты на обновляему...

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

bodich- Автор вопроса
Say my name
да, если делать все по уму - то без своего сервера...

А если допустим забить на валидацию как на безопасность, то как правильно проверить: 1. Истекла подписка или нет по факту 2. Дату окончания подписки

bodich
А если допустим забить на валидацию как на безопас...

отсылать эпплу и получать расшифровку. но ты подставляешься под MitM-атаку

bodich- Автор вопроса
Say my name
отсылать эпплу и получать расшифровку. но ты подст...

Но это они об этом же пишут НЕ ДЕЛАЙ ТАК? Имеется ввиду что просто реджект получу за это или всего лишь предупреждение что лучше бы так не делать?

bodich- Автор вопроса
David Khegay
реджект нет, просто не безопасно

Выходит что для одной лишь операции проверки чека, нужно на каком-нибудь Vapor писать сервер, заливать его на хероку и юзать его лишь для проверки подписки? (((

bodich- Автор вопроса
David Khegay
погугли RevenueCat

Спасибо!!! RevenueCat это лидер выбора или есть ближайший конкурент сравнить?

bodich- Автор вопроса

Похожие вопросы

Обсуждают сегодня

А чем вам питонисты не угодили?😂
.
79
Всем привет, написал код ниже, но он выдает сегфолт, в чем причина? #include <stdio.h> #include <stdlib.h> #include <string.h> struct product { char *name; float price; };...
buzz базз
75
Ещё такой вопрос. Мне необходимо хранить пароль пользователя локально. Для этого планирую использовать ini файл. Это для автозаполнения полей логин и пароль при авторизации. Е...
Евгений
19
Ты просто гитлеровскую эстетику плохо понимаешь. Он же всё под Цезаря делал. А это как бы запрещённый приём в политике. Пиджаки они зачем все носят? Чтобы показать что они тип...
Ivan Kropotkin
4
а чем лучше всего сделать глобальный лок, если много нодов, до сотни? ну то есть мне надо, чтобы некоторые операции с объектом не происходили одновременно. перемещение между н...
Д. П.
15
А как лучше конвертировать физический адрес в виртуальный при маппинге? В случае ядра у меня, например, direct mapping, первые 768МБ я как есть мапплю в higher half, а остальн...
Evg Resh
26
Hi guys, I'm looking for a good LLM course. Is there any course to learn LLMs in advanced? I'm aiming to use them in my apps, so a perfect course in my openion, is not only a ...
Taha
14
База данных не поможет. Шифрование не поможет. Какие там ещё варианты? Накидывайте.
КТ315
20
А табстоп это сообщение от окна или от элемента управления?
The Bird of Hermes
18
$params = [ 'formid' => 'feedbackForm', 'formTpl' => '@CODE: <form class="form-validate" data-id="ajax_form"> <fieldset class="margin-bottom-md"> ...
Pathologic
1
Карта сайта