Headless Navigation SDK

מבוא

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

היקף

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

‫Navigation SDK היא ספריית Native ל-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 off) אותה אפליקציה, אבל עכשיו 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
  }()

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

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

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

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

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

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

סיכום

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

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

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