सैटलाइट नेटवर्क की सीमाओं को ध्यान में रखकर ऐप्लिकेशन डेवलप करना

आने वाले समय में, सैटलाइट नेटवर्क इतने बेहतर हो जाएंगे कि वे सामान्य नेटवर्क की तरह काम कर पाएंगे. साथ ही, वे ऐप्लिकेशन के सभी इस्तेमाल के मामलों के साथ आसानी से काम कर पाएंगे. हालांकि, फ़िलहाल इन नेटवर्क पर डेटा एक सीमित संसाधन है. सैटलाइट पर आधारित ऐसे नेटवर्क को डेटा के इस्तेमाल पर पाबंदी वाला सैटलाइट नेटवर्क कहा जाता है जिसमें डेटा के इस्तेमाल पर पाबंदियां होती हैं.

इन सीमाओं की वजह से, Android ऐप्लिकेशन डिफ़ॉल्ट रूप से इन नेटवर्क का इस्तेमाल नहीं करते. अगर आपको अपने ऐप्लिकेशन को सीमित बैंडविड्थ वाले सैटलाइट नेटवर्क पर चलाना है, तो आपको अपने ऐप्लिकेशन को सैटलाइट डेटा के इस्तेमाल के लिए ऑप्टिमाइज़ किया गया है के तौर पर पहचानना होगा. साथ ही, अपने ऐप्लिकेशन के इस्तेमाल के उदाहरणों को इस तरह से अडैप्ट करना होगा, ताकि सीमित बैंडविड्थ वाले सैटलाइट नेटवर्क से कनेक्ट होने पर संसाधनों को बचाया जा सके.

अपने ऐप्लिकेशन के इस्तेमाल के उदाहरणों को अडैप्ट करना

अपने ऐप्लिकेशन को सीमित बैंडविड्थ वाले सैटलाइट नेटवर्क को ऐक्सेस करने की अनुमति देने के लिए, आपको सिर्फ़ ऑप्ट-इन करना होगा. हालांकि, सीमित नेटवर्क संसाधनों का ज़िम्मेदारी से इस्तेमाल करने के लिए, आपको अपने ऐप्लिकेशन के व्यवहार को ऑप्टिमाइज़ करने के लिए और बदलाव करने पड़ सकते हैं. डेटा के सीमित इस्तेमाल के लिए ऑप्टिमाइज़ करते समय, इन बातों का ध्यान रखें:

  • तय करें कि आपका ऐप्लिकेशन, सीमित बैंडविथ वाले नेटवर्क पर इस्तेमाल करने के लिए सही है या नहीं. कुछ ऐप्लिकेशन, डेटा की सीमा वाले नेटवर्क के लिए किसी भी स्थिति में सही नहीं होते. उदाहरण के लिए, वीडियो स्ट्रीमिंग ऐप्लिकेशन, सैटलाइट नेटवर्क का इस्तेमाल न करने का विकल्प चुन सकते हैं. हालांकि, वे अब भी सैटलाइट नेटवर्क की मौजूदगी का पता लगा सकते हैं. साथ ही, उपयोगकर्ता को यह सूचना दे सकते हैं कि वे मौजूदा सीमित नेटवर्क पर काम नहीं करेंगे.
  • इस्तेमाल के उन उदाहरणों की पहचान करें जिन्हें सीमित या बदला जा सकता है. आपके ऐप्लिकेशन की कुछ सुविधाएं, सीमित डेटा की स्थितियों के लिए अन्य सुविधाओं की तुलना में ज़्यादा सही हो सकती हैं. उदाहरण के लिए, टेक्स्ट मैसेज भेजने की सुविधा ठीक से काम करेगी. हालांकि, एचडी वीडियो अपलोड करने की कोशिश करने पर, उपयोगकर्ता अनुभव खराब हो सकता है. यह उस तरीके के जैसा है जिसमें रोमिंग के दौरान कई ऐप्लिकेशन का व्यवहार बदल जाता है.
  • ऐप्लिकेशन में नेटवर्क संसाधनों के इस्तेमाल के तरीके में बदलाव करें. नेटवर्क की बैंडविड्थ सीमित होने पर, ये ऐप्लिकेशन सबसे अच्छा काम करते हैं: ऐसे ऐप्लिकेशन जो नेटवर्क का इस्तेमाल एक साथ कई बार करते हैं और ज़्यादातर समय नेटवर्क का इस्तेमाल नहीं करते. नेटवर्क ट्रैफ़िक को लगातार या बहुत ज़्यादा जनरेट करने से बचें. उदाहरण के लिए, पुश-टू-टॉक ऑडियो, नेटवर्क की सीमित उपलब्धता की स्थितियों में रीयल-टाइम ऑडियो कॉल की तुलना में ज़्यादा बेहतर होता है.

अगर आपका ऐप्लिकेशन जटिल नेटवर्किंग लॉजिक या 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) {
        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)

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) {
        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) का इस्तेमाल करता है, तो यह बताया जा सकता है कि किसी मैसेज को सीमित नेटवर्क पर भी डिलीवर किया जाना चाहिए. इसके लिए, FCM सर्वर को मैसेज भेजते समय bandwidth_constrained_ok फ़्लैग शामिल करें:

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

अगर किसी मैसेज में यह फ़्लैग शामिल नहीं है, तो FCM सर्वर उसे सिर्फ़ तब डिलीवर करता है, जब डिवाइस किसी ऐसे नेटवर्क से कनेक्ट हो जिस पर कोई पाबंदी न हो.