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 obecnie dane w tych sieciach są rzadkim zasobem. Sieć satelitarna z ograniczeniami dotyczącymi wykorzystania danych jest nazywana siecią satelitarną z ograniczeniami.

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:

  • Sprawdź, czy aplikacja nadaje się do używania w sieciach o ograniczonej przepustowości. Niektóre aplikacje w żadnych okolicznościach nie nadają się do sieci o ograniczonej przepustowości. Na przykład aplikacje do strumieniowego przesyłania wideo mogą w ogóle nie korzystać z sieci satelitarnych, ale nadal mogą wykrywać ich obecność i informować użytkownika, że nie będą działać w istniejącej ograniczonej sieci.
  • 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 wysyłanie wiadomości tekstowych będzie działać dobrze, ale próba przesłania filmu w jakości HD prawdopodobnie spowoduje pogorszenie wygody użytkownika. Działa to podobnie do sposobu, w jaki wiele aplikacji zmienia swoje działanie w roamingu.
  • 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. Unikaj generowania stałego lub nadmiernego ruchu w sieci. Na przykład dźwięk push-to-talk jest znacznie lepiej dostosowany do warunków ograniczonej sieci niż rozmowy audio w czasie rzeczywistym.

Jeśli Twoja aplikacja korzysta ze 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 ograniczonej sieci satelitarnej, gdy jest ona jedyną dostępną siecią. 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 zachowania w warunkach 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) {
        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);

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