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
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Introduzione ai web component HTML
Recuperare automaticamente un utente e aggiungerlo ad un gruppo di Azure DevOps
Utilizzare Intersect e Except per filtrare set di dati in TSql
Configuratione e utilizzo .NET Aspire CLI
Gestione ciclo di vita in .NET Aspire
Eseguire query in contemporanea con EF
Integrare modelli AI in un workflow di GitHub
Importare repository da Bitbucket a GitHub Enterprise Cloud
Utilizzare WebJobs su Linux con Azure App Service
Escludere alcuni file da GitHub Copilot
Integrare un servizio esterno con .NET Aspire
Managed deployment strategy in Azure DevOps


