понедельник, 18 февраля 2013 г.

Windows Store. Rate and Review

Каждому разработчику интересно, что думают пользователи о его программе, сервисе, сайте... Что устраивает, чего не хватает, что раздражает? Магазин Windows предоставляет возможность пользователям оценить и оставить отзыв о приложении. Вещь замечательная, но далеко не каждый пользователь использует эту возможность (а некоторые возможно и не знают). А ведь это может помочь рзработчикам улучшить свой продукт, исправить ошибки, да и вообще понять, что работаешь не зря! :) Поэтому, исключительно для блага, можно подтолкнуть пользователя на столь ответственный шаг. И лучше всего это сделать ненавязчиво, с минимальными затратами "пользовательских ресурсов".

Как же открыть страницу "Отзывы и оценки" в Windows Store из приложения? Это достаточно просто:

Code:
Launcher.LaunchUriAsync(new Uri(String.Concat("ms-windows-store:REVIEW?PFN=", Package.Current.Id.FamilyName)))

Где Package.Current.Id.FamilyName - это имя семейства пакета (Package family name), которое можно найти в манифесте приложения на вкладке Packaging.

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

RateHelper.cs:
    /// <summary>
    /// Helper rate class.
    /// </summary>
    public class RateHelper
    {
        #region Fields

        private readonly IRateStrategy rateStrategy;

        #endregion

        #region Ctor

        /// <summary>
        /// Initializes a new instance of the RateHelper class.
        /// </summary>
        /// <param name="rateStrategy">Strategy.</param>
        public RateHelper(IRateStrategy rateStrategy)
        {
            this.rateStrategy = rateStrategy;
        }

        #endregion

        #region Public Members

        /// <summary>
        /// Rate application.
        /// </summary>
        public async void Rate()
        {
            if (!rateStrategy.IfRequired()) return;
            var messageDialog = new MessageDialog("Пожалуйста, оцените его в магазине Windows!", "Понравилось приложение?");

            messageDialog.Commands.Add(new UICommand("Нет, спасибо", null, 0));
            messageDialog.Commands.Add(new UICommand("Оценить сейчас", delegate
                        {
                            Launcher.LaunchUriAsync(new Uri(String.Concat("ms-windows-store:REVIEW?PFN=", Package.Current.Id.FamilyName)));
                        }, 1));

            await messageDialog.ShowAsync();
        }

        #endregion
    }

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

RateStrategy.cs:
    /// <summary>
    /// Define rate strategy.
    /// </summary>
    public interface IRateStrategy
    {
        Boolean IfRequired();
    }

    /// <summary>
    /// Define rate strategy by default.
    /// </summary>
    public class DefaultRateStrategy : IRateStrategy
    {
        #region Fields

        private readonly ApplicationDataContainer localSettings;
        private readonly UInt32 internalStep;
        private readonly Boolean flag;

        #endregion

        #region Ctor

        /// <summary>
        /// Initializes a new instance of the DefaultRateStrategy class.
        /// </summary>
        /// <param name="step">Step.</param>
        public DefaultRateStrategy(UInt32 step)
        {
            localSettings = ApplicationData.Current.LocalSettings;
            internalStep = Parse(localSettings.Values["Step"]);
            if(internalStep > step) return;
            flag = internalStep == step;
            internalStep++;
            localSettings.Values["Step"] = internalStep;
        }

        #endregion

        #region IRateStrategy Members

        public Boolean IfRequired()
        {
            return flag;
        }

        #endregion

        #region Private Members

        private static UInt32 Parse(Object value)
        {
            var step = default(UInt32);
            if(value != null) UInt32.TryParse(value.ToString(), out step);
            return step;
        }

        #endregion
    }

Использовать данный код в своем приложении можно следующим способом:

App.xaml.cs:
    /// <summary>
    /// Invoked when the application is launched normally by the end user.  Other entry points
    /// will be used when the application is launched to open a specific file, to display
    /// search results, and so forth.
    /// </summary>
    /// <param name="args">Details about the launch request and process.</param>
    protected override async void OnLaunched(LaunchActivatedEventArgs args)
    {
        ...
        
        // Rate application
        var rateHelper = new RateHelper(new DefaultRateStrategy(1));
        rateHelper.Rate();
    }

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

4 комментария:

  1. А теперь оно будет запускаться всегда при повторном запуске? Или только один раз?

    ОтветитьУдалить
  2. Не знаю должно так или нет? Т.е. у меня прога состоит из нескольких окон. И так получается, что если запустить прогу, зайти в другое окно и выйти в главное окно, то запустится сообщение об оценке. Т.е. пользователь ещё очень мало познакомится с прогой.
    Как вариант, я в локальных настройках сохранил дату первого запуска и теперь через 5 дней "эксплуатации" запускается окно.

    ОтветитьУдалить
    Ответы
    1. Спасибо за комментарий!
      Да, если приложение многостраничное, то такой вариант (проверка в OnNavigatedTo) не подходит. Я немного изменил пример: теперь проверка запускается только один раз при старте приложения в методе OnLaunched класса App.xaml.cs (независимо от того сколько страниц в приложении). Также можно класс RateHelper сделать синглтоном и тогда тоже проблем не будет.

      Удалить