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
Le cron expression di un workflow di GitHub
Utilizzare @property per animare nativamente un oggetto HTML tramite CSS
Arricchire l'interfaccia di .NET Aspire
Utilizzare i variable font nel CSS
Utilizzare il metodo ExceptBy per eseguire operazione di sottrazione tra liste
Gestire codice JavaScript con code splitting e lazy loading
Effettuare un clone parziale di un repository di GitHub
Supportare la sessione affinity di Azure App Service con Application Gateway
Creare espressioni riutilizzabili nelle query LINQ per Entity Framework
Montare Azure Blob Storage su Linux con BlobFuse2
Configurare lo startup di applicazioni server e client con .NET Aspire
Controllare la velocità di spostamento su una pagina HTML


