Когда-нибудь спутниковые сети станут достаточно надежными, чтобы работать как обычные сети и без проблем поддерживать все сценарии использования приложений. Но пока трафик в таких сетях – дефицитный ресурс. Спутниковая сеть с ограничениями на использование данных называется спутниковой сетью с ограничениями.
Из-за этих ограничений приложения 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. Удалите эту функцию, чтобы указать, что сети с ограничениями допустимы.
Если вы обнаружите, что подключились к сети с ограниченным доступом, вы можете адаптировать функции своего приложения по мере необходимости:
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);
Как получать сообщения 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 доставляет его, только когда устройство подключено к сети без ограничений.