> For the complete documentation index, see [llms.txt](https://elguerre.gitbook.io/de0an/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://elguerre.gitbook.io/de0an/capitulo-5-la-construccion.-implementando-requisitos/recordatorio-para-la-valoracion-y-comentarios.md).

# Pantalla de Recordatorio para la valoración y comentarios

Una alternativa para recordar al usuario que tiene que valorar la aplicación, siempre y cuando no lo haya hecho previamente, es presentarle un mensaje indicando dicho propósito. Para ello, tendremos en cuenta algunos puntos previos:

* Iniciar un contador de visitas cuando el usuario entre por primera vez a la aplicación.
* Guardar una marca indicando que el usuario realizó ya la valoración.
* En caso de no haberla hecho, y una vez que el contador llegue a un número de visitas determinado, mostrar un mensaje recordándole que su valoración (o *feedback)* es muy importante, incluso para él mismo. ¡Podremos seguir mejorando la aplicación para adaptarla a sus necesidades reales!
* Si la respuesta a la valoración es afirmativa dirigir al usuario a la ventana de valoración, en la Tienda de Windows.
* Si la respuesta es negativa. Reiniciar el contador a cero.

Incluiremos toda la funcionalidad anterior en el servicio *FeedbackService*, y utilizaremos un nuevo paquete NuGet *UniversalRateReminder* que nos facilitará la implementación.

```csharp
public static async Task CheckRateReminderAsync()
{
    try
    {
        RatePopup.LaunchLimit = COUNT; // 5 valor por defecto.
        RatePopup.ResetCountOnNewVersion = true;
        RatePopup.RateButtonText = LocalizedStrings.ButtonRate;
        RatePopup.CancelButtonText = LocalizedStrings.ButtonCancel;
        RatePopup.Title = LocalizedStrings.RateAppTitle;
        RatePopup.Content = LocalizedStrings.RateAppMessage;
        if (Microsoft.Toolkit.Uwp.ConnectionHelper.IsInternetAvailable)
        {
            var result = await RatePopup.CheckRateReminderAsync();
            if (result == RateReminderResult.Dismissed)
            {
                FeedbackPopup.ContactEmail = Constants.EMAIL_AUTHOR;
                FeedbackPopup.EmailSubject = LocalizedStrings.AboutEmailSubjectSugestions;
                FeedbackPopup.EmailBody = String.Empty;
                FeedbackPopup.Title = LocalizedStrings.AboutFeedbackPoputTitle;
                FeedbackPopup.Content = LocalizedStrings.AboutFeedbackPoppupContent;
                FeedbackPopup.SendFeedbackButtonText = LocalizedStrings.ButtonYes;
                FeedbackPopup.CancelButtonText = LocalizedStrings.ButtonNo;
                await FeedbackPopup.ShowFeedbackDialogAsync();
            }
        }
    }
    catch
    {
        // Si la valoración falla, la aplicación tiene que continuar.
        // TODO: Pendiente implementar registro de trazas.
    }
}
```

En el método *CheckRateReminderAsync*, hemos incluido una funcionalidad para sugerir al usuario que nos envíe un email en caso de descartar la valoración.

En el método *OnStartAsync* de la clase *App.xaml.cs* simplemente añadiremos la siguiente instrucción:

```csharp
FeedbackService.CheckRateReminderAsync();
```

Es importante no incluir el operador *await* pese a que la función sea asíncrona y recibamos una advertencia en el código. La presentación del mensaje de valoración no puede interrumpir el inicio normal de la aplicación y si anteponemos este operador, será necesario la confirmación del usuario para poder proseguir con el inicio.

Esta advertencia se produce siempre que, al llamar a un método asíncrono dentro de otro, no se especifique el parámetro *await*. Para evitártela tenemos varias alternativas:

1. Anteponer y posponer directivas que eviten que el compilador tenga en cuenta la instrucción.

```csharp
#pragma warning disable CS4014
    FeedbackService.CheckRateReminderAsync();
#pragma warning restore CS4014
```

2. Decorar el método *OnStartAsync*.

```csharp
[System.Diagnostics.CodeAnalysis.SuppressMessage(
    "Await.Warning",
    "CS4014:Await.Warning",
    Justification="El método FeedbackService.CheckRateReminderAsync
    debe mostrar el mensaje de valoración al usuario sin que se
    interrumpa el inicio de la aplicación"
    )]
```

3. Asignar el método *CheckRateReminderAsync*, a una variable que posteriormente sea ignorada.
4. Crear una extensión, para la clase *System.Threading.Tasks.Task*.

```csharp
[System.Diagnostics.CodeAnalysis.SuppressMessage(
    "Microsoft.Usage",
    "CA1801:ReviewUnusedParameters",
    MessageId = "task")]
    public static void RunAndForget(this Task task)
{
}
```

Cualquiera de ellas es válida, si bien, dependerá del contexto donde queramos usarlas. Quizás, la última pueda parecer la más limpia para nuestro caso particular, pero, debemos saber que, si se producen excepciones, no serán capturadas. Por el momento, es justo lo que queremos así que nos decidiremos por ella. Para más información sobre este tema en particular visitar la página <https://msdn.microsoft.com/es-es/library/hh873131.aspx>.

La siguiente figura muestra el mensaje para recordar al usuario que realice valoración durante la ejecución de la aplicación en el PC y en el móvil.

![](https://240651724-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FfrvHBNivOTy0fVKROgzo%2Fuploads%2Fgit-blob-f6208d829dd2ae3d6cd5fc8e6f6e9c82ccfc6438%2Fimage17.png?alt=media) ![](https://240651724-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FfrvHBNivOTy0fVKROgzo%2Fuploads%2Fgit-blob-37333f90f4ce52d7be70500aa71586ebf7ae044d%2Fimage18.png?alt=media)

**Figura 17.- Mensaje mostrado al usuario para la valoración de la aplicación**

{% hint style="info" %}
**Nota**: Una buena valoración de la aplicación nos hará tener mayor visibilidad y puntuación en la Tienda, mejorando probablemente las descargas y obteniendo un mayor beneficio si cobramos por uso.
{% endhint %}
