Sviluppare per reti satellitari con limitazioni

Le reti satellitari un giorno saranno abbastanza solide da funzionare come reti normali e funzionare perfettamente con tutti i casi d'uso delle app, ma per ora i dati su queste reti sono una risorsa scarsa. Una rete basata su satellite con limitazioni all'utilizzo dei dati è chiamata rete satellitare con limitazioni.

A causa di questi vincoli, le app per Android non utilizzano queste reti per impostazione predefinita. Se vuoi che la tua app funzioni su reti satellitari con limitazioni, devi identificare la tua app come ottimizzata per l'utilizzo dei dati satellitari e adattare i casi d'uso della tua app per risparmiare risorse quando è connessa a una rete satellitare con limitazioni.

Adattare i casi d'uso della tua app

Per consentire alla tua app di accedere a reti satellitari con limitazioni, devi solo attivare l'opzione, ma potresti dover apportare ulteriori modifiche per ottimizzare il comportamento della tua app in modo da utilizzare le risorse di rete limitate in modo responsabile. Ecco alcuni aspetti da considerare quando esegui l'ottimizzazione per l'utilizzo limitato dei dati:

  • Le reti satellitari operano in condizioni molto più limitate rispetto alle reti LTE/5G terrestri, caratterizzate da un throughput inferiore e una latenza maggiore. Anche se in genere consigliamo di ridurre al minimo l'utilizzo dei dati per motivi di affidabilità, ogni app è unica. Devi valutare i tuoi casi d'uso specifici per determinare se le tue attuali strategie di ottimizzazione dei dati offrono un'esperienza utente accettabile in questi ambienti con limitazioni.
  • Decidi se la tua app è adatta all'utilizzo su reti con limitazioni. Alcune app non sono adatte a reti con limiti di dati in nessuna circostanza. Ad esempio, le app a larghezza di banda elevata, come lo streaming video, devono valutare i propri meccanismi di compressione dei dati e distribuzione dei contenuti per garantire un'esperienza utente funzionale. Se un'esperienza degradata è inevitabile a causa di limitazioni dei dati, l'app deve intraprendere le seguenti azioni:
    1. Le app potrebbero scegliere di non utilizzare affatto le reti satellitari, anche se potrebbero comunque identificare la presenza di una rete satellitare e informare l'utente che non funzioneranno sulla rete limitata esistente.
    2. Identifica casi d'uso specifici da limitare o modificare. Alcune funzionalità della tua app potrebbero essere più adatte di altre a condizioni di dati limitati. Ad esempio, le operazioni a bassa larghezza di banda come l'invio di messaggi di testo sono molto affidabili. Tuttavia, le operazioni a larghezza di banda elevata, come il caricamento di video HD non compressi, potrebbero subire buffering o errori significativi. Per queste funzionalità che richiedono molte risorse, ti consigliamo di implementare lo streaming a velocità in bit adattiva o una compressione efficace. Questo è simile al modo in cui molte app cambiano comportamento in roaming.
    3. Adattare il modo in cui l'app utilizza le risorse di rete. Le reti con limitazioni funzionano meglio quando le app eseguono operazioni di rete a raffica e non utilizzano la rete per la maggior parte del tempo. La latenza variabile può rendere difficile la comunicazione sincrona in tempo reale.

Devi anche apportare modifiche specifiche se la tua app utilizza una logica di rete complessa o Firebase Cloud Messaging.

Identificarsi come ottimizzato per le reti con limitazioni

Per identificare la tua app come ottimizzata per le reti con limitazioni e attivare il loro utilizzo, aggiorna il file manifest dell'app con un elemento <meta-data> come segue:

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

Questo elemento consente all'app di utilizzare una rete satellitare vincolata quando è l'unica rete disponibile. Inoltre, comunica al sistema che la tua app è ottimizzata per le reti con limitazioni, facilitando la scoperta da parte degli utenti elencandola tra le app abilitate per il satellite nell'app Impostazioni.

Modificare il comportamento in condizioni di dati vincolati

Se devi modificare il comportamento della tua app quando utilizzi una rete con limitazioni o se la tua app ha una logica preesistente che utilizza ConnectivityManager per gestire l'utilizzo della rete, dovrai apportare alcune modifiche al flusso di rete.

Rilevare le condizioni dei dati vincolati

L'oggetto NetworkCapabilities utilizzato per le richieste di rete include un bit NET_CAPABILITY_NOT_BANDWIDTH_CONSTRAINED impostato per impostazione predefinita su tutte le reti e rimosso su quelle con limitazioni di larghezza di banda. Puoi determinare se una rete è con larghezza di banda limitata controllando se dispone o meno della funzionalità NET_CAPABILITY_NOT_BANDWIDTH_CONSTRAINED.

Lavorare con reti vincolate

Gli oggetti NetworkRequest includono anche la funzionalità NET_CAPABILITY_NOT_BANDWIDTH_CONSTRAINED per impostazione predefinita. Rimuovi questa funzionalità per indicare che le reti con limitazioni sono accettabili.

Quando rilevi di esserti connesso a una rete con limitazioni, puoi adattare le funzionalità della tua app in base alle necessità:

Kotlin

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 = NetworkCallback() {
    override fun onCapabilitiesChanged(net: Network, nc: NetWorkCapabilities) {
        updateAppUseCases(net, nc)
    }

    fun updateAppUseCases(net: Network, nc: NetworkCapabilities) {
        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 unconstrained behavior.
            ...
        }
    }
}
// Where cm is your ConnectivityManager object:
cm.registerBestMatchingNetworkCallback(request, callback, handler)

Java

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

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

// Register for the callback.
NetworkCallback callback = new NetworkCallback() {
    @Override
    public void onCapabilitiesChanged(Network net, NetworkCapabilities nc) {
        updateAppUsecases(net, nc);
    }
    private void updateAppUsecases(Network net, NetworkCapabilities nc) {
        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 unconstrained behavior.
            ...
        }
    }
};
// Where cm is your ConnectivityManager object:
cm.registerBestMatchingNetworkCallback(request, callback, handler);

Ricevere messaggi FCM su reti con limitazioni

Se la tua app utilizza Firebase Cloud Messaging (FCM) per ricevere messaggi da un server app, puoi indicare che un messaggio specifico deve essere recapitato anche su reti con limitazioni includendo il flag bandwidth_constrained_ok quando passi il messaggio al server FCM:

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

Se un messaggio non include questo flag, il server FCM lo invia solo quando il dispositivo è connesso tramite una rete senza limitazioni.