Tuesday, November 8, 2011

The perfect way to ask for a WP7 App Review...?

Today I got a mention on Twitter I really liked about the way I implemented "review begging" in my latest Windows Phone 7 app. I do it using the following code:

using System;
using Microsoft.Phone.Scheduler;

/* ...part of AboutPage.asmx.cs... */

public static void ResetReviewReminder(KloutSettings settings)
{
  const string name = "ReviewReminder";
  Action removeReminder = () => {
    if (ScheduledActionService.Find(name) != null)
      ScheduledActionService.Remove(name);
  };
#if DEBUG
  removeReminder();
  settings.UsedReviewButton = false;
#endif
  if (settings.UsedReviewButton)
  {
    removeReminder();
  }
  else
  {
    ScheduledAction reminder = ScheduledActionService.Find(name);
    if (reminder == null)
    {
      reminder = new Reminder(name)
      {
        Title = "How do you like me so far?",
        Content = "Would you mind using the about dialog " +
        "(tap here if Klout Tile is not running) " +
        "and writing a review?",
        NavigationUri = new Uri("/AboutPage.xaml", UriKind.Relative),
        RecurrenceType = RecurrenceInterval.Weekly,
        ExpirationTime = DateTime.Now.AddMonths(1),
      };
      if (System.Diagnostics.Debugger.IsAttached)
      {
        reminder.BeginTime = DateTime.Now.AddMinutes(5);
      }
      else
      {
        DateTime x = DateTime.Now.AddDays(7);
        reminder.BeginTime = new DateTime(x.Year, x.Month, x.Day, 12, 0, 0);
      }
      ScheduledActionService.Add(reminder);
    }
  }
}

What does this do?

That's an easy question to answer: if the application settings object (which is persisted in isolated storage) flags that the user has already used the review ApplicationBar button (in Klout Tile that's the star button in the About page), then any review reminder that is found is silently deleted. If however, the user has not used the review button in the About page yet and no existing reminder is found, it creates a new review reminder.

This reminder asks the user what she thinks about the app and also includes a NavigationUri that points to the About page. It is set to recur weekly for a maximum of about a month, starting three days from now. I think this is a reasonable "beg" period and frequency. (You can adjust as you see fit, of course.)

How do I use it?

Each time the Klout Tile app is started, I call AboutPage.ResetReviewReminder() once. This means that, if this is the first time the user starts the app, the user will be reminded three days later to please go add a review.

Apart from this I have the following code in my About page to handle the user clicking review button:

private void ReviewButton_Click(object sender, EventArgs e)
{
  var settings = KloutSettings.Load();
  settings.UsedReviewButton = true;
  settings.Save();
  ResetReviewReminder(settings);
  var review = new Microsoft.Phone.Tasks.MarketplaceReviewTask();
  review.Show();
}

This makes sure that when the user does click on the review button, any reminder that exists will be deleted and no more reminders will ever be (re)created in the future.

Some of the advantages

A lot of Windows Phone apps ask the user for a review. Some have buttons, which the user can easily choose/forget to (n)ever tap. Some wait a bit and ask the user for a review using a MessageBox with Ok/Cancel buttons, but this can be annoying for the user, as there is no "Not right now." option. Also, if the user installs your app, runs it onces and never uses it again, the code to show this message box will never get executed.

Using a system reminder like the code above does gives the following advantages:

  • We are able to show the user a review reminder, even if they only start the app once and never come back to it again. (Unless they uninstall it, of course.)
  • The review reminder is stored with other system reminders (like the ones from the Calendar), so they can be shown at any time, even if when the app is not running.
  • You do not need to use a background task to get this behavior, so even if the user disables your background task (which they can) the reminder will pop up.
  • If the reminder pops up at a time that is not convenient for the user, she can just snooze it, like any other reminder.
  • The user still has a way to just dismiss the reminder, but as it is a daily repeating one, it should pop up the next day (for a maximum of two weeks after first start).
  • When the reminder pops up while the app is not running, tapping the reminder opens the correct page inside the app directly to easily let the user initiate a review scenario. (For bonus points, the URI and About page could be changed so that when the user enters by tapping the reminder, the Microsoft.Phone.Tasks.MarketplaceReviewTask is executed directly, eliminating one further step!)
  • Finally, when the user uses the review button in the About page on their own, the reminder (whether already shown before or not) is silently deleted so the user is not bothered with our "review begging" ever again.

So I think using a Reminder to do you "review begging" might be the perfect solution. What do you think?

4 comments:

  1. I would hate an app messing with my reminders. In psychological terms, reminders initiate the fight or flight reflex for people, and having that invoked for an app review is a bit excessive.

    ReplyDelete
  2. That's subjective; I understand why you say that, but I obviously do not agree. They're not your reminders, but app reminders; they disappear when you uninstall the app and do not show up in your calendar at all. And reminders might trigger fight or flight for you, but I don't believe they do for everyone. So no, I do not think they are excessive.

    ReplyDelete
  3. mixed feelings for me... the problem could be if 100s of apps in our phone, all star to "remind us" for reviews... THAT would be annoying

    ReplyDelete
  4. You have hundreds of apps in your phone. As a developer I'm quite prolific, but I count only 106 (not counting some games). And they would all stop the reminder after using the review button in the app once or when the app is uninstalled. And would never do it for more than a short period of time (on a suggestion, a weekly reminder for a maximum of maybe a month sounds reasonable). So that would effectively one to a handful of reminders per app that uses thus method. No problem to me, and not to use surely (unless your objections are on principal). I'm still not convinced by negative comments. But I much like the reactions and discussion, I must say!

    ReplyDelete