Обновление квитанции приложения iOS: как определить, нужно ли пользователю входить в магазин приложений?

Я внедряю унифицированную квитанцию ​​​​Apple Grand Unified в iOS 7, которая позволяет приложению проверять квитанцию ​​​​о покупке приложения локально, не обращаясь к серверам Apple для проверки и проверки. Это прекрасно работает, если у пользователя есть квитанция, хранящаяся в приложении. В случае, если в приложении отсутствует квитанция, лучше всего попросить приложение обновить квитанцию, как таковую:

SKReceiptRefreshRequest *request = [[SKReceiptRefreshRequest alloc] init];
[request setDelegate:self];
[request start];

Проблема в том, что вызов этого кода попросит пользователя войти в систему со своим Apple ID. Я не уверен на 100%, происходит ли это постоянно или только в том случае, если время входа в магазин приложений пользователя истекло. Я не хочу показывать пользователям экран входа в систему Apple ID, если это действительно необходимо — я не хочу, чтобы люди беспокоились о том, что с них будут неправильно сняты средства. Я хотел бы показать дисплей, сообщающий пользователю, почему ему будет предложено ввести свой пароль Apple ID, но только в том случае, если ему действительно потребуется ввести свой пароль. Если им не нужно вводить свой пароль, я хочу, чтобы это был плавный и скрытый процесс. Как лучше поступить? Я думаю, что лучшим способом было бы проверить, нужно ли пользователю входить в магазин приложений, но я не уверен, что это возможно.


person Jason    schedule 25.11.2013    source источник


Ответы (3)


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

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

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

Вам не нужно повторно загружать квитанцию, которая, как вы знаете, не существует. Если пользователь не купил или не восстановил квитанцию, вы можете не пытаться повторно загрузить квитанцию ​​и полностью избежать просмотра предупреждений. Это то, что я сделал:

if([[NSFileManager defaultManager] fileExistsAtPath:[[[NSBundle mainBundle] appStoreReceiptURL] path]] != YES)
{
    SKReceiptRefreshRequest *refresh = [[SKReceiptRefreshRequest alloc] initWithReceiptProperties:nil];
    [refresh start];
}

Я поместил это в свой файл main.m перед основным циклом приложения, поскольку в моем приложении есть много «профессиональных» функций, которые разблокируются с помощью IAP, но вы действительно можете поместить это там, где считаете это уместным.

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

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

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

person Andy Ibanez    schedule 12.01.2014
comment
Документация Apple по этой теме настолько дерьмовая (как и все документы, которые они делают, делали и будут делать — я упоминал, что ненавижу их документы?), что ни у кого здесь нет аргументов, чтобы увидеть, правы вы или нет ???? Надеюсь, ваше решение работает. Спасибо! - person Duck; 13.04.2014
comment
@SpaceDog За исключением этой проблемы с квитанцией, я полностью с вами не согласен. Я думаю, что их документы являются бесценным ресурсом. - person the_critic; 22.01.2016
comment
Apple заявляет, что квитанция существует после установки! Они предлагают использовать кнопку «Восстановить», чтобы пользователь обновлял квитанцию ​​только в том случае, если он уверен, что она устарела. - person Tertium; 24.08.2016
comment
Все могло измениться с тех пор, как я написал этот ответ два года назад. - person Andy Ibanez; 24.08.2016
comment
@AndyIbanez Вы хотите проверить, есть ли путь! = ДА? Вы обновляете, если квитанция магазина уже существует... - person strangetimes; 08.10.2016
comment
Как-то пропустил это И комментарий, указывающий на это. Починил это. Спасибо @strangetimes - person Andy Ibanez; 14.02.2017
comment
@AndyIbanez Как узнать, какой продукт пользователь покупал раньше? А где квитанция? SKReceiptRefreshRequest не является квитанцией. - person Daniel Brower; 20.11.2018
comment
Это не совсем область этого вопроса или ответа. Я рекомендую эту статью, чтобы узнать о проверке и подтверждении получения. Он охватывает все, от проверки до анализа квитанции, чтобы увидеть, какие идентификаторы пакетов были приобретены. - person Andy Ibanez; 20.11.2018

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

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

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

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

person nevan king    schedule 19.04.2017

Я хотел бы поделиться своим опытом. Я работал в песочнице, и квитанция о приложении отсутствует после удаления приложения. (А потом повторно Command-R-ing) Я не знаю, происходит ли это в продакшене, но звучит так, как будто это происходит. Запрашивать обновление при первой загрузке приложения и запрашивать у пользователя пароль — это поразительно. Это вопрос, конечно.

Похоже, что [[SKPaymentQueue defaultQueue] restoreCompletedTransactions] также автоматически обновляет квитанцию ​​о приложении без появления диалогового окна. Это означает, что после восстановления транзакции запрос appReceiptURL + Data возвращает ненулевое значение. Это только из моего небольшого количества тестов. Пожалуйста, проведите собственное тестирование.

person John    schedule 14.01.2015
comment
Только что попробовал, и появилось приглашение для входа в iTunes :( Так что, по крайней мере, в iOS 12 он больше не работает без звука ... - person Georg; 25.09.2018