פיתוח לרשתות לווייניות מוגבלות

יום יבוא ורשתות לווייניות יהיו חזקות מספיק כדי לתפקד כרשתות רגילות ולעבוד בצורה חלקה עם כל תרחישי השימוש באפליקציות. אבל בינתיים, הנתונים ברשתות האלה הם משאב נדיר. רשת שמבוססת על לוויין עם מגבלות על השימוש בנתונים נקראת רשת לוויינית מוגבלת.

בגלל המגבלות האלה, אפליקציות ל-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 כברירת מחדל. מסירים את היכולת הזו כדי לציין שרשתות מוגבלות הן קבילות.

כשמזהים חיבור לרשת מוגבלת, אפשר להתאים את התכונות של האפליקציה לפי הצורך:

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) כדי לקבל הודעות משרת אפליקציות, אתם יכולים לציין שהודעה מסוימת צריכה להימסר גם ברשתות מוגבלות. לשם כך, צריך לכלול את הדגל bandwidth_constrained_ok כשמעבירים את ההודעה לשרת FCM:

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

אם הודעה לא כוללת את הדגל הזה, שרת ה-FCM מעביר אותה רק כשהמכשיר מחובר לרשת לא מוגבלת.