ניווט במסלול

במדריך הזה מוסבר איך לתכנן מסלול באפליקציה ליעד יחיד באמצעות Navigation SDK ל-iOS.

סקירה כללית

  1. משלבים את Navigation SDK באפליקציה, כפי שמתואר בקטע הגדרת הפרויקט.
  2. מגדירים GMSMapView.
  3. מבקשים מהמשתמש לאשר את התנאים וההגבלות, ולאשר את שירותי המיקום וההתראות ברקע.
  4. יוצרים מערך שמכיל יעד אחד או יותר.
  5. מגדירים GMSNavigator כדי לשלוט במסלול המפורט.

    • מוסיפים יעדים באמצעות setDestinations.
    • מגדירים את isGuidanceActive ל-true כדי להתחיל בניווט.
    • אפשר להשתמש ב-simulateLocationsAlongExistingRoute כדי לדמות את ההתקדמות של הרכב לאורך המסלול, לצורך בדיקה, ניפוי באגים והדגמה של האפליקציה.

הצגת הקוד

מבקשים מהמשתמש להעניק את ההרשאות הנדרשות

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

מתן הרשאה לשירותי המיקום

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

  1. מוסיפים את המפתח NSLocationAlwaysUsageDescription אל Info.plist.
  2. כערך, מוסיפים הסבר קצר לגבי הסיבה לכך שהאפליקציה שלכם זקוקה לשירותי מיקום. לדוגמה: "האפליקציה הזו זקוקה להרשאה להשתמש בשירותי המיקום לצורך ניווט מפורט".

  3. כדי להציג את תיבת הדו-שיח של ההרשאה, צריך להפעיל את השיטה requestAlwaysAuthorization() של מופע מנהל המיקומים.

Swift

self.locationManager.requestAlwaysAuthorization()

Objective-C

[_locationManager requestAlwaysAuthorization];

מתן הרשאה לקבלת התראות על ניווט ברקע

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

Swift

UNUserNotificationCenter.current().requestAuthorization(options: [.alert]) {
  granted, error in
    // Handle denied authorization to display notifications.
    if !granted || error != nil {
      print("User rejected request to display notifications.")
    }
}

Objective-C

// Request authorization for alert notifications.
UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
UNAuthorizationOptions options = UNAuthorizationOptionAlert;
[center requestAuthorizationWithOptions:options
                      completionHandler:
 ^(
   BOOL granted,
   NSError *_Nullable error) {
     if (!error && granted) {
       NSLog(@"iOS Notification Permission: newly Granted");
     } else {
       NSLog(@"iOS Notification Permission: Failed or Denied");
     }
   }];

מאשרים את התנאים וההגבלות

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

Swift

  let termsAndConditionsOptions = GMSNavigationTermsAndConditionsOptions(companyName: "Ride Sharing Co.")

  GMSNavigationServices.showTermsAndConditionsDialogIfNeeded(
    with: termsAndConditionsOptions) { termsAccepted in
    if termsAccepted {
      // Enable navigation if the user accepts the terms.
      self.mapView.isNavigationEnabled = true
      self.mapView.settings.compassButton = true

      // Request authorization to use location services.
      self.locationManager.requestAlwaysAuthorization()

      // Request authorization for alert notifications which deliver guidance instructions
      // in the background.
    UNUserNotificationCenter.current().requestAuthorization(options: [.alert]) {
      granted, error in
        // Handle rejection of notification authorization.
        if !granted || error != nil {
          print("Authorization to deliver notifications was rejected.")
        }
      }
    } else {
      // Handle rejection of terms and conditions.
    }
  }

Objective-C

GMSNavigationTermsAndConditionsOptions *termsAndConditionsOptions = [[GMSNavigationTermsAndConditionsOptions alloc] initWithCompanyName:@"Ride Sharing Co."];

[GMSNavigationServices
  showTermsAndConditionsDialogIfNeededWithOptions:termsAndConditionsOptions
  callback:^(BOOL termsAccepted) {
   if (termsAccepted) {
     // Enable navigation if the user accepts the terms.
     _mapView.navigationEnabled = YES;
     _mapView.settings.compassButton = YES;

     // Request authorization to use the current device location.
     [_locationManager requestAlwaysAuthorization];

     // Request authorization for alert notifications which deliver guidance instructions
     // in the background.
     UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
     UNAuthorizationOptions options = UNAuthorizationOptionAlert;
     [center requestAuthorizationWithOptions:options
                           completionHandler:
     ^(
       BOOL granted,
       NSError *_Nullable error) {
         if (!error && granted) {
           NSLog(@"iOS Notification Permission: newly Granted");
         } else {
           NSLog(@"iOS Notification Permission: Failed or Denied");
         }
       }];
   } else {
     // Handle rejection of the terms and conditions.
   }
 }];

יצירת מסלול והפעלת ההנחיות

כדי לתכנן מסלול, צריך להפעיל את השיטה setDestinations() של Navigator עם מערך שמכיל יעד אחד או יותר (GMSNavigationWaypoint) שרוצים לבקר בו. אם החישוב הצליח, המסלול יוצג במפה. כדי להתחיל בהנחיה לאורך המסלול, החל מהיעד הראשון, מגדירים את isGuidanceActive כ-true בקריאה החוזרת.

בדוגמה הבאה מוצגים:

  • יצירת מסלול חדש עם שני יעדים.
  • הנחיות להתחלה.
  • הפעלת התראות על הנחיות ברקע.
  • סימולציה של נסיעה לאורך המסלול (אופציונלי).
  • הגדרת מצב המצלמה ל'מעקב' (אופציונלי).

Swift

func startNav() {
  var destinations = [GMSNavigationWaypoint]()
  destinations.append(GMSNavigationWaypoint.init(placeID: "ChIJnUYTpNASkFQR_gSty5kyoUk",
                                                 title: "PCC Natural Market")!)
  destinations.append(GMSNavigationWaypoint.init(placeID:"ChIJJ326ROcSkFQRBfUzOL2DSbo",
                                                 title:"Marina Park")!)

  mapView.navigator?.setDestinations(destinations) { routeStatus in
    self.mapView.navigator?.isGuidanceActive = true
    self.mapView.locationSimulator?.simulateLocationsAlongExistingRoute()
    self.mapView.cameraMode = .following
  }
}

Objective-C

- (void)startNav {
  NSArray<GMSNavigationWaypoint *> *destinations =
  @[[[GMSNavigationWaypoint alloc] initWithPlaceID:@"ChIJnUYTpNASkFQR_gSty5kyoUk"
                                             title:@"PCC Natural Market"],
    [[GMSNavigationWaypoint alloc] initWithPlaceID:@"ChIJJ326ROcSkFQRBfUzOL2DSbo"
                                             title:@"Marina Park"]];

  [_mapView.navigator setDestinations:destinations
                             callback:^(GMSRouteStatus routeStatus){
                               [_mapView.locationSimulator simulateLocationsAlongExistingRoute];
                               _mapView.navigator.guidanceActive = YES;
                               _mapView.cameraMode = GMSNavigationCameraModeFollowing;
                             }];
}

מידע נוסף על מזהי מקומות זמין במאמר מזהי מקומות.

הגדרת אמצעי הגעה

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

מגדירים את המאפיין travelMode של תצוגת המפה, כפי שמתואר בדוגמה הבאה:

Swift

self.mapView.travelMode = .cycling

Objective-C

_mapView.travelMode = GMSNavigationTravelModeCycling;

הגדרת כבישים שיש להימנע מהם

אפשר להשתמש במאפיינים avoidsHighways ו-avoidsTolls BOOL כדי להימנע מכבישים מהירים או מכבישים עם אגרה במסלול.

Swift

self.mapView.navigator?.avoidsTolls = true

Objective-C

_mapView.navigator.avoidsTolls = YES;

חיפוש מזהי PlaceID

אתם יכולים להשתמש בכלי לאיתור מזהי מקומות כדי למצוא מזהי מקומות לשימוש ביעדים של מסלולים. מוסיפים יעד מ-placeID באמצעות GMSNavigationWaypoint.

טקסט צף

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