Développer pour les réseaux satellites contraints

Les réseaux satellites seront un jour suffisamment robustes pour fonctionner comme des réseaux normaux et s'intégrer parfaitement à tous les cas d'utilisation des applications. Mais pour l'instant, les données sur ces réseaux sont une ressource rare. Un réseau satellite avec des contraintes sur l'utilisation des données est appelé réseau satellite contraint.

En raison de ces contraintes, les applications Android n'utilisent pas ces réseaux par défaut. Si vous souhaitez que votre application fonctionne sur des réseaux satellites à bande passante limitée, vous devez identifier votre application comme étant optimisée pour l'utilisation des données satellite et adapter les cas d'utilisation de votre application pour économiser les ressources lorsqu'elle est connectée à un réseau satellite à bande passante limitée.

Adapter les cas d'utilisation de votre application

Pour autoriser votre application à accéder aux réseaux satellites limités, il vous suffit d'activer cette option. Toutefois, vous devrez peut-être apporter d'autres modifications pour optimiser le comportement de votre application et utiliser les ressources réseau limitées de manière responsable. Voici quelques éléments à prendre en compte lorsque vous optimisez l'utilisation limitée des données :

  • Les réseaux satellites fonctionnent dans des conditions beaucoup plus contraignantes que les réseaux terrestres LTE/5G, caractérisées par un débit plus faible et une latence plus élevée. Bien que nous recommandions généralement de minimiser l'utilisation des données pour des raisons de fiabilité, chaque application est unique. Vous devez évaluer vos cas d'utilisation spécifiques pour déterminer si vos stratégies d'optimisation des données actuelles offrent une expérience utilisateur acceptable dans ces environnements contraints.
  • Déterminez si votre application est adaptée aux réseaux à bande passante limitée. Certaines applications ne sont pas adaptées aux réseaux à bande passante limitée, quelles que soient les circonstances. Par exemple, les applications à bande passante élevée, telles que le streaming vidéo, doivent évaluer leurs mécanismes de compression des données et de diffusion de contenu pour garantir une expérience utilisateur fonctionnelle. Si une expérience dégradée est inévitable en raison de contraintes de données, l'application doit effectuer les actions suivantes :
    1. Les applications peuvent choisir de ne pas utiliser du tout les réseaux satellites, mais elles peuvent quand même identifier la présence d'un réseau satellite et informer l'utilisateur qu'elles ne fonctionneront pas sur le réseau limité existant.
    2. Identifiez les cas d'utilisation spécifiques à limiter ou à modifier. Certaines fonctionnalités de votre application peuvent être mieux adaptées aux conditions de données limitées que d'autres. Par exemple, les opérations à faible bande passante, comme l'envoi de messages, sont très fiables. Toutefois, les opérations à bande passante élevée, comme l'importation de vidéos HD non compressées, peuvent entraîner une mise en mémoire tampon ou un échec importants. Nous vous recommandons d'implémenter le streaming à débit adaptatif ou une compression robuste pour ces fonctionnalités exigeantes. Cela ressemble à la façon dont de nombreuses applications modifient leur comportement en itinérance.
    3. Adaptez la façon dont votre application utilise les ressources réseau. Les réseaux contraints fonctionnent mieux lorsque les applications effectuent des opérations réseau par rafales et passent la plupart du temps sans utiliser le réseau. Une latence variable peut rendre la communication synchrone en temps réel difficile.

Vous devez également apporter des modifications spécifiques si votre application utilise une logique réseau complexe ou Firebase Cloud Messaging.

S'identifier comme optimisé pour les réseaux contraints

Pour identifier votre application comme étant optimisée pour les réseaux à bande passante limitée et choisir de les utiliser, mettez à jour votre fichier manifeste de l'application avec un élément <meta-data> comme suit :

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

Cet élément permet à votre application d'utiliser un réseau satellite limité lorsqu'il s'agit du seul réseau disponible. Il indique également au système que votre application est optimisée pour les réseaux à bande passante limitée, ce qui facilite la découverte par les utilisateurs en l'incluant dans la liste des applications compatibles avec le satellite dans l'application Paramètres.

Modifier le comportement dans des conditions de données limitées

Si vous devez modifier le comportement de votre application lorsque vous utilisez un réseau limité, ou si votre application dispose d'une logique préexistante qui utilise ConnectivityManager pour gérer l'utilisation du réseau, vous devrez apporter quelques modifications à votre flux réseau.

Détecter les conditions de données contraintes

L'objet NetworkCapabilities utilisé pour les requêtes réseau inclut un bit NET_CAPABILITY_NOT_BANDWIDTH_CONSTRAINED qui est défini par défaut sur tous les réseaux et supprimé sur les réseaux dont la bande passante est limitée. Vous pouvez déterminer si un réseau est limité en bande passante en vérifiant s'il dispose de la fonctionnalité NET_CAPABILITY_NOT_BANDWIDTH_CONSTRAINED.

Travailler avec des réseaux contraints

Les objets NetworkRequest incluent également la fonctionnalité NET_CAPABILITY_NOT_BANDWIDTH_CONSTRAINED par défaut. Supprimez cette fonctionnalité pour indiquer que les réseaux contraints sont acceptables.

Lorsque vous détectez que vous êtes connecté à un réseau limité, vous pouvez adapter les fonctionnalités de votre application si nécessaire :

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);

Recevoir des messages FCM sur des réseaux contraints

Si votre application utilise Firebase Cloud Messaging (FCM) pour recevoir des messages d'un serveur d'applications, vous pouvez indiquer qu'un message spécifique doit être distribué même sur des réseaux limités en incluant l'indicateur bandwidth_constrained_ok lorsque vous transmettez le message au serveur FCM :

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

Si un message n'inclut pas cet indicateur, le serveur FCM ne le distribue que lorsque l'appareil est connecté via un réseau sans contrainte.