Исключение или ограничение функций в пробной версии

Если вы разрешаете пользователям бесплатно пользоваться вашим приложением в течение испытательного срока, можно привлечь их к обновлению до полной версии приложения путем удаления или ограничения некоторых функций в течение пробного периода. До начала программирования решите, какие функции лучше ограничить, и сделайте так, чтобы они были доступны только после покупки полной лицензии. Вы можете также включить такие компоненты, как баннеры или водяные знаки, которые будут отображаться только во время пробного периода, пока пользователь не купит приложение.

Важно!

В этой статье показано, как использовать члены пространства имен Windows.ApplicationModel.Store для включения функции пробного периода. Это пространство имен больше не дополняется новыми функциями, и мы рекомендуем вместо него использовать пространство имен Windows.Services.Store. Пространство имен Windows.Services.Store поддерживает последние типы надстроек, например управляемые Магазином потребляемые надстройки и подписки, и предназначено для обеспечения совместимости с будущими типами продуктов и функций, поддерживаемых Центром партнеров и Магазином. Пространство имен Windows.Services.Store впервые появилось в Windows 10 версии 1607 и может использоваться только в проектах, предназначенных для Windows 10 Anniversary Edition (10.0; сборка 14393) или более поздней версии в Visual Studio. Дополнительные сведения о реализации функции пробного периода с помощью пространства имен Windows.Services.Store см. в этой статье.

Предварительные требования

Приложение для Windows, в которое предполагается добавить компоненты для продажи.

Шаг 1. Выбор функций, которые вы хотите включить или выключить на время испытательного срока

Текущее состояние лицензии вашего приложения можно узнать из свойств класса LicenseInformation. Обычно функции, которые зависят от состояния лицензии, помещают в условный блок. Как это сделать, будет показано на следующем этапе. Разрабатывая эти функции, убедитесь, что они будут работать во всех состояниях лицензии.

Решите, каким образом вы будете обрабатывать изменения в лицензии приложения во время его работы. Ваше приложение может быть полнофункциональным, но в отличие от купленного иметь рекламные баннеры. Вы также можете запретить некоторые функции или регулярно показывать сообщения с предложением купить приложение.

Подумайте, какой способ ограничения функциональности больше всего подходит для вашего типа приложения. Для игры больше всего подойдет ограничение игрового контента, доступного пользователю. Для пробной версии служебной программы можно установить дату окончания пробного периода или ограничить некоторые функции, нужные потенциальному покупателю.

Для большинства неигровых приложений установка испытательного срока является удачным решением, так как пользователи смогут лучше разобраться в приложении в целом. Ниже приведено несколько распространенных сценариев окончания срока действия и варианты их обработки.

  • Срок действия лицензии пробной версии истек во время работы приложения

    Если срок действия лицензии пробной версии истек во время работы приложения, то можно:

    • Не делать ничего.
    • Вывести сообщение для клиента.
    • Близко.
    • Предложить клиенту купить приложение.

    Рекомендуется вывести сообщение с предложением купить приложение и, если клиент его купит, включить все функции и продолжить работу. Если пользователь решит не покупать приложение, следует закрыть его или регулярно напоминать о покупке приложения.

  • Срок действия лицензии пробной версии истек до запуска приложения

    Если срок действия пробной версии окончится до того, как пользователь запустит программу, она не запустится. Вместо этого пользователи увидят диалоговое окно, с помощью которого они смогут приобрести ваше приложение в Магазине.

  • Клиент покупает приложение во время его работы

    Если клиент покупает приложение во время его работы, возможно несколько вариантов действий.

    • Не выполнять никаких действий и предоставить клиенту возможность работать в режиме пробной версии до перезапуска приложения.
    • Поблагодарить клиента за покупку или отобразить сообщение.
    • Без предупреждения включить возможности, доступные в полной лицензионной версии (или отключить уведомления об использовании пробной версии).

Если вы хотите обнаруживать изменение лицензии и выполнять то или иное действие в приложении, нужно добавить обработчик событий для этого сценария, как показано на следующем этапе.

Шаг 2. Инициализация информации о лицензии

При инициализации приложения получите для него объект LicenseInformation, как показано в следующем примере. Будем считать, что licenseInformation является глобальной переменной или полем типа LicenseInformation.

На данный момент вы получите смоделированные сведения о лицензии с использованием CurrentAppSimulator вместо CurrentApp. Перед отправкой окончательной версии приложения в Магазин необходимо заменить все ссылки CurrentAppSimulator в коде на CurrentApp.

void InitializeApp()
{
    // Some app initialization code...

    // Initialize the license info for use in the app that is uploaded to the Store.
    // Uncomment the following line in the release version of your app.
    //   licenseInformation = CurrentApp.LicenseInformation;

    // Initialize the license info for testing.
    // Comment the following line in the release version of your app.
    licenseInformation = CurrentAppSimulator.LicenseInformation;

    // Other app initialization code...
}

Затем добавьте обработчик событий для получения уведомлений об изменении лицензии во время работы приложения. Лицензия приложения может изменяться — например, после окончания пробного периода или при покупке пользователем приложения в Магазине.

void InitializeApp()
{
    // Some app initialization code...

    // Initialize the license info for use in the app that is uploaded to the Store.
    // Uncomment the following line in the release version of your app.
    //   licenseInformation = CurrentApp.LicenseInformation;

    // Initialize the license info for testing.
    // Comment the following line in the release version of your app.
    licenseInformation = CurrentAppSimulator.LicenseInformation;

    // Register for the license state change event.
    licenseInformation.LicenseChanged += LicenseInformation_LicenseChanged;

    // Other app initialization code...
}

void LicenseInformation_LicenseChanged()
{
    // This method is defined later.
    ReloadLicense(); 
}

Шаг 3. Написание кода компонентов в условных блоках

Когда возникает событие, связанное с изменением лицензии, ваше приложение должно вызвать API License, чтобы определить, изменился ли статус пробного периода. В примере кода показано, как организовать обработку этого события. Если пользователь купил приложение, рекомендуется сообщить ему об изменении состояния лицензирования. При необходимости попросите пользователя перезапустить приложение. Перевод приложения в новое состояние лицензирования должен быть максимально комфортным для пользователя.

В следующем примере показано, как оценить состояние лицензии приложения и провести соответствующее включение или выключение функции.

void ReloadLicense()
{
    if (licenseInformation.IsActive)
    {
        if (licenseInformation.IsTrial)
        {
            // Show the features that are available during trial only.
        }
        else
        {
            // Show the features that are available only with a full license.
        }
    }
    else
    {
        // A license is inactive only when there' s an error.
    }
}

Шаг 4. Получение даты окончания срока действия пробной версии

Включите в приложение следующий код, определяющий дату истечения пробного периода.

В этом примере приводится код функции, получающей дату окончания срока пробной версии приложения. Если лицензия еще действует, отображайте дату истечения испытательного срока и количество оставшихся до нее дней.

void DisplayTrialVersionExpirationTime()
{
    if (licenseInformation.IsActive)
    {
        if (licenseInformation.IsTrial)
        {
            var longDateFormat = new Windows.Globalization.DateTimeFormatting.DateTimeFormatter("longdate");

            // Display the expiration date using the DateTimeFormatter.
            // For example, longDateFormat.Format(licenseInformation.ExpirationDate)

            var daysRemaining = (licenseInformation.ExpirationDate - DateTime.Now).Days;

            // Let the user know the number of days remaining before the feature expires
        }
        else
        {
            // ...
        }
    }
    else
    {
        // ...
    }
}

Шаг 5. Проверка работы функций с использованием имитации вызовов лицензии API

Теперь протестируйте приложение с помощью смоделированных данных. CurrentAppSimulator получает сведения о лицензировании для конкретных тестов из XML-файла с именем WindowsStoreProxy.xml, расположенного в папке %UserProfile%\AppData\local\packages\<package name>\LocalState\Microsoft\Windows Store\ApiData. Файл WindowsStoreProxy.xml можно отредактировать, изменив даты истечения пробного периода для вашего приложения и его компонентов. Протестируйте все возможные конфигурации лицензирования и пробных периодов и убедитесь, что все работает как надо. Дополнительные сведения см. в разделе Использование файла WindowsStoreProxy.xml с CurrentAppSimulator.

Если этот путь и файл не существуют, их нужно создать во время установки или выполнения приложения. Если файл WindowsStoreProxy.xml отсутствует в указанном выше расположении, при попытке обратиться к свойству CurrentAppSimulator.LicenseInformation возникнет ошибка.

Шаг 6. Замена сымитированных вызовов лицензии API на настоящие

После тестирования приложения с имитацией сервера лицензирования замените все CurrentAppSimulator элементами CurrentApp, как показано в следующем примере кода. После этого вы можете отправить приложение в Магазин для сертификации.

Важно!

Приложение, отправляемое в Store, должно использовать объект CurrentApp, иначе оно не пройдет сертификацию.

void InitializeApp()
{
    // Some app initialization code...

    // Initialize the license info for use in the app that is uploaded to the Store.
    // Uncomment the following line in the release version of your app.
    licenseInformation = CurrentApp.LicenseInformation;

    // Initialize the license info for testing.
    // Comment the following line in the release version of your app.
    // licenseInformation = CurrentAppSimulator.LicenseInformation;

    // Register for the license state change event.
    licenseInformation.LicenseChanged += LicenseInformation_LicenseChanged;

    // Other app initialization code...
}

Шаг 7. Описание работы с бесплатной пробной версией для пользователей

Не забудьте объяснить, как будет работать ваше приложение во время и после бесплатного пробного периода, чтобы поведение приложения не стало неожиданностью для клиентов.

Дополнительные сведения об описании приложения см. в разделе Создание описаний приложений.