توسعه برای شبکه‌های ماهواره‌ای محدودشده

شبکه‌های ماهواره‌ای روزی آن‌قدر قوی خواهند شد که به‌عنوان شبکه‌های عادی عمل کنند و به‌طور یکپارچه با همه موارد استفاده از برنامه کار کنند؛ اما درحال‌حاضر، داده‌ها در این شبکه‌ها منبع کمیابی هستند. شبکه ماهواره‌ای که محدودیت‌هایی در استفاده از داده دارد شبکه ماهواره‌ای محدود نامیده می‌شود.

به‌دلیل این محدودیت‌ها، برنامه‌های Android به‌طور پیش‌فرض از این شبکه‌ها استفاده نمی‌کنند. اگر می‌خواهید برنامه‌تان در شبکه‌های ماهواره‌ای محدودشده کار کند، باید برنامه‌تان را به‌عنوان بهینه‌شده برای استفاده از داده‌های ماهواره‌ای شناسایی کنید و موارد استفاده برنامه‌تان را تطبیق دهید تا هنگام اتصال به شبکه ماهواره‌ای محدودشده، منابع را حفظ کنید.

تطبیق دادن موارد استفاده برنامه

برای اینکه به برنامه‌تان اجازه دهید به شبکه‌های ماهواره‌ای محدود دسترسی داشته باشد، فقط کافی است موافقت کنید، اما شاید لازم باشد تغییرات بیشتری برای بهینه‌سازی رفتار برنامه‌تان ایجاد کنید تا از منابع محدود شبکه به‌طور مسئولانه استفاده کند. در اینجا چند نکته برای درنظر گرفتن هنگام بهینه‌سازی برای مصرف داده محدود ارائه شده است:

  • شبکه‌های ماهواره‌ای تحت شرایط بسیار محدودتری نسبت به شبکه‌های LTE/5G زمینی کار می‌کنند که با توان عملیاتی کمتر و تأخیر بیشتر مشخص می‌شود. درحالی‌که به‌طور کلی توصیه می‌کنیم استفاده از داده را به‌دلایل قابلیت اطمینان به حداقل برسانید، هر برنامه منحصربه‌فرد است. باید موارد استفاده خاص خود را ارزیابی کنید تا مشخص شود آیا استراتژی‌های فعلی بهینه‌سازی داده‌های شما تجربه کاربری قابل‌قبولی را در این محیط‌های محدود ارائه می‌دهند یا نه.
  • تصمیم بگیرید که آیا برنامه‌تان برای استفاده در شبکه‌های محدود مناسب است یا نه. برخی‌از برنامه‌ها تحت هیچ شرایطی برای شبکه‌های دارای محدودیت داده مناسب نیستند. برای مثال، برنامه‌های با پهنای باند بالا، مانند جاری‌سازی ویدیو، باید سازوکارهای فشرده‌سازی داده و توزیع محتوای خود را ارزیابی کنند تا از تجربه کاربری کاربردی اطمینان حاصل کنند. اگر به‌دلیل محدودیت‌های داده، تجربه تنزل‌یافته اجتناب‌ناپذیر باشد، برنامه باید اقدامات زیر را انجام دهد:
    1. برنامه‌ها ممکن است تصمیم بگیرند که اصلاً از شبکه‌های ماهواره‌ای استفاده نکنند، هرچند همچنان می‌توانند وجود شبکه ماهواره‌ای را شناسایی کنند و به کاربر اطلاع دهند که در شبکه محدود موجود کار نخواهند کرد.
    2. موارد استفاده خاص را برای محدود کردن یا اصلاح کردن شناسایی کنید. برخی‌از ویژگی‌های برنامه‌تان ممکن است برای شرایط داده محدود مناسب‌تر از بقیه باشند. برای مثال، عملیات با پهنای باند کم مثل ارسال پیامک بسیار قابل‌اعتماد است. بااین‌حال، عملیات با پهنای باند بالا، مانند بارگذاری ویدیو HD فشرده‌نشده، ممکن است با بافرینگ قابل‌توجه یا شکست مواجه شود. توصیه می‌کنیم برای این ویژگی‌های پرتقاضا، جاری‌سازی نرخ بیت تطبیقی یا فشرده‌سازی قوی را پیاده‌سازی کنید. این شبیه به روشی است که بسیاری از برنامه‌ها رفتار خود را هنگام رومینگ تغییر می‌دهند.
    3. نحوه استفاده برنامه‌تان از منابع شبکه را تطبیق دهید. شبکه‌های محدودشده زمانی بهترین عملکرد را دارند که برنامه‌ها عملیات شبکه را به‌صورت انفجاری انجام دهند و بیشتر زمان را بدون استفاده از شبکه سپری کنند. تأخیر متغیر می‌تواند ارتباط هم‌زمان بی‌درنگ را دشوار کند.

همچنین اگر برنامه‌تان از منطق شبکه‌سازی پیچیده یا پیام‌رسانی ابری 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 نیز می‌شوند. این قابلیت را بردارید تا نشان دهید شبکه‌های محدودشده قابل‌قبول هستند.

وقتی متوجه شدید که به شبکه محدود متصل شده‌اید، می‌توانید ویژگی‌های برنامه‌تان را درصورت لزوم تطبیق دهید:

کاتلین

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‏ (FCM) برای دریافت پیام‌ها از سرور برنامه استفاده می‌کند، می‌توانید با گنجاندن پرچم bandwidth_constrained_ok هنگام ارسال پیام به سرور FCM، مشخص کنید که پیام خاصی باید حتی در شبکه‌های محدودشده ارسال شود:

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

اگر پیامی این پرچم را نداشته باشد، سرور FCM فقط زمانی آن را تحویل می‌دهد که دستگاه ازطریق شبکه نامحدود متصل باشد.