Desarrolla para redes satelitales restringidas

Algún día, las redes satelitales serán lo suficientemente sólidas como para funcionar como redes normales y funcionar sin problemas con todos los casos de uso de las apps, pero, por ahora, los datos en estas redes son un recurso escaso. Una red satelital con restricciones en el uso de datos se denomina red satelital restringida.

Debido a estas restricciones, las apps para Android no usan estas redes de forma predeterminada. Si quieres que tu app funcione en redes satelitales restringidas, debes identificarla como optimizada para el uso de datos satelitales y adaptar sus casos de uso para conservar recursos cuando se conecte a una red satelital restringida.

Adapta los casos de uso de tu app

Para permitir que tu app acceda a redes satelitales restringidas, solo debes habilitar la opción, pero es posible que debas realizar más cambios para optimizar el comportamiento de tu app y usar los recursos de red limitados de manera responsable. A continuación, se incluyen algunos aspectos que debes tener en cuenta cuando optimizas el uso de datos restringidos:

  • Las redes satelitales operan en condiciones mucho más limitadas que las redes LTE/5G terrestres, que se caracterizan por una menor capacidad de procesamiento y una mayor latencia. Si bien, por lo general, recomendamos minimizar el uso de datos por motivos de confiabilidad, cada app es única. Debes evaluar tus casos de uso específicos para determinar si tus estrategias actuales de optimización de datos proporcionan una experiencia del usuario aceptable en estos entornos restringidos.
  • Decide si tu app es adecuada para usarla en redes restringidas. Algunas apps no son adecuadas para redes con restricciones de datos en ninguna circunstancia. Por ejemplo, las apps con un ancho de banda alto, como las de transmisión de video, deben evaluar sus mecanismos de compresión de datos y publicación de contenido para garantizar una experiencia del usuario funcional. Si una experiencia degradada es inevitable debido a restricciones de datos, la app debería realizar las siguientes acciones:
    1. Es posible que las apps decidan no usar redes satelitales, aunque podrían identificar la presencia de una red satelital y, luego, informar al usuario que no funcionarán en la red limitada existente.
    2. Identifica casos de uso específicos para limitar o modificar. Es posible que algunas de las funciones de tu app sean más adecuadas para condiciones de datos limitados que otras. Por ejemplo, las operaciones de ancho de banda bajo, como el envío de mensajes de texto, son muy confiables. Sin embargo, las operaciones de gran ancho de banda, como subir videos en HD sin comprimir, pueden experimentar un almacenamiento en búfer o fallas significativas. Te recomendamos implementar la transmisión de tasa de bits adaptable o la compresión sólida para estas funciones exigentes. Esto es similar a la forma en que muchas apps cambian de comportamiento cuando están en roaming.
    3. Adapta la forma en que tu app usa los recursos de red. Las redes restringidas funcionan mejor cuando las apps realizan operaciones de red en ráfagas y pasan la mayor parte del tiempo sin usar la red. La latencia variable puede dificultar la comunicación síncrona en tiempo real.

También hay cambios específicos que debes realizar si tu app usa una lógica de red compleja o Firebase Cloud Messaging.

Identificarse como optimizada para redes con limitaciones

Para identificar tu app como optimizada para redes restringidas y habilitar su uso, actualiza el archivo de manifiesto de la app con un elemento <meta-data> de la siguiente manera:

<meta-data android:name="android.telephony.PROPERTY_SATELLITE_DATA_OPTIMIZED"
          android:value="PACKAGE_NAME" />

Este elemento permite que tu app use una red satelital restringida cuando es la única red disponible. También notifica al sistema que tu app está optimizada para redes restringidas, lo que ayuda a que los usuarios la descubran, ya que se incluye entre las apps compatibles con satélites en la app de Configuración.

Cambia el comportamiento en condiciones de datos limitados

Si necesitas cambiar el comportamiento de tu app cuando usas una red restringida o si tu app tiene una lógica preexistente que usa ConnectivityManager para administrar el uso de la red, deberás realizar algunos cambios en el flujo de red.

Detecta condiciones de datos restringidos

El objeto NetworkCapabilities que se usa para las solicitudes de red incluye un bit NET_CAPABILITY_NOT_BANDWIDTH_CONSTRAINED que se establece de forma predeterminada en todas las redes y se quita en las redes con ancho de banda limitado. Para determinar si una red tiene un ancho de banda limitado, verifica si tiene o no la capacidad NET_CAPABILITY_NOT_BANDWIDTH_CONSTRAINED.

Trabaja con redes restringidas

Los objetos NetworkRequest también incluyen la capacidad NET_CAPABILITY_NOT_BANDWIDTH_CONSTRAINED de forma predeterminada. Quita esta capacidad para indicar que se aceptan las redes restringidas.

Cuando detectes que te conectaste a una red restringida, puedes adaptar las funciones de tu app según sea necesario:

val handlerThread = HandlerThread("SatelliteNetworkMonitor")
handlerThread.start()
val handler = Handler(handlerThread.getLooper())

// Make the network request.
val request = NetworkRequest.Builder()
    .addCapability(NET_CAPABILITY_INTERNET)
    .removeCapability(NET_CAPABILITY_NOT_BANDWIDTH_CONSTRAINED)
    .build()

// Register for the callback.
val callback = object : NetworkCallback() {
    override fun onCapabilitiesChanged(net: Network, nc: NetworkCapabilities) {
        updateAppUseCases(net, nc)
    }

    fun updateAppUseCases(net: Network, nc: NetworkCapabilities) {
        // Check if the network is bandwidth-constrained or if the transport is satellite.
        // Checking for the satellite transport is to make sure that application
        // continue to have optimized behavior on satellite networks irrespective of whether
        // the NET_CAPABILITY_NOT_BANDWIDTH_CONSTRAINED capability is set or not. This is
        // because the capability can be removed on an unconstraned satellite Network which only
        // means applications does not need to modify to get data access but should continue
        // to optimize for data usage.
        if (!nc.hasCapability(NET_CAPABILITY_NOT_BANDWIDTH_CONSTRAINED) ||
            nc.hasTransport(NetworkCapabilities.TRANSPORT_SATELLITE)
        ) {
            // Adapt to constrained network or disable heavy data usage features.
            // ...
        } else {
            // Revert to non optimized behavior for data usage.
            // ...
        }
    }
}
// Where cm is your ConnectivityManager object:
cm.registerBestMatchingNetworkCallback(request, callback, handler)

Recibe mensajes de FCM en redes restringidas

Si tu app usa Firebase Cloud Messaging (FCM) para recibir mensajes de un servidor de apps, puedes indicar que se debe entregar un mensaje específico incluso en redes restringidas. Para ello, incluye la marca bandwidth_constrained_ok cuando pases el mensaje al servidor de FCM:

{
  "message":{
    "token":"bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
    "notification":{
      "title":"Portugal vs. Denmark",
      "body":"great match!"
    }
    "android": {
       "bandwidth_constrained_ok": true
    }
  }
}

Si un mensaje no incluye esta marca, el servidor de FCM solo lo entrega cuando el dispositivo está conectado a través de una red sin restricciones.