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

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

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

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

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

  • تصمیم بگیرید که آیا برنامه شما برای استفاده در شبکه های محدود مناسب است یا خیر. برخی از برنامه ها تحت هیچ شرایطی برای شبکه های دارای محدودیت داده مناسب نیستند. به عنوان مثال، برنامه‌های پخش ویدیو ممکن است اصلاً از شبکه‌های ماهواره‌ای استفاده نکنند، اگرچه هنوز می‌توانند حضور یک شبکه ماهواره‌ای را شناسایی کرده و به کاربر اطلاع دهند که در شبکه محدود موجود کار نخواهند کرد.
  • موارد استفاده خاص را برای محدود کردن یا اصلاح شناسایی کنید. برخی از ویژگی‌های برنامه شما ممکن است برای شرایط داده محدود بهتر از سایرین مناسب باشند. به عنوان مثال، ارسال پیام های متنی به خوبی کار می کند، اما تلاش برای آپلود ویدیوی 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) {
        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 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 تنها زمانی آن را تحویل می‌دهد که دستگاه از طریق یک شبکه نامحدود متصل باشد.