Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

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

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

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

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

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

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

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

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

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

Ответ 2

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

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

Ответ 3

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

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

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

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