Cómo administrar eventos de conexión de red y cambios de disponibilidad (HTML)

[ Este artículo está destinado a desarrolladores de Windows 8.x y Windows Phone 8.x que escriben aplicaciones de Windows en tiempo de ejecución. Si estás desarrollando para Windows 10, consulta la documentación más reciente

En este tema se muestra cómo registrarse para recibir notificaciones de cambios de estado de la conexión de red y recuperar la información del estado actual con clases del espacio de nombres Windows.Networking.Connectivity.

También proporcionamos recomendaciones para lograr un comportamiento de la aplicación que admita una experiencia de usuario uniforme en los escenarios de red.

Requisitos previos

En los siguientes ejemplos se usa JavaScript y están basados en la muestra de información de red. Para obtener ayuda sobre cómo crear una aplicación de Windows en tiempo de ejecución con JavaScript, consulta Crear la primera aplicación de Windows en tiempo de ejecución con JavaScript.

Es importante saber qué es un ConnectionProfile y cómo tener acceso a la información que representa. Si quieres obtener más información, consulta el tema Cómo recuperar información de conexión de red. Si quieres ver más ejemplos de código, descarga la muestra de información de red.

¿Qué es un evento de cambio del estado de la conexión?

Los eventos de cambio de estado indican cambios en la disponibilidad, el tipo o el costo de conectividad que ofrece una conexión en particular. Las últimas aplicaciones en conectarse encuentran con frecuencia escenarios de cruce seguro, típicos del uso de dispositivos móviles. Cuando Windows en tiempo de ejecución detecta una nueva red, la proporciona automáticamente como una nueva opción de conectividad. Por ejemplo, si un usuario usa un dispositivo en una red 3G o 4G para hacer streaming de datos y después entra en el alcance de una red Wi-Fi, la nueva opción de conectividad estará disponible para que la aplicación pueda aprovecharla. Por supuesto, esto también implica que un usuario puede salir del alcance de una red, incluso de una red que esté usando en ese momento.

Teniendo en cuenta todas estas posibilidades, creemos que es importante que dotes a la aplicación de una lógica que admita opciones inteligentes ante cambios en la disponibilidad de red. Las conexiones de red existentes no cambiarán automáticamente a otras conexiones como si nada. Tu aplicación deberá registrarse para eventos de networkstatuschanged y adaptarse en consecuencia.

Registro para notificaciones de eventos de cambio del estado de la conexión

Antes de que la aplicación pueda adaptarse a los cambios del estado de la red, necesita saber que se producen. El código de ejemplo siguiente muestra cómo registrarse para notificaciones de eventos para networkstatuschanged para un perfil de conexión específico.

Debes escribir código para controlar las excepciones cuando llamas a la mayoría de los métodos de red asincrónicos. Además, los métodos del espacio de nombres Windows.Networking.Connectivity que se registran para notificaciones de eventos o intentan recuperar un ConnectionProfile pueden iniciar excepciones. Tu controlador de excepciones puede recuperar información más detallada sobre la causa de la excepción para comprender mejor el error y tomar las decisiones adecuadas. Para obtener más información, consulta Cómo controlar excepciones en aplicaciones de red.


// Define some variables used

// A variable to store network status change information
var internetProfileInfo = "";

// A  boolean to keep track of registration for network status change notifications
var registeredNetworkStatusNotif = false;

var networkInfo = Windows.Networking.Connectivity.NetworkInformation;

//Register for Network Status Change notifications, and display new Internet Connection Profile information on network status change
function registerForNetworkStatusChangeNotif() {

    // register for network status change notifications
    if (!registeredNetworkStatusNotif) {
        try {
            networkInfo.addEventListener("networkstatuschanged", onNetworkStatusChange);
            registeredNetworkStatusNotif = true;

            if (internetProfileInfo === "") {
                mySample.displayStatus("No network status change. ", "sample", "status");
        }
        catch (e) {
            mySample.displayError("An unexpected exception occured: " + e.name + ": " + e.message);
        }
    }
}

Cuando un escenario de red cambia, es posible que debas anular el registro de tu aplicación para recibir notificaciones de estado de la red si la aplicación está registrada, y volver a registrarla para que reciba notificaciones del nuevo escenario de red.

//Unregister for Network Status Change notifications
function unRegisterForNetworkStatusChangeNotif() {
    try {
        networkInfo.removeEventListener("networkstatuschanged", onNetworkStatusChange);
        internetProfileInfo = "";
    }
    catch (e) {
        mySample.displayError("An unexpected exception occured: " + e.name + ": " + e.message, "sample", "error");
    }
}

Recuperación de la información sobre cambios del estado de la conexión

Cuando se produce un cambio de estado, el ejemplo siguiente de un controlador de eventos recupera el ConnectionProfile asociado del perfil de conexión a Internet actual. Este ConnectionProfile puede usarse para recuperar y mostrar la información del estado de conexión, que incluye el ámbito actual, el tipo y el costo de conectividad, tal como están definidos por el NetworkConnectivityLevel, los NetworkTypes y el NetworkCostType.

// Event handler for Network Status Change event
function onNetworkStatusChange(sender) {

    //network status changed
    internetProfileInfo = "Network Status Changed: \n\r";

    try {
        // get the ConnectionProfile that is currently used to connect to the Internet
        var internetProfile = networkInfo.getInternetConnectionProfile();
        if (internetProfile === null) {
            mySample.displayStatus("Not connected to Internet\n\r");
        }
        else {
            internetProfileInfo += getConnectionProfileInfo(internetProfile) + "\n\r";
            mySample.displayStatus(internetProfileInfo);
        }
        internetProfileInfo = "";
    }
    catch (e) {
            mySample.displayError("An unexpected exception occured: " + e.name + ": " + e.message, "sample", "error");
    }
}

Hay varios estados de red que pueden cambiar y que, como resultado, producen un evento de cambio de estado de red. Entre ellos, se cuenta si el dispositivo tiene un ConnectionProfile nuevo, un costo de conexión nuevo, el nivel de conectividad y otros cambios. El controlador de eventos anterior puede usar la clase NetworkStateChangeEventDetails para determinar qué ha cambiado.

Comportamiento de la aplicación recomendable para controlar cambios de estado de la conexión

En la siguiente tabla, se describen los principales escenarios de cambio de estado de conexión y se proporcionan recomendaciones para el comportamiento de la aplicación:

Escenario Comportamiento recomendado
Pérdida de conexión debida a un error

Se pueden reestablecer las conexiones simplemente con volver a intentar la operación de red. Si se produce un error, espera a que un evento networkstatuschanged recupere la información sobre el estado de conexión actual. Recomendamos que las aplicaciones usen un intervalo de tiempo de espera aleatorio exponencialmente creciente entre reintentos, comenzando con un valor de 50 milisegundos.

Pérdida de la red

Informa al usuario de que se ha perdido la conexión, regístrate y espera a un evento networkstatuschanged.

Disponibilidad de una nueva red

Con dispositivos móviles, son habituales los escenarios en que un solo dispositivo atraviesa varias redes públicas y privadas. Por ejemplo, puede que un usuario esté conectado a una banda ancha móvil y esté chateando con amigos mediante la aplicación Mensajes, antes de llegar a su casa y de conectarse a la red doméstica sin restricciones. La directiva predeterminada de Windows 8, Windows Server 2012 y Windows Phone 8.1 y versiones posteriores consiste en preferir una red no restringida antes que una red de uso medido y una red más rápida antes que una red más lenta. Sin embargo, las conexiones existentes establecidas por una aplicación no cambian automáticamente a una nueva red. La aplicación debe involucrarse porque solo la aplicación puede tomar la mejor decisión sobre si se debe cambiar o no a la nueva red.

Si la descarga de una secuencia de vídeo está a punto de terminar, puede que no tenga sentido cambiar a la nueva red y reiniciar la descarga. Sin embargo, si la red actual pierde paquetes, es demasiado lenta, o la secuencia va a necesitar más tiempo para completarse, podría ser aconsejable cambiar a la nueva red.

Si determinas que es conveniente cambiar de red para el escenario de tu aplicación, sigue estas instrucciones cuando detectes una red nueva:

1. Comprueba el coste de la red y vuelve a intentar la acción de red si hay disponible una conexión mejor. Windows selecciona automáticamente la red sin restricciones sobre la de uso medido y la red más rápida sobre la más lenta, si están disponibles.

2. Al reintentar la operación de red, si se realiza correctamente, cancela la operación de red original en la red anterior, si existe.

Cambio de costo de la red

Las redes móviles, en particular, implantan restricciones muy específicas sobre el uso. Si tu aplicación encuentra un cambio en el costo de red porque se ha consumido más del 80% del límite de datos de banda ancha móvil, el costo variable o el roaming, adapta el comportamiento de la aplicación, como se detalla en Cómo administrar límites de costos de red de uso medido.

 

Nota  Los desarrolladores avanzados también pueden elegir optimizar el comportamiento de la aplicación cuando reintentan las operaciones de red. Por ejemplo, quizás quieras reemplazar una conexión existente por una nueva que tenga mayor velocidad. En este escenario, un desarrollador puede usar las API de sockets, como StreamSocketInformation.bandwidthStatistics, para determinar si se puede cambiar a otra conexión.

 

Resumen

En este tema revisamos cómo registrarse para notificaciones de cambio del estado de conexión y cómo usar estas notificaciones para recuperar información sobre el estado actual desde el ConnectionProfile para el cual se produjo el evento. También revisamos el comportamiento recomendado para la aplicación cuando se trata de los escenarios de cambio de estado más habituales.

Aunque este tema trata sobre la disponibilidad de la red, en los escenarios con conexiones a redes de uso medido, un evento networkstatuschanged también puede representar un cambio en las propiedades de plan de datos y costo. Para obtener más información e instrucciones sobre cómo cambiar mejor el comportamiento de la aplicación en estos escenarios, consulta Cómo administrar límites de costos de red de uso medido.

Temas relacionados

Otros

Crear la primera aplicación de Windows en tiempo de ejecución con JavaScript

Cómo controlar excepciones en aplicaciones de red

Cómo administrar límites de costos de red de uso medido

Cómo recuperar información de localidad y adaptador de red

Cómo recuperar la información de conexión de red

Cómo recuperar datos de uso de conexión de red

Referencia

ConnectionProfile

NetworkInformation

networkstatuschanged

networkStatusChangedEventHandler

Windows.Networking.Connectivity

Muestras

Muestra de información de red

Muestra del estado de red en segundo plano