מבוא
Navigation SDK (Nav SDK) מספק תכונה מובילה של הנחיות נסיעה מפורטות, שיכולה לעזור מאוד ללקוחות ולנהגים, במיוחד לנהגים חדשים או לנהגים שלא מכירים את האזור. עם זאת, יש מקרים ספציפיים שבהם חברות לא רוצות להסיח את דעת הנהגים מהכביש באמצעות ממשק משתמש של ניווט מפורט, אבל עדיין רוצות לעקוב אחרי מיקומי כלי הרכב ולהאזין לאירועים שקשורים למסלול שבו הם נוסעים. דוגמה אחת היא נהגי משאיות, במיוחד אם הם מובילים חומרים מסוכנים. חברות אחרות שמבצעות משלוחים בדרכים שונות – כמו הליכה למרחקים קצרים – יכול להיות שלא יצטרכו גם הן להפעיל את ההנחיות המפורטות, וכך יחסכו את חיי הסוללה של המכשיר.
היקף
במאמר הזה מוסבר איך חברות יכולות להסתיר את מפת הניווט (התצוגה) מ-Nav SDK ועדיין ליהנות מכל התכונות של Nav SDK שקשורות למעקב אחר מיקום, להרשמה לאירועים ולקריאות חוזרות (callback). אפשר להשתמש בנתונים שנאספים מ-Nav SDK במצב headless כדי לשפר את היכולת לעקוב אחרי כלי רכב ולהבין את זמני ההגעה המשוערים בצורה מדויקת יותר, וכך להשיג שקיפות ויעילות.
Navigation SDK
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 עם הפעלת הנחיות מפורטות לבין קוד Headless 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 בהתאם.
|
|
| Nav SDK פועל עם ניווט פעיל (headless מושבת) | אותה אפליקציה, אבל עכשיו עם Nav SDK שפועל במצב 'דפדפן ללא GUI' |
כפי שאפשר לראות בדוגמה השמאלית שלמעלה, הניווט באמצעות 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
}()
כדי לראות איך זה ייראה – המסך ישתנה בהתאם לאופן ההטמעה של ממשק המשתמש, וצילום המסך נועד רק להמחשת ההשפעה של הסתרת תצוגת המפה:
|
|
| ניווט פעיל שפועל ב
אפליקציה לדוגמה ל-iOS |
אותה אפליקציה במצב 'דפדפן ללא GUI' |
למה כדאי ליישם מעקב אחר אירועים?
מצב ללא ראש הוא פשוט הסתרה של מפת הניווט מהמסך, ולכן נשמר רק זמן המסך, מה שמאריך את חיי הסוללה במכשיר. עם זאת, מכיוון ש-Nav SDK ימשיך לפעול, עדכוני המיקום וכל הקריאות החוזרות (callback) של האירועים יופעלו כרגיל, ולכן לא תהיה השפעה שלילית לשימוש בהגדרה הזו.
סיכום
במסמך הזה אנחנו מראים עד כמה Nav SDK גמיש, ומה אפשר להשיג במערכות הפעלה שונות בהתחשב במגבלות שלהן. האפשרות הזו גם מאפשרת ללקוחות להתאים אישית את חוויית הנהיגה כדי להימנע מהסחות דעת ולשפר את הבטיחות.
מקורות מידע נוספים
אם יש צורך להשבית את ההתראות במהלך הניווט, בגלל הסיבות שצוינו למעלה, אפשר לעשות זאת גם. אפשר לעיין במאמר שינוי ההתראות שלב אחר שלב ב-Nav SDK.