מפעילים את מפות Google או את Waze

כדי להתחיל את פעילות הניווט, האפליקציה צריכה ליצור באופן דינמי כתובת URL להפעלה כדי לפתוח את מפות Google או את Waze. במדריך הזה מוסבר איך להשתמש בטוקן מאומת של נסיעה מהשיטה Create a trip כדי להפעיל את מפות Google או את Waze ולהגדיר את חוויית החזרה לאפליקציה שלכם.

איך מפעילים את מפות Google או את Waze

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

איך מאפשרים לנהגים להתחיל ניווט מהאפליקציה שלכם

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

בניית כתובת ה-URL להפעלה

כדי להתחיל סשן ניווט, צריך ליצור כתובת URL להפעלה של Navigation Connect. כתובת ה-URL הזו היא מחרוזת שמכילה את היעד, את אסימון הנסיעה ואת פרמטרים הניווט הנדרשים. היא פועלת באופן דומה לכתובת URL רגילה של מפות Google או לקישור עמוק של Waze.

כדי להפעיל את מפות Google או את Waze במכשיר של הנהג, משתמשים במנגנון הספציפי לפלטפורמה:

  • ‫Android: מעבירים את מחרוזת כתובת ה-URL ב-Intent.
  • ‫iOS: השתמשו במחרוזת כתובת ה-URL כקישור אוניברסלי (או כקישור עומק).

עיצוב היעד

כדי שמפות Google או Waze יוכלו לחשב מסלול בצורה תקינה, צריך לפעול לפי הכללים הבאים כשמגדירים את היעד:

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

  • אל תשתמשו בכמה נקודות ציון. אם מעבירים כמה נקודות ציון ישירות בכתובת ה-URL, מוצגת שגיאה במפות Google או ב-Waze. במקום זאת, צריך ליצור נסיעות נפרדות.

הוספת טוקן נסיעה ופרמטרים של ניווט

כדי להשלים את כתובת ה-URL להפעלה, צריך לכלול בה את אסימון הנסיעה המאומת שקיבלתם מהבקשה Create a trip. צריך גם לכלול את פרמטרי הניווט שמנחים את מפות Google או את Waze להתחיל ניווט פעיל.

מפות Google

במקרה של Google Maps, צריך לכלול את הפרמטרים הבאים בכתובת ה-URL להפעלת האפליקציה:

  • ‫dir_action=navigate: הפרמטר הזה מכריח ניווט פעיל.
  • ‫action_token: הפרמטר הזה מספק את אסימון הנסיעה המאומת.

בדוגמאות הבאות מוצגות כתובות URL להפעלה של מפות Google בפורמטים שונים של יעד:

  • קואורדינטות של קו הרוחב/קו האורך:
    https://www.google.com/maps/dir/?api=1&destination=-33.8569%2C151.2152&dir_action=navigate&action_token=TRIP_TOKEN
  • מחרוזת כתובת:
    https://www.google.com/maps/dir/?api=1&destination=1600%20Amphitheatre%20Parkway...&dir_action=navigate&action_token=TRIP_TOKEN
  • מזהה מקום:
    https://www.google.com/maps/dir/?api=1&destination_place_id=PLACE_ID&dir_action=navigate&action_token=TRIP_TOKEN

Waze

ב-Waze, צריך לכלול את הפרמטרים הבאים בכתובת ה-URL להפעלת האפליקציה:

  • ‫navigate=yes: הפרמטר הזה מאלץ ניווט פעיל.
  • ‫external_trip_token: הפרמטר הזה מספק את אסימון הנסיעה המאומת.

בדוגמאות הבאות אפשר לראות איך להגדיר את כתובת ה-URL להפעלת Waze באמצעות פורמטים שונים של יעדים:

  • קואורדינטות של קו הרוחב/קו האורך:
    https://waze.com/ul?ll=-33.8569%2C151.2152&navigate=yes&external_trip_token=TRIP_TOKEN
  • מחרוזת כתובת:
    https://waze.com/ul?&q=1600%20Amphitheatre...&navigate=yes&external_trip_token=TRIP_TOKEN
  • מזהה מקום:
    https://waze.com/ul?google_place_id=PLACE_ID&navigate=yes&external_trip_token=TRIP_TOKEN

צריך לציין את מזהה האפליקציה (ב-Android בלבד)

כדי להתחיל נסיעה באמצעות Navigation Connect, צריך לשייך פעילות ניווט לאפליקציה ב-Android. לשם כך, צריך לספק את מזהה האפליקציה המאומת. כך האפליקציה מזוהה כמקור של הנסיעה, כדי שמפות Google או Waze יוכלו לקשר את הנסיעה הפעילה בחזרה לפלטפורמה שלכם. אם מזהה האפליקציה חסר או לא תקין, האימות של אסימון הנסיעה ייכשל.

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

  • אישור שיתוף הנתונים: מוודא שהאפליקציה שלכם מורשית לקבל נתונים של נסיעות פעילות.
  • הפעלת הסכמה של הנהג: במסך ההסכמה יופיעו שם העסק ומדיניות הפרטיות שלו, כדי שהנהג ידע מי מקבל את המיקום בזמן אמת ואת זמן ההגעה המשוער שלו.
  • הפעלת לחצן החזרה: מאפשרת למפות Google או ל-Waze ליצור לחצן חזרה ממותג, כדי שהנהגים יוכלו לחזור לאפליקציה שלכם.

כדי להעביר את מזהה האפליקציה אל Google Maps או אל Waze ב-Android, מוסיפים את שם החבילה אל ה-intent להפעלת האפליקציה (שכולל את מחרוזת כתובת ה-URL להפעלה) באמצעות Intent.EXTRA_REFERRER_NAME.

בדוגמה הבאה אפשר לראות איך מוסיפים את שם החבילה ל-Intent:

intent.putExtra(Intent.EXTRA_REFERRER_NAME, "android-app://${application.packageName}")

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

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

‫Navigation Connect מציג סרגל תחתון (מפות Google) או לחצן חזרה עם מיתוג (Waze) כדי שהנהג יוכל לחזור לאפליקציה שלכם בכל שלב במהלך הנסיעה או כשהוא מגיע ליעד.

Android

צריך ליצור PendingIntent שמפנה חזרה לפעילות של האפליקציה. מצרפים את PendingIntent כתוספת ל-Intent של ההפעלה באמצעות המפתח המדויק "pendingIntent". כשהמשתמש מקיש על לחצן החזרה, מפות Google או Waze מבצעות את הפעולה הזו כדי להעביר את האפליקציה לחזית.

intent.putExtra("pendingIntent", getPendingIntent())

‫iOS (Waze בלבד)

כדי להפעיל את לחצן החזרה, לא צריך להוסיף שום דבר לכתובת ה-URL להפעלת האפליקציה. אפליקציית Waze משתמשת באופן אוטומטי בקישור האוניברסלי שרשמתם כשאימתתם את האפליקציה.

דוגמאות קוד

בדוגמאות הקוד הבאות מוצג איך להפעיל את מפות Google או את Waze מהאפליקציה באמצעות Navigation Connect, ואיך להפעיל את הלחצן 'חזרה לאפליקציה'.

מפות Google (Android)

בדוגמת הקוד הבאה ב-Kotlin מוצגת פונקציה לדוגמה שמפעילה סשן של Navigation Connect עם הפרמטרים הנדרשים.

private val destinationAddress = "1600 Amphitheatre Parkway, Mountain View, CA 94043"

        private fun launchNavConnect() {
           val jwtToken = "TRIP_TOKEN"

           try {
               // URL Encode the destination
               val encodedDestination = URLEncoder.encode(destinationAddress, "UTF-8")
               val navConnectUrl = "https://www.google.com/maps/dir/?api=1" +
                       "&destination=$encodedDestination" +
                       "&dir_action=navigate" +
                       "&action_token=$jwtToken"

               val intent = Intent(Intent.ACTION_VIEW, Uri.parse(navConnectUrl))
               // Explicitly set GMM package to ensure it opens in Google Maps
               intent.setPackage("com.google.android.apps.maps")
               // Add your application ID to the intent
               intent.putExtra(Intent.EXTRA_REFERRER_NAME, "android-app://${application.packageName}")
               // set up the NavConnect back button
               intent.putExtra("pendingIntent", getPendingIntent())
               startActivity(intent)

           } catch (e: Exception) {
               // handle errors
           }
        }

        private fun getPendingIntent(): PendingIntent? {
          val returnIntent = Intent(application, MainActivity::class.java) // replace with your activity to launch
          returnIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_SINGLE_TOP)
          val flags = PendingIntent.FLAG_IMMUTABLE
          if (Build.VERSION.SDK_INT < Build.VERSION_CODES.VANILLA_ICE_CREAM) {
            return PendingIntent.getActivity(application, 0, returnIntent, flags)
          }

          val options =
            ActivityOptions.makeBasic()
              .setPendingIntentCreatorBackgroundActivityStartMode(
                ActivityOptions.MODE_BACKGROUND_ACTIVITY_START_ALLOWED
              )

          return PendingIntent.getActivity(application, 0, returnIntent, flags, options.toBundle())
        }

Waze ‏ (Android)

בדוגמת הקוד הבאה ב-Kotlin מוצגת פונקציה לדוגמה שמפעילה סשן של Navigation Connect עם הפרמטרים הנדרשים.

private val destinationAddress = "1600 Amphitheatre Parkway, Mountain View, CA 94043"

         private fun launchNavConnect() {
            val tripToken = "TRIP_TOKEN"

            try {
                // URL Encode the destination
                val encodedDestination = URLEncoder.encode(destinationAddress, "UTF-8")
                val navConnectUrl = "https://waze.com/ul?" +
                        "&q=$encodedDestination" +
                        "&navigate=yes" +
                        "&external_trip_token=$tripToken"

                val intent = Intent(Intent.ACTION_VIEW, Uri.parse(navConnectUrl))
                // Explicitly set package name to ensure it opens in Waze
                intent.setPackage("com.waze")
                // Add your application ID to the intent
                val referrerName = "android-app://${application.packageName}"
                intent.putExtra(Intent.EXTRA_REFERRER_NAME, referrerName)

                // set up the NavConnect back button
                intent.putExtra("pendingIntent", getPendingIntent())
                startActivity(intent)

            } catch (e: Exception) {
                // handle errors
            }
         }

         private fun getPendingIntent(): PendingIntent? {
           val returnIntent = Intent(application, MainActivity::class.java) // replace with your activity to launch
           returnIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_SINGLE_TOP)
           val flags = PendingIntent.FLAG_IMMUTABLE
           if (Build.VERSION.SDK_INT < Build.VERSION_CODES.VANILLA_ICE_CREAM) {
             return PendingIntent.getActivity(application, 0, returnIntent, flags)
           }

           val options =
             ActivityOptions.makeBasic()
               .setPendingIntentCreatorBackgroundActivityStartMode(
                 ActivityOptions.MODE_BACKGROUND_ACTIVITY_START_ALLOWED
               )

           return PendingIntent.getActivity(application, 0, returnIntent, flags, options.toBundle())
         }

Waze ‏ (iOS)

קוד Swift הבא מציג פונקציה לדוגמה שמפעילה סשן של Navigation Connect עם הפרמטרים הנדרשים.

openWazeUrl(queryItems: [URLQueryItem(name: "q", value: "1600 Amphitheatre Parkway")])

        private func openWazeUrl(queryItems: [URLQueryItem]) {
          var components = URLComponents()
          components.scheme = "https"
          components.host = "waze.com"
          components.path = "/ul"

          // Create a mutable copy of the queryItems.
          var mutableQueryItems = queryItems

          // Add Trip Token
          guard let tokenText = tokenField.text, !tokenText.isEmpty else {
            return
          }
          let token = URLQueryItem(name: "external_trip_token", value: tokenText)

          mutableQueryItems.append(token)

          // Add compulsory params
          mutableQueryItems.append(URLQueryItem(name: "navigate", value: "yes"))

          // Construct and Launch URL
          components.queryItems = mutableQueryItems

          guard let url = components.url else {
            return
          }

          UIApplication.shared.open(url, options: [:], completionHandler: nil)
        }
       }