Sviluppare per reti satellitari con limitazioni

Un giorno le reti satellitari saranno abbastanza robuste 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 satellitare con vincoli sull'utilizzo dei dati è chiamata rete satellitare con vincoli.

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 identificarla come ottimizzata per l'utilizzo dei dati satellitari e adattare i suoi casi d'uso per risparmiare risorse quando è connessa a una rete satellitare con limitazioni.

Adatta i casi d'uso della tua app

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

  • Le reti satellitari operano in condizioni molto più limitate rispetto alle reti LTE/5G terrestri, caratterizzate da un throughput inferiore e una latenza più elevata. Anche se in genere consigliamo di ridurre al minimo l'utilizzo dei dati per motivi di affidabilità, ogni app è unica. Valuta 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 limitati.
  • Decidi se la tua app è adatta all'uso su reti con limitazioni. Alcune app non sono adatte per le reti con limitazioni di dati in nessuna circostanza. Ad esempio, le app con larghezza di banda elevata, come lo streaming video, devono valutare i propri meccanismi di compressione dei dati e di distribuzione dei contenuti per garantire un'esperienza utente funzionale. Se un'esperienza peggiore è inevitabile a causa di vincoli relativi ai 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 i 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 larghezza di banda ridotta, come l'invio di messaggi, sono altamente affidabili. Tuttavia, le operazioni con larghezza di banda elevata, come il caricamento di video HD non compressi, potrebbero subire un buffering significativo o non riuscire. Ti consigliamo di implementare lo streaming a velocità in bit adattiva o una compressione efficace per queste funzionalità impegnative. Questo è simile al modo in cui molte app modificano il comportamento quando sono in roaming.
    3. Adatta il modo in cui la tua app utilizza le risorse di rete. Le reti limitate funzionano meglio quando le app eseguono operazioni di rete in burst e trascorrono la maggior parte del tempo senza utilizzare la rete. La latenza variabile può rendere difficile la comunicazione sincrona in tempo reale.

Esistono anche modifiche specifiche che devi apportare se la tua app utilizza una logica di networking complessa o Firebase Cloud Messaging.

Identificarsi come ottimizzata per le reti con limitazioni

Per identificare la tua app come ottimizzata per le reti con limitazioni e attivarne l'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 alla tua app di utilizzare una rete satellitare limitata quando è l'unica rete disponibile. Inoltre, comunica al sistema che la tua app è ottimizzata per le reti con limitazioni, aiutando gli utenti a scoprirla elencandola tra le app abilitate per il satellite nell'app Impostazioni.

Modifica del comportamento in condizioni di dati limitati

Se devi modificare il comportamento della tua app quando utilizzi una rete limitata 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.

Rileva condizioni di 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 sulle reti con larghezza di banda limitata. Puoi determinare se una rete ha una larghezza di banda limitata controllando se ha o meno la funzionalità NET_CAPABILITY_NOT_BANDWIDTH_CONSTRAINED.

Lavora con reti limitate

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 aver eseguito la connessione a una rete limitata, puoi adattare le funzionalità della tua app in base alle esigenze:

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)

Ricevi messaggi FCM su reti con limitazioni

Se la tua app utilizza Firebase Cloud Messaging (FCM) per ricevere messaggi da un server dell'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 recapita solo quando il dispositivo è connesso tramite una rete senza limitazioni.