Tworzenie aplikacji na potrzeby sieci satelitarnych o ograniczonej przepustowości

Sieci satelitarne będą kiedyś wystarczająco wydajne, aby działać jak zwykłe sieci i bezproblemowo obsługiwać wszystkie przypadki użycia aplikacji, ale na razie dane w tych sieciach są rzadkim zasobem. Sieć satelitarna z ograniczeniami dotyczącymi wykorzystania danych jest nazywana siecią satelitarną o ograniczonym dostępie.

Z tego powodu aplikacje na Androida domyślnie nie korzystają z tych sieci. Jeśli chcesz, aby Twoja aplikacja działała w sieciach satelitarnych o ograniczonej przepustowości, musisz oznaczyć ją jako zoptymalizowaną pod kątem wykorzystania danych satelitarnychdostosować przypadki użycia aplikacji, aby oszczędzać zasoby po połączeniu z siecią satelitarną o ograniczonej przepustowości.

Dostosowywanie przypadków użycia aplikacji

Aby zezwolić aplikacji na dostęp do sieci satelitarnych o ograniczonej przepustowości, wystarczy wyrazić zgodę. Może być jednak konieczne wprowadzenie dodatkowych zmian w celu zoptymalizowania działania aplikacji pod kątem odpowiedzialnego korzystania z ograniczonych zasobów sieci. Oto kilka kwestii, które warto wziąć pod uwagę podczas optymalizacji pod kątem ograniczonego wykorzystania danych:

  • Sieci satelitarne działają w znacznie bardziej ograniczonych warunkach niż naziemne sieci LTE/5G, charakteryzujących się niższą przepustowością i większym opóźnieniem. Zwykle zalecamy minimalizowanie wykorzystania danych ze względu na niezawodność, ale każda aplikacja jest inna. Oceń konkretne przypadki użycia, aby sprawdzić, czy obecne strategie optymalizacji danych zapewniają akceptowalne wrażenia użytkownika w tych ograniczonych środowiskach.
  • Sprawdź, czy aplikacja nadaje się do używania w sieciach o ograniczonej przepustowości. Niektóre aplikacje nie nadają się do sieci o ograniczonej ilości danych w żadnych okolicznościach. Na przykład aplikacje o dużej przepustowości, takie jak strumieniowanie wideo, powinny ocenić mechanizmy kompresji danych i dostarczania treści, aby zapewnić użytkownikom funkcjonalność. Jeśli z powodu ograniczeń danych nie można uniknąć pogorszenia jakości, aplikacja powinna wykonać te działania:
    1. Aplikacje mogą w ogóle nie korzystać z sieci satelitarnych, ale mogą wykrywać ich obecność i informować użytkownika, że nie będą działać w istniejącej ograniczonej sieci.
    2. Określ konkretne przypadki użycia, które chcesz ograniczyć lub zmodyfikować. Niektóre funkcje aplikacji mogą być lepiej dostosowane do warunków ograniczonego dostępu do danych niż inne. Na przykład operacje o niskiej przepustowości, takie jak wysyłanie wiadomości tekstowych, są bardzo niezawodne. Jednak operacje wymagające dużej przepustowości, takie jak przesyłanie nieskompresowanego wideo HD, mogą powodować znaczne buforowanie lub niepowodzenie. W przypadku tych wymagających funkcji zalecamy wdrożenie strumieniowania z adaptacyjną szybkością transmisji bitów lub solidnej kompresji. Działa to podobnie do wielu aplikacji, które zmieniają swoje działanie w roamingu.
    3. Dostosuj sposób, w jaki aplikacja korzysta z zasobów sieciowych. Sieci o ograniczonej przepustowości działają najlepiej, gdy aplikacje wykonują operacje sieciowe w seriach i przez większość czasu nie korzystają z sieci. Zmienne opóźnienie może utrudniać synchroniczną komunikację w czasie rzeczywistym.

Jeśli Twoja aplikacja korzysta z złożonej logiki sieciowej lub Komunikacji w chmurze Firebase, musisz wprowadzić określone zmiany.

Określanie się jako zoptymalizowany pod kątem sieci o ograniczonej przepustowości

Aby oznaczyć aplikację jako zoptymalizowaną pod kątem sieci o ograniczonej przepustowości i zgodzić się na korzystanie z nich, zaktualizuj plik manifestu aplikacji, dodając element <meta-data> w ten sposób:

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

Ten element umożliwia aplikacji korzystanie z sieci satelitarnej o ograniczonej przepustowości, gdy jest to jedyna dostępna sieć. Informuje też system, że aplikacja jest zoptymalizowana pod kątem sieci o ograniczonej przepustowości, co ułatwia użytkownikom jej znalezienie, ponieważ jest ona wymieniona wśród aplikacji obsługujących połączenia satelitarne w aplikacji Ustawienia.

Zmiana działania w przypadku ograniczonej ilości danych

Jeśli musisz zmienić działanie aplikacji podczas korzystania z sieci o ograniczonej przepustowości lub jeśli aplikacja ma już logikę, która używa ConnectivityManager do zarządzania wykorzystaniem sieci, musisz wprowadzić pewne zmiany w przepływie sieciowym.

Wykrywanie warunków ograniczonych danych

Obiekt NetworkCapabilities używany w przypadku żądań sieciowych zawiera bit NET_CAPABILITY_NOT_BANDWIDTH_CONSTRAINED, który jest domyślnie ustawiany we wszystkich sieciach i usuwany w sieciach o ograniczonej przepustowości. Aby sprawdzić, czy sieć ma ograniczone pasmo, sprawdź, czy ma funkcję NET_CAPABILITY_NOT_BANDWIDTH_CONSTRAINED.

Praca w sieciach o ograniczonej przepustowości

Obiekty NetworkRequest domyślnie obejmują też funkcję NET_CAPABILITY_NOT_BANDWIDTH_CONSTRAINED. Usuń tę funkcję, aby wskazać, że sieci o ograniczonej przepustowości są akceptowane.

Gdy wykryjesz, że masz połączenie z siecią o ograniczonej przepustowości, możesz dostosować funkcje aplikacji:

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) {
    // 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)

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

Otrzymywanie wiadomości FCM w sieciach o ograniczonej przepustowości

Jeśli Twoja aplikacja używa Komunikacji w chmurze Firebase (FCM) do odbierania wiadomości z serwera aplikacji, możesz wskazać, że określona wiadomość powinna być dostarczana nawet w sieciach o ograniczonej przepustowości. Aby to zrobić, podczas przekazywania wiadomości do serwera FCM dodaj flagę bandwidth_constrained_ok:

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

Jeśli wiadomość nie zawiera tego flagi, serwer FCM dostarcza ją tylko wtedy, gdy urządzenie jest połączone z siecią bez ograniczeń.