Когда-нибудь спутниковые сети станут достаточно надёжными, чтобы функционировать как обычные сети и бесперебойно работать со всеми сценариями использования приложений; но пока данные в этих сетях — дефицитный ресурс. Спутниковая сеть с ограничениями на использование данных называется ограниченной спутниковой сетью .
Из-за этих ограничений приложения Android не используют эти сети по умолчанию. Если вы хотите, чтобы ваше приложение работало в ограниченных спутниковых сетях, необходимо указать, что оно оптимизировано для использования спутниковых данных , и адаптировать сценарии использования приложения для экономии ресурсов при подключении к ограниченной спутниковой сети.
Адаптируйте варианты использования вашего приложения
Чтобы разрешить приложению доступ к ограниченным спутниковым сетям, вам нужно всего лишь дать согласие, но вам, возможно, потребуется внести дополнительные изменения, чтобы оптимизировать работу приложения и ответственно использовать ограниченные сетевые ресурсы. Вот несколько моментов, которые следует учитывать при оптимизации использования данных в условиях ограниченного трафика:
- Спутниковые сети работают в значительно более жестких условиях, чем наземные сети LTE/5G , характеризуясь более низкой пропускной способностью и более высокой задержкой. Хотя мы обычно рекомендуем минимизировать использование данных для обеспечения надежности, каждое приложение уникально. Вам следует оценить ваши конкретные сценарии использования, чтобы определить, обеспечивают ли ваши текущие стратегии оптимизации данных приемлемый пользовательский опыт в этих жестких условиях.
- Определите, подходит ли ваше приложение для использования в сетях с ограниченной пропускной способностью. Некоторые приложения ни при каких обстоятельствах не подходят для сетей с ограниченной пропускной способностью. Например, приложения с высокой пропускной способностью, такие как потоковое видео, должны оценить механизмы сжатия данных и доставки контента, чтобы обеспечить функциональный пользовательский интерфейс. Если ухудшение качества работы неизбежно из-за ограничений пропускной способности, приложение должно выполнить следующие действия:
- Приложения могут вообще не использовать спутниковые сети , хотя они по-прежнему могут определять наличие спутниковой сети и сообщать пользователю, что они не будут работать в существующей ограниченной сети.
- Определите конкретные сценарии использования, которые следует ограничить или изменить. Некоторые функции вашего приложения могут лучше подходить для условий ограниченного объёма данных, чем другие. Например, операции с низкой пропускной способностью, такие как отправка текстовых сообщений, отличаются высокой надёжностью. Однако операции с высокой пропускной способностью, такие как загрузка несжатого HD-видео, могут столкнуться со значительной буферизацией или сбоями. Мы рекомендуем реализовать потоковую передачу с адаптивным битрейтом или надёжное сжатие для этих требовательных функций. Это похоже на то, как многие приложения меняют своё поведение при роуминге.
- Адаптируйте способ использования сетевых ресурсов вашим приложением. Сети с ограниченными ресурсами работают лучше всего, когда приложения выполняют сетевые операции импульсами и большую часть времени не используют сеть. Переменная задержка может затруднить синхронную коммуникацию в реальном времени.
Также необходимо внести определенные изменения, если ваше приложение использует сложную сетевую логику или 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) { // 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)
Ява
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);
Получать сообщения 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 доставляет его только в том случае, если устройство подключено через неограниченную сеть.