45 дней с Windows Phone 7. День #22. Trial (пробная) версия приложения.
<< День #21. Приложения и игры.| День #23. Реклама в WP7 приложениях. >>
Это двадцать вторая статья серии «45 дней с Windows Phone 7».
Вчера мы говорили о том, как добавить приложение (игру) в хаб «Games». Сегодня мы узнаем, как сделать триальную (Trial) – пробную версию приложения или игры. На самом деле это не какая-то специализированная версия (.xap файл будет тот же), а просто некоторые дополнительные проверки в коде, благодаря которым в процессе работы приложение может изменять функциональность в зависимости от того, в каком режиме работает: полном или пробном. При покупке приложения в Marketplace, пользователь имеет возможность сначала приложение попробовать, а если оно ему понравится – уже заплатить деньги и использовать полную версию.

Иллюстрация с сайта pocketgamer.co.uk
На иллюстрации процесса покупки видно, что внизу экрана присутствуют две кнопки – попробовать (try) и купить (buy). Типичным примером использования данной функциональности являются игры. Допустим, игра имеет 50 уровней. Тогда разработчик может в пробной версии оставить возможность пройти игру только до 5-ого уровня, а для прохождения остальных будет требоваться покупка игры.
Использование класса LicenseInformation.
В пространстве имён «Microsoft.Phone.Marketplace» есть, в том числе класс «LicenseInformation», который позволяет получить информацию о текущем статусе оплаты нашего приложения. Подключим нужное пространство имён:
using Microsoft.Phone.Marketplace;
Следующим шагом будет создание экземпляра класса «LicenseInformation»:
var li = new LicenseInformation();
Это почти всё, что требуется сделать. Класс «LicenseInformation» содержит функцию «IsTrial», возвращающую булевское значение и позволяющую определить, работаем ли мы в пробном режиме:
if (!li.IsTrial())
{
//Сделать что-то, доступное только платным пользователям
}
else
{
//Сделать что-то, доступное пробным пользователям
}
Тестирование пробного режима.
К сожалению, нет никакого встроенного способа переключения между пробным и полным режимами при разработке приложения («IsTrial()» на эмуляторе возвращает false). Но я использую достаточно простой способ, чтобы иметь возможность отлаживать пробную версию. Для этого я проверяю, находимся ли мы в режиме отладки, и если да, то сохраняю в настройках приложения параметр «trialMode» в значении «true». Делается это в файле «App.xaml.cs»:
IsolatedStorageSettings _settings = IsolatedStorageSettings.ApplicationSettings;
public App()
{
UnhandledException += Application_UnhandledException;
_settings["trialMode"] = false;
if (System.Diagnostics.Debugger.IsAttached)
{
_settings["trialMode"] = true;
Application.Current.Host.Settings.EnableFrameRateCounter = true;
}
InitializeComponent();
InitializePhoneApplication();
}
В этом случае тестируется пробный режим, а для тестирования полного режима можно закомментировать строчку «_settings["trialMode"] = true;».
Теперь, проверяя в каком режиме работает приложение, требуется читать ещё и значение из настроек. Вот полный код нового варианта такой проверки:
LicenseInformation _li = new LicenseInformation();
IsolatedStorageSettings _settings = IsolatedStorageSettings.ApplicationSettings;
// Constructor
public MainPage()
{
InitializeComponent();
if (_li.IsTrial() || (bool)_settings["trialMode"])
{
//Сделать что-то, доступное пробным пользователям
}
else
{
//Сделать что-то, доступное только платным пользователям
}
}
Может это и не лучший способ, но он работает.
Определить, работает ли приложение в тестовом или полном режиме очень просто. Вам остаётся только подумать над тем, какую функциональность сделать доступной в тестовом режиме, а это уже сложнее.
Не заметил упоминания в статье о том что метод IsTrial() не стоит слишком часто вызывать – он медленный, хотя на MSDN вроде бы так писалось.
Да, ты прав, спасибо. Вызывать часто IsTrial() не стоит.
Вместо этого:
if (!li.IsTrial())
{
//Сделать что-то, доступное только платным пользователям
}
else
{
//Сделать что-то, доступное пробным пользователям
}
лучше один раз определить триальная версия или нет, а результат обращения хранить в отдельной переменной и уже ориентироваться на её значение.
Да, Вы абсолютно правы. Это хорошая оптимизация.
получается, что возможности продавать уровни, дополнительных персонажей отдельно не получится?
Видимо, пока не получится.