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
Sfruttare GPT-4o realtime su Azure Open AI per conversazioni vocali
Recuperare App Service cancellati su Azure
Referenziare un @layer più alto in CSS
Utilizzare Container Queries nominali
Creare una libreria CSS universale: i bottoni
Il nuovo controllo Range di Blazor 9
Gestione degli eventi nei Web component HTML
Proteggere le risorse Azure con private link e private endpoints
Montare Azure Blob Storage su Linux con BlobFuse2
Rendere i propri workflow e le GitHub Action utilizzate più sicure
Potenziare la ricerca su Cosmos DB con Full Text Search
Generare una User Delegation SAS in .NET per Azure Blob Storage
I più letti di oggi
- Visualizzare l'errore esteso di ASP.NET in base all'indirizzo IP di connessione
- Windows 8: ecco la prima preview, con tanto Metro
- Visual Studio Online e continuous deployment con Azure
- Visualizzare un template per browser mobile tramite un custom control ASP.NET
- Usare il RoleManager per gestire i ruoli con ASP.NET Identity
- Integrare OpenAI tramite Aspire
- Sfruttare un assembly da più applicazioni ASP.NET senza utilizzare la GAC
- Ottimizzare il codice #javascript con i Shorthand #patterns - terza parte https://aspit.co/ca7 di @morwalpiz
- Comprimere le immagini contenute in un repository con una GitHub Action
- Gestire i null nelle reactive form tipizzate di Angular