Gestión de la conexión a internet en una aplicación Windows 8.1

jueves, 16 de octubre de 2014

Logo No Internet Connection


En una aplicación móvil es importante gestionar la conectividad de la aplicación a intenet. Vamos a ver en este artículo de que forma podemos realizar esta gestión cuando desarrollamos una aplicación para la tienda de Windows, para la versión Windows 8.1.

Cómo nos enteramos cuando se pierde y se recupera la conexión

Cuando desarrollamos aplicaciones para Windows Store existe una clase que se llama NetworkInformation para obtener información sobre la conexión de red.

Para conocer el momento en que la conexión a internet cambia, ya sea porque se pierde o porque se recupera, debemos de suscribirnos al evento NetworkStatusChanged de la clase NetworkInformation.

NetworkInformation.NetworkStatusChanged += (sender) =>
{
    //código a realizar cuando la conexión cambia
};  

Cómo sabemos si hay conexión

Si invocámos la función GetInternetConnectionProfile de la clase NetworkInformation nos devuelve el perfil de internet actual y deberemos invocar la función GetNetworkConnectivityLevel del perfil. Esta función nos puede devolver 4 posibles valores None, LocalAccess, ConstrainedInternetAccess, InternetAccess.

var profile = NetworkInformation.GetInternetConnectionProfile();

var isConnected = (profile != null
    && profile.GetNetworkConnectivityLevel() == 
    NetworkConnectivityLevel.InternetAccess);    

Encapsulando la gestión de la conexión en un servicio

Como hemos podido ver, para saber si hay conexión a internet y para enterarnos cuando ha cambiado el estado de la conexión es algo que requiere varios pasos. Esta lógica a mi me gusta que quede encapsulada en una clase, de forma que pueda ser reutilizada en diferentes puntos de la aplicación, incluso tambíen puede ser interesante reutilizar esta clase en diferentes aplicaciones que desarrollemos para la tienda de windows.

Esta clase la vamos a llamar InternetConnectionService y mediante una propiedad IsConnected devolverá si hay conexión a internet. Además tendrá una variable Action pública que ejecutará cuando se produce un cambio en la conexión a internet. De esta forma el servicio puede ejecutar un código externo al servicio cuando la conexión cambie.

    public class InternetConnectionService
    {
        public static Action ConnectionChangeAction;

        static InternetConnectionService()
        {
            NetworkInformation.NetworkStatusChanged += (sender) =>
            {
                ExecuteChangeAction();
            };
        }

        private static void ExecuteChangeAction()
        {
            if (ConnectionChangeAction != null)
                ConnectionChangeAction();
        }
 
        public static bool IsConnected
        {
            get
            {
                var profile = NetworkInformation.GetInternetConnectionProfile();

                var isConnected = (profile != null
                    && profile.GetNetworkConnectivityLevel() == 
                    NetworkConnectivityLevel.InternetAccess);
                return isConnected;
            }
        }
    }

Ejemplo de uso del servicio

Imaginemos que estamos desarrollando una aplicación donde tenemos un requisito que consiste en mostrar una página de error en la conexión a internet cuando esta no exista y que vuelva a cargar la página inicial cuando se restablezca la conexión.

Bajo estas condiciones nos podemos apoyar en la clase InternetConnectionService para realizar esta gestión.

En el constructor de la aplicación podríamos dar valor al Action del servicio que gestiona la conexión a internet para que en caso de cambio en la conexión invoque una función anónima donde verificamos si hay conexión a internet para mostrar la página inicial o la pagina de error en la conexión a internet.
currentWindow = Window.Current;

InternetConnectionService.ConnectionChangeAction =
    async () =>
    {
        await currentWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
        {
            Frame frame = (currentWindow.Content as Frame);

            if (InternetConnectionService.IsConnected)
                frame.Navigate(typeof(AmazonAdvancedSearch.Views.SearchPage));
            else
                frame.Navigate(typeof(AmazonAdvancedSearch.Views.NoInternetPage));
        });
    };


Fijaros que previamente nos hemos guardado Window.Current en una variable local, esto lo he hecho porque si la ventana de la aplicación no esta activa cuando cambia la conexión a internet Window.Current sera null pero si nos guardamos cuando esta activa, podremos navegar a otra página. Por ejemplo la ventana de la aplicación puede no estar activa si nos vamos al panel de settings para desactivar la wifi.

Resumen

En este artículo primero hemos visto de que forma podemos saber en aplicaciones para la tienda de windows, si hay conexión a intenter y también cómo podemos enterarnos cuando se ha perdido o recuperado la conexión.

Después hemos visto cómo podemos encapsular esta lógica en un servicio de forma que podámos invocarlo desde cualquier punto de la aplicación. Este servicio puede ser reutiliado en diferentes aplicacíones.

Finalmente hemos visto un ejemplo de utilización de este servicio para mostrar una página de error cuando se pierde la conexión a internet.

Libros relacionados

Windows 8.1 Apps with XAML and C# Unleashed

Pro Windows 8.1 Development with XAML and C#

No hay comentarios:

Publicar un comentario