5

Google Playで利用できるAndroidアプリ内で、アプリ内課金で購入できる追加のアイテムを提供したいと思います。

私が提供したいアイテムの種類は、グラフィックやサウンドなどのメディアコンテンツであり、通常resはアプリのフォルダーに入ります。

もちろん、問題はこれらのリソースを保護する必要があることです。Googleのドキュメントでは、コンテンツをアプリケーションパッケージ内に保存するのではなく、アイテムの購入後にキーを取得し、キーがチェックされるリモートサーバーにキーを送信し、成功した場合はグラフィック/サウンドを提供することを提案しています。アプリにダウンロードします。

これは、セキュリティの観点からは良さそうです。しかし、これを行うと、リソースに通常アクセスできるほど簡単にコンテンツを使用できなくなります。たとえば、ユーザーが追加のバックグラウンドPNGを取得できる場合、使用することはできませんR.drawable.new_backgroundが、プログラムでビットマップをデコードする必要があります。

では、アプリ内課金を介して追加のメディアコンテンツをダウンロードするための代替手段やベストプラクティスはありますか?

とにかく、十分に判断した人なら誰でもコードをリバースエンジニアリングできるので、アプリ内にコンテンツを保存するだけでなく、ユーザーがそのコンテンツを使用する可能性があるかどうかを強力にチェックするのはなぜですか。

4

4 に答える 4

3

答えはあなたの特定の懸念にいくらか依存します、それはあなたの質問から、以下の1か2のどちらかであるかもしれません:

1)誰かが私のアプリ内でお金を払わずに私のリソースを使用できるようになるのではないかと心配しています。

2)ユーザー(支払い済みまたは未払いのユーザー)が私のリソースを削除し、アプリの外部で使用するのではないと心配しています。

別の可能性は、あなたの質問では示されていないようです(しかし、他の人が対処しようとしたもの)は次のようになります。

3)多数のリソースをダウンロードするため、最初のAPKダウンロードが大きすぎるのではないかと心配していますが、ユーザーが使用することを決定するのはそのうちの一部だけです。

唯一の懸念事項が項目1の場合は、通常どおりにリソースを保存できますが、アプリ内では、アプリ内支払いをまだ受け取っていないリソースの読み込み/使用を拒否します。これは確かに最も簡単なアプローチです。

懸念事項が項目2の場合は、暗号化されたバイナリアーカイブをrawフォルダーにAPKに含め、そのリソースがアプリでの使用を許可されている場合はいつでも、そのリソースから特定のリソースをデコードできます。他の人が指摘しているように、これはプロセッサの負荷に関してはそれほど大きな問題ではなく、偶発的な盗難からある程度保護します。もちろん、暗号化を破ってリソースを盗む「創造的な盗作」の撞着語を扱っている場合は、常に著作権法があります。

懸念事項がアイテム3の場合は、アイテムを取得できる外部サーバーが必要になります。Google App Engineは、この種のストレージをアプリの外部に実装する際のホスティングによく使用されます。購入/ダウンロードしたリソースをアプリ自体の外部ファイルフォルダー(getExternalFilesDir()によって返される)の暗号化されたアーカイブにキャッシュし、上記の項目2のように読み取って復号化します。このようなファイルは、アプリがアンインストールされると自動的に削除されます。

于 2013-02-05T03:46:25.153 に答える
2

アプリに追加のコンテンツを保存しない明らかな理由の1つは、アプリのアプリのダウンロードサイズです。追加コンテンツとしてオーディオを提供している場合は、アプリケーションのサイズが大幅に増加する可能性があります。そして、ユーザーはそれを気にします。さらに、アプリの更新を公開しなくてもサーバー側/開発者コンソールから追加コンテンツを公開できるため、追加コンテンツの公開が容易になります。さらに、高品質のグラフィックスを提供したい場合は、すべての密度/画面サイズのバージョンを保存しなくても、適切なバージョンの画像をデバイスに直接提供できます。

セキュリティが心配な場合は、いつでも暗号化と署名を使用してリソースにアクセスし、コードを適切に難読化することで攻撃者の生活を大幅に困難にすることができます(または、セキュリティ/復号化関連のコードをネイティブ側に移動することで、コードを高速化することもできます)。

はい、それはあなたがそれらをプログラムでデコードしなければならず、それについて何もすることがないという欠点を作成します。正直なところ、それがそれほど大きな問題である理由はわかりません。逆に、リソースへのデータ駆動型アクセスが増えると非常に便利だと思います。

要約すると、これを行うための標準は実際にはないと思います。それはアプリとコンテンツタイプによって異なります。5〜10枚の画像の固定量を提供する場合、それらをローカルに保持することはまったく問題ありません。コンテンツが豊富で、アイテムが多く、リソースが重い場合は、クライアントサーバーの方が適しています。

于 2013-02-04T17:57:57.530 に答える
1

1つの解決策は、同じユーザーIDを共有する2つのアプリを特徴とする次のアプローチです。しかし、これはアプリ内購入ほどエレガントではなく、明らかに少しハッキーです。

  1. android:sharedUserId同じで2つのアプリを作成しますAndroidManifest.xml
  2. 有料コンテンツを2番目のアプリに保存します。これは、今後はライブラリアプリであり、これらの画像のみが含まれます(必要なフォルダーとマニフェストは別として)
  3. 同じキーで両方のAPKに署名します
  4. 通常どおり、最初のアプリを無料で提供し、2番目のアプリを有料アプリにします
  5. 無料アプリで、を使用しPackageManagerて2番目のAPKがインストールされているかどうかを確認します
  6. はいの場合は、を使用createPackageContext()して2番目のアプリのを作成しContextます。このアプリは、最初のアプリから2番目のアプリのリソースにアクセスするために使用されます。
于 2013-01-29T19:32:57.953 に答える
0

Google Playは、購入可能な拡張パックを提供しています。これらは、購入するとダウンロードできる大きな拡張機能であり、アプリとは別のものです。これは1つの可能性です。

http://developer.android.com/google/play/expansion-files.html

必要な安全性とメディアのサイズに応じて、キーを使用してメディアを暗号化し、アプリに保存できます。アプリと一緒にダウンロードしてインストールしますが、アクセスできません。アプリ内購入が完了すると、コンテンツを復号化してユーザーに提供できます。キーをアプリでソースコードに保存して復号化するか、自分のサーバーで購入を確認してサーバーからキーを取得することができます。

于 2013-01-29T17:07:21.617 に答える