web-dev-qa-db-ja.com

アプリの有料版を無料版の「キー」として使用するにはどうすればよいですか?

たとえば、Androidアプリがあるとします。無料バージョンには広告または基本機能があります。広告を削除して追加機能を追加する有料バージョンが欲しいのですが。

有料アプリを「ライセンスキー」として使用して、無料アプリの機能のロックを解除するにはどうすればよいですか?

したがって、ユーザーは無料アプリをインストールしてから有料アプリをインストールして追加の機能を取得しますが、無料アプリを実行することになります(ロック解除されます)。これを行うための最良のアプローチは何ですか?

53
Bryan Denny

PackageManagerを使用して、有料パッケージがインストールされていることを確認します。また、無料のパッケージ署名がインストール済みのプレミアムパッケージ署名と一致していることを確認してください。そうでなければ、誰かがあなたの支払ったパッケージ名と一致するパッケージ名で署名されていないアプリをインストールし、この方法でプレミアムをアンロックすることができます。

この投稿は、署名を見つけるのに役立ちます アプリがAndroid Market からダウンロードされたかどうかを検出します)

37
Fedor

私はこれを使っています:

PackageManager manager = getPackageManager();
if (manager.checkSignatures("core.package.name", "key.package.name")
    == PackageManager.SIGNATURE_MATCH) {
    //full version
}

それは非常にシンプルで機能します。

20
David Vávra

Pro Keyの存在を確認し、パッケージの署名が無料バージョンと一致することを確認する簡単な関数を次に示します。

protected static boolean isProInstalled(Context context) {
    PackageManager manager = context.getPackageManager();
    if (manager.checkSignatures(context.getPackageName(), "com.your.pro.key")
        == PackageManager.SIGNATURE_MATCH) {
        //Pro key installed, and signatures match
        return true;
    }
    return false;
}

yoki.org で概説されている方法に基づいて、コードは this forum post からのものです。

8
David

他の誰かが指摘したように、はい、PackageManagerを使用して有料の「キー」アプリの存在を検出できますが、誰かが有料バージョンをインストールしたり、無料バージョンをアンインストールしたりするだけの場合は問題があります。 1つのアプリを機能させるために約2つのダウンロード。 FWIW、私は DoubleTwist Air Sync がこのようにすると思います。 Air Syncアプリは、無料のDoubleTwistアプリの機能を有効にする以外は何もしません。

より実用的な方法は、2つの別々のアプリを用意し、次に ContentProvider または sharedUserId を使用して、設定とデータを一方から他方にインポートできるようにすることです。その後、ほとんどのコードを共有できます 共有ライブラリプロジェクトを使用ただしこれは、2つのアプリが同じ権限を使用できないため、両方のアプリで異なるコンテンツURIを使用する必要があることを意味します。共有ライブラリコードには、ContentProvider実装で通常見られるような静的なCONTENT_URIまたはAUTHORITYフィールドだけを含めることはできません。

2つのプロジェクト間でコードをコピーすることは、2つのプロジェクト間でコードをコピーすることが、有効化または無効化するあらゆる種類のスイッチを備えた共有ライブラリを維持するよりも実際には簡単かもしれないためです。無料版と有料版の間の機能。

実際には、単一のアプリと ライセンスの使用 を使用するためのedgmanの推奨は、おそらく無料と有料の管理に取り掛かる最善の方法ですアプリのバージョン。私はまだライセンスを使用していませんが、上記のすべての問題を解決します。

[〜#〜] edit [〜#〜]ライセンスは有料アプリ(バンマー)でのみ許可されているようですので、必要に応じて立ち入り禁止です無料版を提供します。ただし、 アプリ内課金 は、無料/有料バージョンを管理する「正しい」方法かもしれません。多分それはOkですが、2つの2つのアプリを常にユーザーのデバイスにインストールする必要があるとは思わないのが理想的です。有料ユーザーが新しいデバイスにアプリをインストールした場合、以前のトランザクションをダウンロードできるため、2度支払う必要はありません。

7
thom_nic

両方のアプリが同じ開発者のものであり、同じキーで署名されている場合、それらのアプリは個人的に情報を共有できるはずです。 (MODE_PRIVATEで保存された)ファイルを使用することもできますが、SharedPreferencesを使用するのが最も簡単な方法だと思います。無料のアプリが読み取る有料アプリにフラグを設定します。 http://developer.Android.com/guide/topics/data/data-storage.html を参照してください。特にルート化されたデバイスでは、簡単に回避できるかどうかはわかりません...

別の方法は、有料アプリがインストールされているかどうかを確認することです。たとえば、特定のインテントを受け入れるかどうかを確認します。参照: http://developer.Android.com/resources/articles/can-i-use-this-intent.html ;その例では、ZXingのバーコードスキャナーがそのように利用可能かどうかを確認しています。

いずれにせよ、アイデアをさらにひねると、望めば、1回の支払いで複数のアプリを「有効化」できるようになります。有料アプリは、すべてのアプリから広告を削除する単純な「この開発者をサポートする」です。それは興味深い支払いモデル私見です。

3
Joubarc

これを行う方法の一例を次に示します。

Intent unlockerAppPresence = null;
APP_LITE_VERSION = false;
try 
{
    unlockerAppPresence = context.getPackageManager().getLaunchIntentForPackage("nameofthepackagethatunlockyoursoftware");
} 
catch (Exception e1) 
{
    APP_LITE_VERSION  = true;
}
if (unlockerAppPresence == null)
    APP_LITE_VERSION  = true;

これとアプリの開発者署名のチェック(@Fedorで指摘されている)を組み合わせると、問題ありません。

1
Bryan Denny

無料/デモアプリのみを配布し、アプリ内に実装してプロにするための絶対的な方法は何ですか?したがって、インストールする必要があるアプリユーザーは1人だけで、基本的な機能をテストでき、アプリ内購入を呼び出す「アップグレード$ 1,99」のようなボタンがあります。

1
almisoft

どうやら私は50の評判なしではコメントできないので、私はこれを独自の答えに入れます。

他の人が引用したPackageManagerメソッドは良い方法のように思えますが、ハックボッドが述べているように、2つのアプリケーションをインストールするのはユーザーにとって煩わしい(そして少し混乱する)ものです。

しかし、私はまだアプリを公開していないため、これを試していません。Proのバージョンがインストールされていることがわかった場合、falseから始まり、trueに更新される変数を保持できるようです。 Proバージョンが存在しないからといって、変数がfalseに戻ることはありません。次に、両方のバージョンでProをインストールする必要があることをユーザーに通知し、試用版を開いて[ロック解除]をクリックします。これが完了すると、試用版はフルバージョンになり、プロバージョンがインストールされていることがわかった場合は、プロバージョンをアンインストールできるため、引き続きフルアクセスが可能であることを通知します。

このような少し:

String msg = "";
boolean sigMatch = isProInstalled(context);
if (unlocked)
{
    // If you get here by clicking a button that goes away once the app is unlocked, then you may never see this.  Still, better safe than sorry.
    msg += "Thanks!  You already have access to the full game.";
}
else
{
    if (sigMatch)
    {
        unlocked = true;
        saveData(); // I assume you already know how to store variables.
        msg += "Unlock successful.  You now have access to the full game."
    }
    else
    {
        msg += "You are using a Trial version of this game.  (blah, blah).  To unlock the full version, please purchase XYZ Pro.  Install the application and then start this application again and go into this screen again.  You should get a message letting you know that the app has been successfully unlocked, after which you may uninstall the Pro version.  You do not have to keep it on your device after unlocking the game.";
    }
}
if (sigMatch)
{
    msg += "  If you like, you may now uninstall the Pro application.  You will continue to have full access to XYZ.";
}

現在、ハックボックスも可能であるので、ユーザーがProバージョンの料金を支払ってから24時間以内にそれを返したかどうかはわかりません。**しかし、このシナリオはそれほど頻繁には発生しないようです。誰かが支払い、それを返却した場合(特に、あまり充電していない場合)、おそらくアプリの使用を停止するか、またはアプリを盗もうとしている可能性があります。この可能性が懸念される場合は、アプリ内課金が最善の選択です。しかし、カジュアルなユーザーを排除するための簡単な手段を探しているだけで、2つのアプリケーションを常にインストールしておくように強制したくない場合は、これがオプションになる可能性があります。

**別の変数でタイムスタンプを保持し、そのタイムスタンプから数時間後までユーザーにProバージョンをインストールしておくことを要求できたら、アンインストールを許可します...

0
parmeisan