Я нахожусь на грани завершения моего первого приложения, и еще одна оставшаяся вещь - реализовать биллинг IAP, поэтому я сейчас читаю довольно много о теме (включая проблемы безопасности, такие как шифрование, обфускация и прочее).
Мое приложение - это бесплатная версия с возможностью обновления до полной версии через IAP, так что будет только один элемент покупной покупки "премиум". У меня есть несколько вопросов по этому поводу:
В примере API API IAP (trivialdrivesample) всегда есть проверка IAP в MainActivity, чтобы узнать, покупает ли пользователь премиум-версию, выполненную с помощью
mHelper.queryInventoryAsync(mGotInventoryListener);
Моя первая забота: Это означает, что пользователь всегда должен иметь подключение к Интернету/данным при запуске приложения, чтобы иметь возможность перейти на премиум-версию вправо? Что делать, если у пользователя нет подключения к Интернету? Думаю, он подойдет с облегченной версией, что мне будет неприятно.
Итак, я подумал о том, как сохранить статус isPremium локально, либо в SharedPrefs, либо в базе данных приложений. Теперь я знаю, что вы не можете остановить хакера, чтобы перепроектировать приложение, несмотря ни на что, даже если я не владею сервером для проверки на стороне сервера.
Тем не менее, просто невозможно сохранить флаг "isPremium" где-то, так как это было бы слишком легко заметить.
Итак, я думал о чем-то вроде этого:
- Пользователь покупает премиум
- Приложение получает идентификатор IMEI/Device-ID, а XOR кодирует его с помощью жестко закодированного ключа String, сохраняет его локально в базе данных приложений.
Теперь, когда пользователь снова запустит приложение:
- Приложение получает закодированную строку из базы данных, декодирует ее и проверяет, расшифрован ли файлString == IMEI. Если да → премиум
- Если нет, тогда будет вызван обычный запросInventoryAsync, чтобы узнать, покупает ли пользователь премию.
Что вы думаете об этом подходе? Я знаю, что это не supersecure, но для меня важнее, чтобы пользователь не был раздражен (например, с обязательным подключением к Интернету), чем приложение будет недоступно (что в любом случае невозможно). У вас есть другие советы?
Еще одна вещь, о которой я в настоящее время не знаю, заключается в том, как восстановить статус транзакции, когда пользователь удаляет/переустанавливает приложение. Я знаю, что у API есть некоторый механизм для этого, и, кроме того, моя база данных может быть экспортирована и импортирована через приложение (так что закодированный флаг isPremium будет также экспортироваться/импортироваться). Хорошо, я думаю, это был бы другой вопрос, когда настало время, -)
Любые мысли и комментарии к этому подходу приветствуются, считаете ли вы, что это хорошее решение? Или я пропущу что-то/заголовок в неправильном направлении?