Sto modificando la mia app per WP7 che riporta le previsioni dell’Osmer del Friuli Venezia Giulia.
Essendo una applicazione che recupera in tempo reale le informazioni dal sito, mi sono trovato a gestire il caso della mancanza di connettività.
La prima (brutta) soluzione è stata intercettare alla apertura della View principale l’assenza di connettività e mostrare un messaggio all’utente prima di… lasciare “crashare elegantemente” l’applicazione
Con la prossima versione l’utente, in mancanza di una qualsiasi connettività, verrà re-diretto al una View che gli notificherà il problema, altrimenti aprirà la View principale.
Come fare tutto questo:
1) Nel “WMAppManifest.xml” bisogna cambiare la NavigationPage verso una inesistente pagina:
<Tasks>
<DefaultTask Name="_default" NavigationPage="DummyPage.xaml" />
</Tasks>
2) Nel costruttore della app aggiungo una chiamata alla routine di redirezione:
/// <summary>
/// Constructor for the Application object.
/// </summary>
public App()
{
// Global handler for uncaught exceptions.
UnhandledException += Application_UnhandledException;
// Standard Silverlight initialization
InitializeComponent();
// Phone-specific initialization
InitializePhoneApplication();
ManageStartPageRedirection();
// ....
3) Questa è la routine che gestisce la re-direzione utilizzando l’UriMapper:
private void ManageStartPageRedirection()
{
var mapper = new UriMapper();
string uriString = string.Empty;
if (PhoneUtility.HasInternetConection)
{
uriString = "/Views/MainPage.xaml";
}
else
{
uriString = "/Views/NoConnectionPage.xaml";
}
mapper.UriMappings.Add(new UriMapping
{
Uri = new Uri("/DummyPage.xaml", UriKind.Relative),
MappedUri = new Uri(uriString, UriKind.Relative)
});
this.RootFrame.UriMapper = mapper;
}
4) Per completezza la verifica della connettività viene fatta con la seguente riga di codice
public class PhoneUtility
{
public static bool HasInternetConection
{
get
{
return (NetworkInterface.NetworkInterfaceType != NetworkInterfaceType.None);
}
}
}
Se intanto volete provare la app e lasciare qualche feedback, la cosa sarà ben accetta.
Update: mi sono dimenticato di menzionare la fonte di cotale inspirazione (mica avrete pensato che fosse farina del mio sacco vero? )… eccola qui.