Desenvolver para redes de satélite restritas

As redes de satélite um dia serão robustas o suficiente para funcionar como redes normais e funcionar perfeitamente com todos os casos de uso de apps. No entanto, por enquanto, os dados nessas redes são um recurso escasso. Uma rede baseada em satélite com restrições no uso de dados é chamada de rede de satélite restrita.

Devido a essas restrições, os apps Android não usam essas redes por padrão. Se você quiser que seu app funcione em redes de satélite limitadas, é necessário identificar seu app como otimizado para uso de dados de satélite e adaptar os casos de uso do app para conservar recursos quando conectado a uma rede de satélite limitada.

Adaptar os casos de uso do app

Para permitir que o app acesse redes de satélite restritas, basta ativar o recurso, mas talvez seja necessário fazer outras mudanças para otimizar o comportamento do app e usar os recursos de rede limitados de forma responsável. Confira alguns pontos a serem considerados ao otimizar para uso de dados restrito:

  • As redes de satélite operam em condições significativamente mais restritas do que as redes LTE/5G terrestres, caracterizadas por menor capacidade de processamento e maior latência. Embora geralmente recomendemos minimizar o uso de dados por motivos de confiabilidade, cada app é único. Avalie seus casos de uso específicos para determinar se as estratégias atuais de otimização de dados oferecem uma experiência aceitável para o usuário nesses ambientes restritos.
  • Decida se o app é adequado para uso em redes restritas. Alguns apps não são adequados para redes com restrição de dados em nenhuma circunstância. Por exemplo, apps de alta largura de banda, como streaming de vídeo, precisam avaliar os mecanismos de compactação de dados e entrega de conteúdo para garantir uma experiência do usuário funcional. Se uma experiência degradada for inevitável devido a restrições de dados, o app precisará realizar as seguintes ações:
    1. Os apps podem optar por não usar redes de satélite, mas ainda podem identificar a presença de uma rede de satélite e informar ao usuário que não vão funcionar na rede limitada atual.
    2. Identifique casos de uso específicos para limitar ou modificar. Alguns recursos do app podem ser mais adequados para condições de dados limitados do que outros. Por exemplo, operações de baixa largura de banda, como o envio de mensagens de texto, são altamente confiáveis. No entanto, operações de alta largura de banda, como o upload de vídeos em HD não compactados, podem apresentar buffering ou falhas significativas. Recomendamos implementar streaming de taxa de bits adaptável ou compactação robusta para esses recursos exigentes. Isso é semelhante à maneira como muitos apps mudam de comportamento durante o roaming.
    3. Adapte a forma como o app usa os recursos de rede. As redes restritas funcionam melhor quando os apps realizam operações de rede em picos e passam a maior parte do tempo sem usar a rede. A latência variável pode dificultar a comunicação síncrona em tempo real.

Também há mudanças específicas que você precisa fazer se o app usa lógica de rede complexa ou o Firebase Cloud Messaging.

Identificar-se como otimizado para redes restritas

Para identificar seu app como otimizado para redes restritas e ativar o uso delas, atualize o arquivo de manifesto do app com um elemento <meta-data> da seguinte maneira:

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

Esse elemento permite que o app use uma rede de satélite restrita quando ela for a única disponível. Ele também notifica o sistema de que seu app está otimizado para redes restritas, ajudando na descoberta do usuário ao listá-lo entre os apps com conexão via satélite no app de configurações.

Mudar o comportamento em condições de dados limitados

Se você precisar mudar o comportamento do app ao usar uma rede restrita ou se o app tiver uma lógica preexistente que use ConnectivityManager para gerenciar o uso da rede, será necessário fazer algumas mudanças no fluxo de rede.

Detectar condições de dados restritos

O objeto NetworkCapabilities usado para solicitações de rede inclui um bit NET_CAPABILITY_NOT_BANDWIDTH_CONSTRAINED que é definido por padrão em todas as redes e removido em redes com restrição de largura de banda. Para determinar se uma rede tem restrição de largura de banda, verifique se ela tem o recurso NET_CAPABILITY_NOT_BANDWIDTH_CONSTRAINED.

Trabalhar com redes restritas

Os objetos NetworkRequest também incluem o recurso NET_CAPABILITY_NOT_BANDWIDTH_CONSTRAINED por padrão. Remova esse recurso para indicar que redes restritas são aceitáveis.

Ao detectar que você se conectou a uma rede restrita, é possível adaptar os recursos do app conforme necessário:

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)

Receber mensagens do FCM em redes restritas

Se o app usa o Firebase Cloud Messaging (FCM) para receber mensagens de um servidor de apps, é possível indicar que uma mensagem específica precisa ser entregue mesmo em redes restritas, incluindo a flag bandwidth_constrained_ok ao transmitir a mensagem para o servidor do FCM:

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

Se uma mensagem não incluir essa flag, o servidor do FCM só vai entregá-la quando o dispositivo estiver conectado por uma rede sem restrições.