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 limités, 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 limité.

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 :

  • 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 de streaming vidéo 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.
  • 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, l'envoi de messages texte fonctionne bien, mais la tentative d'importer une vidéo HD entraînerait probablement une mauvaise expérience utilisateur. Cela ressemble à la façon dont de nombreuses applications modifient leur comportement en itinérance.
  • 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. Évitez de générer un trafic réseau constant ou bavard. Par exemple, l'audio push-to-talk est beaucoup mieux adapté aux conditions de réseau limitées que les appels audio en temps réel.

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 contraintes.