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