언젠가 위성 네트워크가 일반 네트워크로 작동하고 모든 앱 사용 사례와 원활하게 작동할 만큼 강력해질 것입니다. 하지만 현재 이러한 네트워크의 데이터는 부족한 리소스입니다. 데이터 사용에 제약이 있는 위성 기반 네트워크를 제약이 있는 위성 네트워크라고 합니다.
이러한 제약으로 인해 Android 앱은 기본적으로 이러한 네트워크를 사용하지 않습니다. 앱이 제한된 위성 네트워크에서 작동하도록 하려면 앱이 위성 데이터 사용에 최적화되어 있음을 식별하고 제한된 위성 네트워크에 연결되었을 때 리소스를 절약하도록 앱의 사용 사례를 조정해야 합니다.
앱의 사용 사례 조정
앱이 제한된 위성 네트워크에 액세스하도록 허용하려면 선택하면 되지만, 제한된 네트워크 리소스를 책임감 있게 사용하도록 앱의 동작을 최적화하려면 추가 변경이 필요할 수 있습니다. 제한된 데이터 사용량에 맞게 최적화할 때 고려해야 할 사항은 다음과 같습니다.
- 앱이 제한된 네트워크에서 사용하기에 적합한지 결정합니다. 일부 앱은 어떤 상황에서도 데이터 제한 네트워크에 적합하지 않습니다. 예를 들어 동영상 스트리밍 앱은 위성 네트워크를 전혀 사용하지 않을 수 있지만, 위성 네트워크의 존재를 식별하고 기존의 제한된 네트워크에서는 작동하지 않는다고 사용자에게 알릴 수는 있습니다.
- 제한하거나 수정할 특정 사용 사례를 식별합니다. 앱의 일부 기능은 다른 기능보다 제한된 데이터 조건에 더 적합할 수 있습니다. 예를 들어 문자 메시지를 보내는 것은 잘 작동하지만 HD 동영상을 업로드하려고 하면 사용자 환경이 좋지 않을 수 있습니다. 이는 많은 앱이 로밍 시 동작을 변경하는 방식과 유사합니다.
- 앱의 네트워크 리소스 사용 방식 조정 제약이 있는 네트워크는 앱이 버스트로 네트워크 작업을 실행하고 대부분의 시간을 네트워크를 사용하지 않는 데 소비할 때 가장 효과적입니다. 지속적이거나 채팅형 네트워크 트래픽을 만들지 마세요. 예를 들어 푸시 투 토크 오디오는 실시간 음성 통화보다 제한된 네트워크 조건에 훨씬 더 적합합니다.
앱에서 복잡한 네트워킹 로직 또는 Firebase 클라우드 메시징을 사용하는 경우 적용해야 하는 특정 변경사항도 있습니다.
제약이 있는 네트워크에 최적화된 것으로 자체 식별
제한된 네트워크에 최적화된 앱으로 식별하고 이를 사용하도록 선택하려면 다음과 같이 <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) { 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 클라우드 메시징 (FCM)을 사용하여 앱 서버에서 메시지를 수신하는 경우 FCM 서버에 메시지를 전달할 때 bandwidth_constrained_ok
플래그를 포함하여 제한된 네트워크에서도 특정 메시지를 전달해야 함을 나타낼 수 있습니다.
{
"message":{
"token":"bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
"notification":{
"title":"Portugal vs. Denmark",
"body":"great match!"
}
"android": {
"bandwidth_constrained_ok": true
}
}
}
메시지에 이 플래그가 포함되지 않으면 FCM 서버는 제한되지 않은 네트워크를 통해 기기가 연결된 경우에만 메시지를 전송합니다.