Controllare se l'utente ha l'app Windows Phone aggiornata

di , in Windows Phone,

Windows Phone, come per le altre piattaforme, permette l'aggiornamento delle app attraverso il portale di gestione. In questo modo lo sviluppatore può correggere bug e introdurre nuove feature, distribuendole automaticamente agli utenti che hanno installato l'app. Il periodo che intercorre tra l'approvazione sullo store e l'effettivo aggiornamento può essere però più o meno lungo. Dipende dal sistema di distribuzione dello store, dal sistema di notifica sullo smartphone e dall'utente che deve premere il pulsante di aggiornamento.

Se la nostra app, però, necessita di usufruire sempre dell'ultima versione, possiamo controllare se l'utente ha l'app aggiornata e forzarlo mandandolo sullo store. Per farlo possiamo sfruttare un feed XML pubblico che contiene le informazioni sulla nostra app, tra cui la versione. Per farlo abbiamo bisogno di alcune informazioni: il ProductID, la versione attuale e la lingua dell'utente. Nello snippet seguente è mostrato il codice per leggere dal manifest i primi due attributi.

public static string GetAppAttributeValue(string attributeName)
{
  var xmlReaderSettings = new XmlReaderSettings
  {
    XmlResolver = new XmlXapResolver()
  };
  using (var xmlReader = XmlReader.Create("WMAppManifest.xml", xmlReaderSettings))
  {
    xmlReader.ReadToDescendant("App");

    return xmlReader.GetAttribute(attributeName);
  }
}

Di seguito invece la funzione asincrona per interrogare la versione sullo store e compararla con quella attuale.

private async Task<bool> CheckIsUpdated()
{
  // Preparo l'uri per interrogare il feed
  var url = string.Format("http://marketplaceedgeservice.windowsphone.com/v8/catalog/apps/{0}?os={1}&cc={2}&oc=&lang={3}?",
    GetAppAttributeValue("ProductID"),
    Environment.OSVersion.Version,
    CultureInfo.CurrentUICulture.TwoLetterISOLanguageName,
    CultureInfo.CurrentUICulture.Name);

  // Scarico il feed
  HttpClient client = new HttpClient();
  var response = await client.GetAsync(url);
  response.EnsureSuccessStatusCode();

  using (var stream = await response.Content.ReadAsStreamAsync())
  {
    // Cerco il nodo <version>
    var version = XElement.Load(stream).Descendants("{http://schemas.zune.net/catalog/apps/2008/02}version").FirstOrDefault();
    if (version == null)
      throw new InvalidOperationException("Cannot find version");

    // Comparo la versione attuale con quella del feed
    var currentVersion = new Version(GetAppAttributeValue("Version"));
    return (currentVersion.Equals(new Version(version.Value)));
  }
}

Nel caso l'app non sia aggiornata, possiamo rimandare l'utente allo store attraverso il task apposito.

protected async override void OnNavigatedTo(NavigationEventArgs e)
{
  base.OnNavigatedTo(e);

  var c = await CheckIsUpdated();
  if (!c)
  {
    MessageBox.Show("Per procedere è necessario aggiornare l'app.");
    // Apro la pagina di dettaglio
    new MarketplaceDetailTask().Show();
  }
}

Questa tecnica non è ufficialmente documentata, perciò non è detto che sarà sempre valida e funzionante. E' opportuno quindi gestire eventuali errori, ignorandoli, per preservare l'utilizzo dell'app.

Commenti

Visualizza/aggiungi commenti

Controllare se l'utente ha l'app Windows Phone aggiornata (#115) 1010 2
| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti

I più letti di oggi