Разработка для ограниченных спутниковых сетей

Когда-нибудь спутниковые сети станут достаточно надёжными, чтобы функционировать как обычные сети и бесперебойно работать со всеми сценариями использования приложений; но пока данные в этих сетях — дефицитный ресурс. Спутниковая сеть с ограничениями на использование данных называется ограниченной спутниковой сетью .

Из-за этих ограничений приложения Android не используют эти сети по умолчанию. Если вы хотите, чтобы ваше приложение работало в ограниченных спутниковых сетях, необходимо указать, что оно оптимизировано для использования спутниковых данных , и адаптировать сценарии использования приложения для экономии ресурсов при подключении к ограниченной спутниковой сети.

Адаптируйте варианты использования вашего приложения

Чтобы разрешить приложению доступ к ограниченным спутниковым сетям, вам нужно всего лишь дать согласие, но вам, возможно, потребуется внести дополнительные изменения, чтобы оптимизировать работу приложения и ответственно использовать ограниченные сетевые ресурсы. Вот несколько моментов, которые следует учитывать при оптимизации использования данных в условиях ограниченного трафика:

  • Определите, подходит ли ваше приложение для использования в сетях с ограниченными ресурсами. Некоторые приложения не подходят для сетей с ограниченными ресурсами ни при каких обстоятельствах. Например, приложения для потоковой передачи видео могут вообще не использовать спутниковые сети, хотя они всё равно могут определять наличие спутниковой сети и сообщать пользователю, что не будут работать в существующей сети с ограниченными ресурсами.
  • Определите конкретные сценарии использования, которые следует ограничить или изменить. Некоторые функции вашего приложения могут лучше подходить для условий ограниченного трафика, чем другие. Например, отправка текстовых сообщений будет работать хорошо, но попытка загрузить HD-видео, скорее всего, приведет к неудовлетворительному пользовательскому опыту. Это похоже на то, как многие приложения меняют поведение при роуминге.
  • Адаптируйте способ использования сетевых ресурсов вашим приложением. Сети с ограниченной пропускной способностью работают лучше всего, когда приложения выполняют сетевые операции импульсами и большую часть времени не используют сеть. Избегайте создания постоянного или интенсивного сетевого трафика. Например, голосовая связь Push-to-Talk гораздо лучше подходит для условий ограниченной пропускной способности сети, чем аудиозвонки в режиме реального времени.

Также необходимо внести определенные изменения, если ваше приложение использует сложную сетевую логику или Firebase Cloud Messaging .

Самоидентифицируется как оптимизированный для ограниченных сетей

Чтобы определить, что ваше приложение оптимизировано для сетей с ограниченными возможностями, и использовать их, обновите файл манифеста приложения, добавив элемент <meta-data> следующим образом:

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

Этот элемент позволяет вашему приложению использовать ограниченную спутниковую сеть, когда это единственная доступная сеть. Он также уведомляет систему о том, что ваше приложение оптимизировано для сетей с ограниченными возможностями, что облегчает обнаружение приложения пользователями, указывая его среди приложений с поддержкой спутниковой связи в настройках приложения.

Изменение поведения в условиях ограниченных данных

Если вам необходимо изменить поведение вашего приложения при использовании ограниченной сети или если в вашем приложении имеется уже существующая логика, которая использует ConnectivityManager для управления использованием сети, вам потребуется внести некоторые изменения в сетевой поток.

Обнаружение условий ограниченности данных

Объект NetworkCapabilities , используемый для сетевых запросов, включает бит NET_CAPABILITY_NOT_BANDWIDTH_CONSTRAINED , который установлен по умолчанию во всех сетях и удален в сетях с ограниченной пропускной способностью. Вы можете определить, ограничена ли пропускная способность сети, проверив наличие у неё возможности NET_CAPABILITY_NOT_BANDWIDTH_CONSTRAINED .

Работа с ограниченными сетями

Объекты NetworkRequest также по умолчанию включают возможность NET_CAPABILITY_NOT_BANDWIDTH_CONSTRAINED . Удалите эту возможность, чтобы обозначить приемлемость сетей с ограничениями.

Если вы обнаружили, что подключились к сети с ограниченными возможностями, вы можете при необходимости адаптировать функции своего приложения:

Котлин

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)

Ява

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

Получать сообщения FCM в сетях с ограниченными возможностями

Если ваше приложение использует Firebase Cloud Messaging (FCM) для получения сообщений с сервера приложений, вы можете указать, что определенное сообщение должно быть доставлено даже в сетях с ограниченной пропускной способностью, включив флаг bandwidth_constrained_ok при передаче сообщения на сервер FCM:

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

Если сообщение не содержит этого флага, то сервер FCM доставляет его только в том случае, если устройство подключено через неограниченную сеть.