Conectividad en Xamarin Forms

  • xamarin-essentials
  • xamarin-forms

Hace unos días, desarrollando una aplicación móvil en Xamarin, me encontré en una situación en la que necesitaba conocer si el dispositivo tenía conexión a Internet o no y qué tipo de conexión tenía, ya que de no ser WIFI era necesario mostrar un mensaje informativo al usuario, indicándole que se iba a realizar un proceso que requería de un alto consumo de datos. De está manera, el usuario podía decidir si realizar la acción, consumiendo su tarifa de datos, o prefería esperar a tener WIFI.

Dados estos requisitos, lo primero que se me vino a la cabeza fue buscar si Xamarin.Essentials podría servirme de ayuda y…bingo!!, me proporcionaba justo la información que necesitaba, así que me puse manos a la obra.

_* Para el que desconozca Xamarin.Essentials, simplemente decir que es un paquete Nuget que está desarrollando la propia Microsoft y que simplifica el trabajo en aplicaciones multiplataforma evitando al desarrollador tener que realizar una implementación de una funcionalidad en varias plataformas. Aquí dejo un enlace en el que se explica en detalle todas las bondades de este paquete https://docs.microsoft.com/es-es/xamarin/essentials/_ 

Volviendo a mi problema con la conectividad, aquí detallo los pasos que seguí

 

Incluir paquete Xamarin.Essentials

Para poder trabajar con este paquete, lo primero que se debe hacer es incluirlo en todos los proyectos de la solución.

En el momento de escribir este post, el paquete todavía no tiene una versión definitiva, por lo que es necesario buscarlo teniendo marcada la opción de incluir versión preliminar

 

Configurando paquete

Para poder obtener información sobre la conectividad en iOS o Windows, no es necesario realizar configuración alguna. Sin embargo, en Android, es necesario conceder permisos de acceso al estado de la red (AccessNetworkState). Se puede hacer desde las propiedades del proyecto Android, en la opción Manifiesto de Android, dando los permisos necesarios (bastará con marcar la opción ACCESS_NETWORK_STATE

 

Obtener conectividad

Para obtener la conectividad del dispositivo, simplemente hay que acceder a la propiedad NetworkAccess de Connectivity, para lo que es necesario importar la librería Xamarin.Essentials

using Xamarin.Forms;

...

var currentNetworkAccess = Connectivity.NetworkAccess;

switch (currentNetworkAccess)
{
    case Xamarin.Essentials.NetworkAccess.Internet:
        NetworkAccess = "Local and internet access";
        break;
    case Xamarin.Essentials.NetworkAccess.ConstrainedInternet:
        //Limited internet access. Indicates captive portal connectivity, where local access to a web portal is provided, but access to the Internet requires that specific credentials are provided via a portal.
        NetworkAccess = "Limited internet connectivity";
        break;
    case Xamarin.Essentials.NetworkAccess.Local:
        NetworkAccess = "Local connectivity";
        break;
    case Xamarin.Essentials.NetworkAccess.None:
        NetworkAccess = "No connectivity";
        break;
    case Xamarin.Essentials.NetworkAccess.Unknown:
    default:
        NetworkAccess = "Unknown connectivity";
        break;
}

Los posibles valores que se pueden obtener son los siguientes:

  • NetworkAccess.Internet: Se tiene acceso local y a Internet. Es necesario tener en cuenta, que puede que el dispositivo nos indique este tipo de conectividad pero realmente no se disponga de Internet, debido a que se esté conectado vía Wifi a un router que no proporciona salida a Internet.
  • NetworkAccess.ConstrainedInternet: Se tiene un acceso restringido a Internet. Para obtener acceso se pedirán unos credenciales específicos.
  • NetworkAccess.Local: Solo se puede acceder a una red local.
  • NetworkAccess.None: No se dispone de conexión.
  • NetworkAccess.Unknown: Se desconoce el acceso que se tiene.

 

Obtener tipo de conexión

Otro tipo de información que se puede obtener, son los tipos de conexión que están activos en el dispositivo. Dicha información se puede encontrar en la propiedad Profiles de Connectivity. Al igual que en el punto anterior, es necesario importar Xamarin.Essentials

using Xamarin.Forms;

...

var currentProfiles = Connectivity.Profiles;

//Possible values: Bluetooth, Cellular, Ethernet, Wifi, WiMAX, Other
Profile = string.Join(", ", currentProfiles);

En este caso, se obtiene una colección de valores, entre los que se puede encontrar Bluetooth, Cellular, Ethernet, Wifi, WiMAX y otros.

 

Notificación de cambios

Por último, indicar que puede ser interesante saber en qué momento cambia la conectividad del dispositivo o éste se conecta/desconecta a un tipo de conexión. Para estar informados de estos cambios, podemos suscribirnos al evento ConnectivityChange que se encuentra en Connectivity. Al igual que en el resto de puntos, para trabajar con Connectivity se necesita importar Xamarin.Essentials

using Xamarin.Forms;

...

Connectivity.ConnectivityChanged += Connectivity_ConnectivityChanged;

...

private void Connectivity_ConnectivityChanged(object sender, ConnectivityChangedEventArgs e)
{
    var access = e.NetworkAccess;
    var profiles = e.Profiles;
}

Entre los argumentos que nos envía el evento, se encuentran los propiedades NetvorkAccess y Profiles, en las que se pueden encontrar la conectividad y el tipo de conexión anteriormente explicados.

 

Aquí os dejo un enlace en el que encontrar un proyecto de ejemplo con una implementación completa del ejemplo.

https://github.com/jorgediegocrespo/XamarinConnectivity

 

Un saludo!!