Classifique a App

Classificação é um processo importante no desenvolvimento de apps. Utilizadores terão preferência por uma app com (boa) classificação. Este artigo tem como objetivo demonstrar como, em apps desenvolvidas em C# para Windows 8 e Windows Phone 8, sugerir ao utilizador que classifique a app e envie o seu feedback após um dado número de utilizações. 

O método consiste em gravar o número de vezes que o utilizador abre a aplicação, e, à quinta vez, sugerir ao utilizador que classifique a app. O código está desenvolvido para poder ser usado numa app universal1, mas poderá também ser utilizado em aplicações individuais.

Namespaces:

using System;                 // Uso Uri Email
using System.Threading.Tasks; // Funções Assíncronas
using Windows.System;         // Launcher para abertura Store
using Windows.ApplicationModel.Store; // App ID
using Windows.UI.Popups;      // Caixas Mensagem

Iremos usar as seguintes variáveis:

    • Chaves que irão guardar informação do contador de aberturas e estado da classificação:
      public static string chaveContadorAberturas = "CLASSIFIQUE_APP_CONTADOR_ABERTURAS";
      public static string chaveClassificada = "CLASSIFIQUE_APP_CLASSIFICADA";
    • Variáveis que irão conter valor lidos e valores a serem gravados:
      public static int contadorAberturas = 0;
      public static bool classificada = false;

Para review, iremos usar uma função:

public async static void AppReview()
{
}

Começamos por verificar nas definições da app se foi classificada, usando uma função GetSetting:

classificada = GetSetting<bool>(chaveClassificada, false);

Função GetSetting:

public static T GetSetting<T>(string key, T defaultValue)
{
   if (Windows.Storage.ApplicationData.Current.LocalSettings.Values.ContainsKey(key))
   {
      return (T)Windows.Storage.ApplicationData.Current.LocalSettings.Values[key];
   }
   else
   {
      return defaultValue;
   }
}

Usamos o Windows.Storage.ApplicationData para obter valores previamente guardados nas definições da app. Se a chave não existir, no caso de a app ser aberta pela primeira vez, devolve o valor por defeito, que deve ser introduzido na chamada da função. No caso da variável classificada, o valor por defeito será false.

Após leitura do valor, iremos verificar se a app foi classificada:

if (!classificada)
{
}

Se a app não tiver sido classificada, iremos ler contador aberturas:

contadorAberturas = GetSetting<int>(chaveContadorAberturas, 0);

Incrementamos a abertura atual:

contadorAberturas ++;

Se a app tiver sido aberta 5 vezes2, chamamos função review:

if (contadorAberturas == 5)
{
     await Review();
}

Por fim, guardamos o novo número de aberturas e estado da classificação, usando a função StoreSettings, similar à função GetSettings, mas usada para gravar definições:

StoreSetting(chaveContadorAberturas, contadorAberturas);
StoreSetting(chaveClassificada, classificada);

Função StoreSetting:

public static void StoreSetting(string key, object value)
{
   Windows.Storage.ApplicationData.Current.LocalSettings.Values[key] = value;
}

Função AppReview completa:

public async static void AppReview()
{
   //Variáveis que irão conter valor lidos e valores a serem gravados
   classificada = GetSetting<bool>(chaveClassificada, false);

   if (!classificada)
   {
      contadorAberturas = GetSetting<int>(chaveContadorAberturas, 0); //Valor por defeito 0, se não tiver nenhum valor (caso app abertura primeira vez)
      contadorAberturas ++; // Acrescenta ao contador abertura atual
 
      if (contadorAberturas == 5)
      {
         await Review();
      }

      StoreSetting(chaveContadorAberturas, contadorAberturas);
      StoreSetting(chaveClassificada, classificada);
   }
}

Função Review:

public static async Task<bool> Review()
{
   classificada = true;
   var messageDialog = new MessageDialog("Testou a App 5 vezes. Gostaria de a classificar?");
   messageDialog.Commands.Add(new UICommand("Sim"));
   messageDialog.Commands.Add(new UICommand("Não"));
   var messageResult = await messageDialog.ShowAsync();

   if (messageResult.Label == "Sim")
   {
#if WINDOWS_PHONE_APP
      await Launcher.LaunchUriAsync(new Uri("ms-windows-store:reviewapp?appid=" + CurrentApp.AppId.ToString()));
#else
      await Launcher.LaunchUriAsync(new Uri("ms-windows-store:review?PFN=" + CurrentApp.AppId.ToString()));
#endif
   }
   else
   { 
      var messageDialogFeedback = new MessageDialog("Gostaria de nos dar o seu feedback sobre a App?");
      messageDialogFeedback.Commands.Add(new UICommand("Sim"));
      messageDialogFeedback.Commands.Add(new UICommand("Não "));
      var messageResultFeedback = await messageDialogFeedback.ShowAsync();

      if (messageResultFeedback.Label == "Sim")
      {
         var mailTo = new Uri("mailto:?to=email@domain.com&subject=Classifique a App - App Feedback&body=Escreva aqui o seu feedback");
         await Windows.System.Launcher.LaunchUriAsync(mailTo);
      }
   }
   return true;
}

Na função Review, apresentamos uma mensagem para sugerir classificação.

Classificar app Windows: sugerir review

Caso o utilizador queria classificar a app, obtemos o ID da nossa app3, usando CurrentApp.AppId, e redirecionamos o utilizador para a página da app na Windows Store, usando o protocolo Review4.

Classificar app Windows: ecrã de review

Caso o utilizador não queira classificar a app, convidamos a dar o seu feedback

Classificar app Windows: sugerir feedback

Caso o utilizador queira dar o seu feedback, redirecionamos para um novo email (que será aberto no editor de email predefinido), preenchendo “De:” com o email suporte, e “Assunto”.

Classificar app Windows: ecrã de feedback

Agora basta fazer uma chamada à função AppReview no LoadState da app. Como inseri a função no ficheiro na classe comum App, estou a chamar a função da seguinte forma:

App.AppReview();

Se usar numa app única, basta chamar a função, não universal:

AppReview();

Notas

  1. Apps desenvolvidas com target para Windows 8 e Windows Phone 8, com código partilhado. Mais informações: http://msdn.microsoft.com/en-us/library/windows/apps/dn609832.aspx
  2. Novas apps universais para Windows 8.1 e Windows Phone 8.1 usam Windows.Storage.ApplicationData. Para versões anteriores do Windows Phone, é usada função IsolatedStorageSettings.
  3. O ID de uma app é atribuído durante publicação na Store.
  4. Mais detalhes sobre protocolos em: http://msdn.microsoft.com/en-us/library/windows/apps/hh974767.aspx