Nav SDK – מצב 'דפדפן ללא GUI'

מבוא

‫Navigation SDK (Nav SDK) מספק תכונה מצוינת של הנחיות נסיעה מפורטות, שיכולה לעזור מאוד ללקוחות ולנהגים, במיוחד לנהגים חדשים או לנהגים שלא מכירים את האזור. עם זאת, יש מקרים ספציפיים שבהם חברות לא רוצות להסיח את דעתם של הנהגים מהכביש באמצעות ממשק משתמש של ניווט מפורט, אבל עדיין רוצות לעקוב אחרי מיקומי כלי הרכב ולהאזין לאירועים שקשורים למסלול שהם נוסעים בו. דוגמה אחת היא נהגי משאיות, במיוחד אם הם מובילים חומרים מסוכנים. חברות אחרות שמבצעות משלוחים בדרכים שונות – כמו הליכה למרחקים קצרים – יכול להיות שלא יצטרכו גם הן להפעיל את ההנחיות המפורטות, וכך יחסכו בחיי הסוללה של המכשיר.

היקף

במסמך הזה מוסבר איך חברות יכולות להסתיר את מפת הניווט (התצוגה) מ-Nav SDK ועדיין ליהנות מכל התכונות של Nav SDK שקשורות למעקב אחר מיקום, להרשמה לאירועים ולקריאות חוזרות (callback). אפשר להשתמש בנתונים שנאספים מ-Nav SDK במצב headless כדי לשפר את היכולת לעקוב אחרי כלי רכב ולהבין את זמני ההגעה המשוערים בצורה מדויקת יותר, וכך להשיג שקיפות ויעילות.

‫Navigation SDK היא ספרייה מקורית ל-Android ול-iOS שמוסיפים לאפליקציית הנהג. בהקשר של ניידות, היא אחראית ל:

  • קבלת מיקומים שמוצמדים לכביש מהאפליקציה שמריצה אותו. מיקומים שמוצמדים לכביש מדויקים יותר מ-FusedLocationProvider ‏ (FLP) של Android, כי הם משתמשים ברשת הכבישים של Google כדי להצמיד מיקומים לקטע הכביש הקרוב ביותר. כך הערכות זמני ההגעה ומידע אחר מ-FLP מדויקים הרבה יותר.
  • חוויית נסיעה עם הנחיות מפורטות שמאפשרת לנהגים להגיע ביעילות מנקודה א' לנקודה ב' תוך התחשבות במצב התנועה בזמן אמת ובמגבלות אחרות במסלול.
  • הפעלת אירועים על סמך התקדמות המסלול, המיקום, המהירות וכו' באמצעות פונקציות event listener וקריאות חוזרות (callback) רשומות.

גרסה בברירת מחדל

כשלקוחות מטמיעים את Nav SDK, ההנחה היא שהם צריכים את התכונה של הנחיות ניווט מפורטות. לכן במסמכי התיעוד של Nav SDK (Android ו-iOS) מוסבר איך להטמיע את Nav SDK עם הפעלה של מסלול מפורט.

ב-Android, כדי לבצע רינדור של המפה עם מסלול הניווט המפורט באפליקציה, משתמשים ב-SupportNavigationFragment או ב-NavigationView, ואילו ב-iOS משתמשים ב-GMSMapView. רכיבי ממשק המשתמש האלה מוסיפים לאפליקציה את המפה האינטראקטיבית ואת ממשק המשתמש של הניווט המפורט.

בקטע הבא אנחנו משווים בין קוד ברירת המחדל של Nav SDK עם הפעלת הנחיות מפורטות לבין קוד Nav SDK ללא ממשק משתמש, גם ל-Android וגם ל-iOS, ומדגישים את השינויים הנדרשים.

פתרון

Android

ב-Android, זהו קוד Java שמגיע כחלק מאפליקציית הדוגמה של Nav SDK.

@Override
@SuppressLint("MissingPermission")
protected void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);

   // Obtain a reference to the NavigationFragment
   setContentView(R.layout.activity_nav_fragment);
   mNavFragment = (SupportNavigationFragment) getSupportFragmentManager().findFragmentById(R.id.navigation_fragment);

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

כדי להפעיל את Nav SDK במצב headless, פשוט מסירים את שתי ההוראות האלה. אם רוצים לעבור בין מצב headless למצב לא headless (ניווט פעיל), אפשר להשתמש במשתנה כדי לקבוע אם צריך להשתמש במצב headless או לא. לדוגמה:

Boolean mHeadless = true;

אחר כך אפשר להשתמש בו, למשל כך:

@Override
@SuppressLint("MissingPermission")
protected void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);

   // Obtain a reference to the NavigationFragment
   if(!mHeadless) {
       setContentView(R.layout.activity_nav_fragment);
       mNavFragment =
               (SupportNavigationFragment)
                       getSupportFragmentManager().findFragmentById(R.id.navigation_fragment);
   }

אפשר לקשר את המשתנה mHeadless לרכיב בממשק המשתמש (למשל, מתג) שיפעיל או ישבית את מצב ה-headless בהתאם.

alt_text alt_text
‫Nav SDK פועל עם ניווט פעיל (headless מושבת) אותה אפליקציה, אבל עכשיו Nav SDK פועל במצב headless

כפי שאפשר לראות בדוגמה השמאלית שלמעלה, הניווט ב-Nav SDK פועל ברקע, אבל הניווט המפורט מושבת.

iOS

ב-iOS, אפשר להפעיל מצב headless בקלות רבה על ידי הוספת ההגדרה הבאה במהלך האתחול של MapView: \

mapView.isHidden = true


לדוגמה:

  /// The main map view.
  private lazy var mapView: GMSMapView = {
    let mapView = GMSMapView(frame: .zero)
    mapView.isHidden = true /// Make it headless!
    mapView.isNavigationEnabled = true
    mapView.settings.compassButton = true
    mapView.delegate = self
    return mapView
  }()

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

alt_text alt_text
ניווט פעיל שפועל ב

אפליקציה לדוגמה ל-iOS

אותה אפליקציה במצב 'דפדפן ללא GUI'

למה כדאי ליישם מעקב אחר אירועים?

מצב ללא ראש הוא פשוט הסתרה של מפת הניווט מהמסך, ולכן נשמר רק זמן המסך, מה שמאפשר שימוש ארוך יותר בסוללה במכשיר. עם זאת, מכיוון ש-Nav SDK ימשיך לפעול, עדכוני המיקום וכל הקריאות החוזרות (callbacks) של האירועים יופעלו כרגיל, ולכן אין תופעות לוואי לשימוש בהגדרה הזו.

סיכום

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

מקורות מידע נוספים

אם צריך להשבית את ההתראות במהלך הניווט, בגלל הסיבות שצוינו למעלה, אפשר לעשות זאת גם כן. אפשר לעיין במאמר בנושא שינוי ההתראות של ההוראות לניווט ב-Nav SDK.