私は最初のアプリを完成させようとしています。最後に残っているのは IAP 課金を実装することです。そのため、現在このトピックについてかなり多くのことを読んでいます (暗号化、難読化などのセキュリティ上の懸念を含む)。
私のアプリは無料版で、IAP を介してフル バージョンにアップグレードできるため、管理された購入アイテム「プレミアム」は 1 つだけです。これについていくつか質問があります。
Google IAP API の例 (trivialdrivesample) では、MainActivity に常に IAP チェックがあり、ユーザーがプレミアム バージョンを購入したかどうかを確認します。
mHelper.queryInventoryAsync(mGotInventoryListener);
私の最初の懸念: これは、ユーザーがアプリの起動時に常にインターネット/データ接続を持っている必要があることを意味し、プレミアム バージョンに切り替えることができますか? ユーザーがインターネットに接続していない場合はどうなりますか? 彼は私が推測するライトバージョンを使いますが、それは私が迷惑だと思うでしょう.
そこで、isPremium ステータスをローカルに、SharedPrefs またはアプリ データベースに保存する方法を考えました。さて、サーバー側の検証を行うためのサーバーを所有していないため、ハッカーがアプリをリバース エンジニアリングするのを止められないことはわかっています。
それにもかかわらず、どこかに「isPremium」フラグを保存することはできません。
そこで、次のようなことを考えていました。
- ユーザーがプレミアムを購入
- アプリは IMEI/デバイス ID を取得し、ハードコードされた文字列キーを使用して XOR エンコードし、それをアプリ データベースにローカルに保存します。
ユーザーがアプリを再度起動すると、次のようになります。
- アプリはエンコードされた文字列をデータベースから取得し、デコードして、decodedString == IMEI かどうかを確認します。はいの場合 -> プレミアム
- いいえの場合、ユーザーがプレミアムを購入したかどうかを確認するために、通常の queryInventoryAsync が呼び出されます。
そのアプローチについてどう思いますか?私はそれが超安全ではないことを知っていますが、私にとっては、アプリがハッキングされないことよりも(インターネット接続が必須の場合のように)ユーザーがイライラしないことが重要です(とにかく不可能です). 他にコツはありますか?
私が現在手がかりを持っていないもう1つのことは、ユーザーがアプリをアンインストール/再インストールしたときにトランザクションステータスを復元する方法です. APIにはそのためのメカニズムがいくつかあることを知っています。さらに、アプリを介してデータベースをエクスポートおよびインポートできます(したがって、エンコードされたisPremiumフラグもエクスポート/インポート可能になります)。わかりました、それは別の質問になると思います。その時が来たら ;-)
このアプローチに対する考えやコメントは大歓迎です。それは良い解決策だと思いますか? または、何かが足りない/間違った方向に進んでいますか?