衛星ネットワークは、いつの日か通常のネットワークとして機能し、すべてのアプリのユースケースでシームレスに動作するほど堅牢になるでしょう。しかし、現時点では、これらのネットワーク上のデータは希少なリソースです。データ使用に制限がある衛星ベースのネットワークは、制限付き衛星ネットワークと呼ばれます。
これらの制約により、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 = object : 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)
制約のあるネットワークで FCM メッセージを受信する
アプリが Firebase Cloud Messaging(FCM)を使用してアプリサーバーからメッセージを受信する場合、メッセージを FCM サーバーに渡すときに bandwidth_constrained_ok フラグを含めることで、制約のあるネットワークでも特定のメッセージを配信する必要があることを示すことができます。
{
"message":{
"token":"bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
"notification":{
"title":"Portugal vs. Denmark",
"body":"great match!"
}
"android": {
"bandwidth_constrained_ok": true
}
}
}
メッセージにこのフラグが含まれていない場合、FCM サーバーは、デバイスが制約のないネットワークを介して接続されている場合にのみメッセージを配信します。