アプリの試用版の実装Implement a trial version of your app

場合するパートナー センターで無料試用版としてアプリを構成する顧客を使用できるように、アプリを無料の試用期間中、除外の一部の機能を制限したりすることによって、アプリの完全なバージョンにアップグレードするお客様を引き込むことができます試用期間中。If you configure your app as a free trial in Partner Center so that customers can use your app for free during a trial period, you can entice your customers to upgrade to the full version of your app by excluding or limiting some features during the trial period. どのような機能を制限するかをコーディング開始前に決め、完全なライセンスが購入されたときにだけその機能が正しく動作するようにアプリを設定します。Determine which features should be limited before you begin coding, then make sure that your app only allows them to work when a full license has been purchased. また、ユーザーがアプリを購入する前の試用期間中にだけバナーや透かしなどを表示する機能を有効にすることもできます。You can also enable features, such as banners or watermarks, that are shown only during the trial, before a customer buys your app.

この記事では、Windows.Services.Store 名前空間の StoreContext クラスのメンバーを使用して、アプリの試用ライセンスがユーザーにあるかどうかを判定したり、アプリの実行中にライセンスが変更されたときに通知を受け取る方法を説明します。This article shows how to use members of the StoreContext class in the Windows.Services.Store namespace to determine if the user has a trial license for your app and be notified if the state of the license changes while your app is running.

注意

Windows.Services.Store 名前空間は、Windows 10 バージョン 1607 で導入され、Visual Studio で、Windows 10 Anniversary Edition (10.0、ビルド 14393) 以降のリリースをターゲットとするプロジェクトでのみ使用できます。The Windows.Services.Store namespace was introduced in Windows 10, version 1607, and it can only be used in projects that target Windows 10 Anniversary Edition (10.0; Build 14393) or a later release in Visual Studio. アプリが Windows 10 の以前のバージョンをターゲットする場合、Windows.Services.Store 名前空間の代わりに Windows.ApplicationModel.Store 名前空間を使う必要があります。If your app targets an earlier version of Windows 10, you must use the Windows.ApplicationModel.Store namespace instead of the Windows.Services.Store namespace. 詳しくは、こちらの記事をご覧ください。For more information, see this article.

試用版を実装するためのガイドラインGuidelines for implementing a trial version

アプリの現時点でのライセンスの状態は、StoreAppLicense クラスのプロパティとして保存されています。The current license state of your app is stored as properties of the StoreAppLicense class. 通常は、次の手順で説明するように、ライセンスの状態に依存する関数を条件ブロック内に記述します。Typically, you put the functions that depend on the license state in a conditional block, as we describe in the next step. このような機能について検討するときには、ライセンスがどの状態であっても動作するように実装できることを確認してください。When considering these features, make sure you can implement them in a way that will work in all license states.

また、アプリの実行中にライセンスが変更された場合の処理方法を決めておきます。Also, decide how you want to handle changes to the app's license while the app is running. 試用版のアプリでもすべての機能を使うことができるようにしながら、購入版では表示されない広告バナーを表示することができます。Your trial app can be full-featured, but have in-app ad banners where the paid-for version doesn't. また、試用版アプリでは一部の機能を無効にしたり、ユーザーに購入を勧めるメッセージを表示したりすることもできます。Or, your trial app can disable certain features, or display regular messages asking the user to buy it.

アプリの性質を考慮して、それに適した試用や有効期限の戦略を立ててください。Think about the type of app you're making and what a good trial or expiration strategy is for it. ゲームの試用版の場合は、ユーザーが遊べるゲーム コンテンツの量を制限するのが良い戦略でしょう。For a trial version of a game, a good strategy is to limit the amount of game content that a user can play. ユーティリティの試用版の場合は、有効期限日の設定や、ユーザーが使いたがるような機能の制限を検討するとよいでしょう。For a trial version of a utility, you might consider setting an expiration date, or limiting the features that a potential buyer can use.

ゲーム以外の多くのアプリでは、ユーザーにアプリ全体を理解してもらうために、有効期限日を設定するのが適しています。For most non-gaming apps, setting an expiration date works well, because users can develop a good understanding of the complete app. ここでは、有効期限に関するいくつかの一般的なシナリオと、その処理方法について説明します。Here are a few common expiration scenarios and your options for handling them.

  • アプリの実行中に試用版ライセンスの有効期限します。Trial license expires while the app is running

    アプリの実行中に試用ライセンスが期限切れになった場合は、次の対処方法があります。If the trial expires while your app is running, your app can:

    • 何もしない。Do nothing.
    • ユーザーにメッセージを表示する。Display a message to your customer.
    • を閉じます。Close.
    • ユーザーにアプリの購入を促す。Prompt your customer to buy the app.

    お勧めするのは、アプリの購入を促すメッセージを表示することです。ユーザーがアプリを購入したら、すべての機能を有効にして、そのまま使うことができるようにします。The best practice is to display a message with a prompt for buying the app, and if the customer buys it, continue with all features enabled. 購入しなかった場合は、アプリを閉じるか、アプリの購入が必要なことを一定の間隔で通知します。If the user decides not to buy the app, close it or remind them to buy the app at regular intervals.

  • アプリを起動する前に試用版ライセンスの有効期限します。Trial license expires before the app is launched

    ユーザーがアプリを起動する前に試用ライセンスが期限切れになった場合、アプリは起動しません。If the trial expires before the user launches the app, your app won't launch. ユーザーには、ストアからそのアプリを購入できることを伝えるダイアログ ボックスが表示されます。Instead, users see a dialog box that gives them the option to purchase your app from the Store.

  • 実行中のアプリを購入した顧客Customer buys the app while it is running

    アプリの実行中にユーザーがアプリを購入した場合は、次の対処方法があります。If the customer buys your app while it is running, here are some actions your app can take.

    • 何もせず、アプリが再起動されるまでは試用モードを続ける。Do nothing and let them continue in trial mode until they restart the app.
    • 購入に対するお礼をする、またはメッセージを表示する。Thank them for buying or display a message.
    • 完全なライセンスがある場合に使うことができる機能を、通知なしで有効にする (または、試用版であることを示す表示を消す)。Silently enable the features that are available with a full-license (or disable the trial-only notices).

アプリの動作でユーザーが驚くことがないように、無料試用版のアプリが試用期間中にどのように機能し、期間が過ぎるとどのようになるかを必ず説明してください。Be sure to explain how your app will behave during and after the free trial period so your customers won't be surprised by your app's behavior. アプリの説明について詳しくは、「アプリの説明の作成」をご覧ください。For more info about describing your app, see Create app descriptions.

前提条件Prerequisites

この例には、次の前提条件があります。This example has the following prerequisites:

  • Windows 10 Anniversary Edition (10.0、ビルド 14393) 以降のリリースをターゲットとするユニバーサル Windows プラットフォーム (UWP) アプリの Visual Studio プロジェクト。A Visual Studio project for a Universal Windows Platform (UWP) app that targets Windows 10 Anniversary Edition (10.0; Build 14393) or a later release.
  • として構成されているパートナー センターでアプリを作成した、無料試用版時間制限なしでこのアプリがストアで公開されています。You have created an app in Partner Center that is configured as a free trial with no time limit and this app is published in the Store. 必要に応じで、テスト中にストアでアプリを検索できないようにアプリを構成することも可能です。You can optionally configure the app so it is not discoverable in the Store while you test it. 詳しくは、テスト ガイダンスをご覧ください。For more information, see our testing guidance.

この例のコードは、次の点を前提としています。The code in this example assumes:

  • コードは、workingProgressRing という名前の ProgressRingtextBlock という名前の TextBlock を含む Page のコンテキストで実行されます。The code runs in the context of a Page that contains a ProgressRing named workingProgressRing and a TextBlock named textBlock. これらのオブジェクトは、それぞれ非同期操作が発生していることを示するためと、出力メッセージを表示するために使用されます。These objects are used to indicate that an asynchronous operation is occurring and to display output messages, respectively.
  • コード ファイルには、Windows.Services.Store 名前空間の using ステートメントがあります。The code file has a using statement for the Windows.Services.Store namespace.
  • アプリは、アプリを起動したユーザーのコンテキストでのみ動作するシングル ユーザー アプリです。The app is a single-user app that runs only in the context of the user that launched the app. 詳しくは、「アプリ内購入と試用版」をご覧ください。For more information, see In-app purchases and trials.

注意

デスクトップ ブリッジを使用するデスクトップ アプリケーションがある場合、この例には示されていないコードを追加して StoreContext オブジェクトを構成することが必要になることがあります。If you have a desktop application that uses the Desktop Bridge, you may need to add additional code not shown in this example to configure the StoreContext object. 詳しくは、「デスクトップ ブリッジを使用するデスクトップ アプリケーションでの StoreContext クラスの使用」をご覧ください。For more information, see Using the StoreContext class in a desktop application that uses the Desktop Bridge.

コードの例Code example

アプリを初期化するときに、アプリの StoreAppLicense オブジェクトを取得し、アプリの実行中にライセンスが変更されたときに通知を受け取る OfflineLicensesChanged イベントを処理します。When your app is initializing, get the StoreAppLicense object for your app and handle the OfflineLicensesChanged event to receive notifications when the license changes while the app is running. アプリのライセンスが変更されるのは、たとえば、試用期間が終了したときや、ユーザーがストアを通じてアプリを購入したときです。For example, the app's license could change if the trial period expires or the customer buys the app through a Store. ライセンスが変更されるときに、新しいライセンスを入手し、必要に応じてアプリの機能を有効または無効にします。When the license changes, get the new license and enable or disable a feature of your app accordingly.

この時点で、ユーザーがアプリを購入したら、ライセンスの状態が変わったことをユーザーに知らせることをお勧めします。At this point, if a user bought the app, it is a good practice to provide feedback to the user that the licensing status has changed. コーディングの方法上、必要であれば、ユーザーにアプリを再起動してもらわなければならないこともあります。You might need to ask the user to restart the app if that's how you've coded it. ただし、この移行は可能な限りスムーズで違和感のないようにする必要があります。But make this transition as seamless and painless as possible.

private StoreContext context = null;
private StoreAppLicense appLicense = null;

// Call this while your app is initializing.
private async void InitializeLicense()
{
    if (context == null)
    {
        context = StoreContext.GetDefault();
        // If your app is a desktop app that uses the Desktop Bridge, you
        // may need additional code to configure the StoreContext object.
        // For more info, see https://aka.ms/storecontext-for-desktop.
    }

    workingProgressRing.IsActive = true;
    appLicense = await context.GetAppLicenseAsync();
    workingProgressRing.IsActive = false;

    // Register for the licenced changed event.
    context.OfflineLicensesChanged += context_OfflineLicensesChanged;
}

private async void context_OfflineLicensesChanged(StoreContext sender, object args)
{
    // Reload the license.
    workingProgressRing.IsActive = true;
    appLicense = await context.GetAppLicenseAsync();
    workingProgressRing.IsActive = false;

    if (appLicense.IsActive)
    {
        if (appLicense.IsTrial)
        {
            textBlock.Text = $"This is the trial version. Expiration date: {appLicense.ExpirationDate}";

            // Show the features that are available during trial only.
        }
        else
        {
            // Show the features that are available only with a full license.
        }
    }
}

完全なサンプル アプリケーションについては、ストア サンプルをご覧ください。For a complete sample application, see the Store sample.