האזנה לאירועי ניווט

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

סקירה כללית

Navigation SDK ל-iOS מספק מאזינים שמשויכים למיקום המשתמש ולתנאים לאורך המסלול, ונתונים חשובים לגבי זמן ומרחק. ב-view controller של המפה, האפליקציה צריכה לאמץ את הפרוטוקולים של המאזינים האלה: GMSRoadSnappedLocationProviderListener ו-GMSNavigatorListener.

ברשימה הזו מפורטות שיטות המאזין הזמינות לאירועי ניווט:

הצגת הקוד

הצהרת תאימות לפרוטוקולים הנדרשים

לפני שמטמיעים את שיטות הניווט, צריך לאמץ את הפרוטוקולים הבאים ב-View Controller:

Swift

class ViewController: UIViewController, GMSNavigatorListener,
GMSRoadSnappedLocationProviderListener {

Objective-C

@interface ViewController () <GMSNavigatorListener,
GMSRoadSnappedLocationProviderListener>

@end

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

Swift

mapView.navigator?.add(self) mapView.roadSnappedLocationProvider?.add(self)

Objective-C

[_mapView.navigator addListener:self]; [_mapView.roadSnappedLocationProvider
addListener:self];

קבלה או הפסקה של עדכוני מיקום

עדכוני המיקום נדרשים כדי להציג את ההתקדמות של המשתמש במפה.

המכונה location חושפת את המאפיינים הבאים:

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

כדי לקבל עדכוני מיקום רציפים, צריך להפעיל את הפונקציה mapView.roadSnappedLocationProvider.startUpdatingLocation ולהשתמש בפונקציה GMSRoadSnappedLocationProviderListener כדי לטפל באירוע didUpdateLocation.

בדוגמה הבאה מוצגת קריאה ל-startUpdatingLocation:

Swift

mapView.roadSnappedLocationProvider.startUpdatingLocation()

Objective-C

[_mapView.roadSnappedLocationProvider startUpdatingLocation];

הקוד הבא יוצר GMSRoadSnappedLocationProviderListener שמטפל באירוע didUpdateLocation.

Swift

func locationProvider(_ locationProvider: GMSRoadSnappedLocationProvider,
didUpdate location: CLLocation) { print("Location: \(location.description)") }

Objective-C

-   (void)locationProvider:(GMSRoadSnappedLocationProvider *)locationProvider
    didUpdateLocation:(CLLocation *)location { NSLog(@"Location: %@",
    location.description); }

כדי לקבל עדכוני מיקום כשהאפליקציה פועלת ברקע, מגדירים את allowsBackgroundLocationUpdates כ-true:

Swift

mapView.roadSnappedLocationProvider.allowsBackgroundLocationUpdates = true

Objective-C

 _mapView.roadSnappedLocationProvider.allowsBackgroundLocationUpdates = YES;

זיהוי אירועי הגעה

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

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

בדוגמת הקוד הבאה מוצגת שיטה לטיפול באירוע didArriveAtWaypoint:

Swift

func navigator(_ navigator: GMSNavigator, didArriveAt waypoint:
GMSNavigationWaypoint) { print("You have arrived at: \(waypoint.title)")
mapView.navigator?.continueToNextDestination()
mapView.navigator?.isGuidanceActive = true }

Objective-C

-   (void)navigator:(GMSNavigator *)navigator
    didArriveAtWaypoint:(GMSNavigationWaypoint *)waypoint { NSLog(@"You have
    arrived at: %@", waypoint.title); [_mapView.navigator
    continueToNextDestination]; _mapView.navigator.guidanceActive = YES; }

קבלת עדכונים על שינויים במסלול

כדי לקבל התראה בכל פעם שהמסלול משתנה, יוצרים שיטה לטיפול באירוע navigatorDidChangeRoute. אפשר לגשת למסלול החדש באמצעות המאפיינים routeLegs ו-currentRouteLeg של GMSNavigator.

Swift

func navigatorDidChangeRoute(_ navigator: GMSNavigator) { print("The route has
changed.") }

Objective-C

-   (void)navigatorDidChangeRoute:(GMSNavigator *)navigator { NSLog(@"The route
    has changed."); }

קבלת עדכונים לגבי זמן ההגעה ליעד

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

Swift

func navigator(_ navigator: GMSNavigator, didUpdateRemainingTime time:
TimeInterval) { print("Time to next destination: \(time)") }

Objective-C

-   (void)navigator:(GMSNavigator *)navigator
    didUpdateRemainingTime:(NSTimeInterval)time { NSLog(@"Time to next
    destination: %f", time); }

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

Swift

navigator?.timeUpdateThreshold = 10

Objective-C

navigator.timeUpdateThreshold = 10;

קבלת עדכונים לגבי המרחק ליעד

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

Swift

func navigator(_ navigator: GMSNavigator, didUpdateRemainingDistance distance:
CLLocationDistance) { let miles = distance * 0.00062137 print("Distance to next
destination: \(miles) miles.") }

Objective-C

-   (void)navigator:(GMSNavigator *)navigator
    didUpdateRemainingDistance:(CLLocationDistance)distance { double miles =
    distance * 0.00062137; NSLog(@"%@", [NSString stringWithFormat:@"Distance to
    next destination: %.2f.", miles]); }

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

Swift

navigator?.distanceUpdateThreshold = 100

Objective-C

navigator.distanceUpdateThreshold = 100;

קבלת עדכוני תנועה

כדי לקבל עדכונים שוטפים על זרימת התנועה במסלול שנותר, צריך ליצור שיטה לטיפול באירוע didUpdateDelayCategory. קריאה ל-delayCategoryToNextDestination מחזירה את הערך GMSNavigationDelayCategory, שמציג ערך של 0 עד 3. העדכונים של הקטגוריה מבוססים על המיקום הנוכחי של משתמש האפליקציה. אם נתוני התנועה לא זמינים, הפונקציה GMSNavigationDelayCategory מחזירה את הערך 0. המספרים 1-3 מציינים עוצמת תנועה גוברת, מתנועה קלה ועד תנועה כבדה.

Swift

func navigator(_ navigator: GMSNavigator, didUpdate delayCategory:
GMSNavigationDelayCategory) { print("Traffic flow to next destination:
\(delayCategory)") }

Objective-C

-   (void)navigator:(GMSNavigator *)navigator
    didUpdateDelayCategory:(GMSNavigationDelayCategory)delayCategory {
    NSLog(@"Traffic flow to next destination: %ld", (long)delayCategory); }

המאפיין GMSNavigationDelayCategory חושף את רמות העיכוב הבאות:

קטגוריית העיכוב תיאור
GMSNavigationDelayCategoryNoData 0 – לא זמין, אין נתונים על תנועה או :
המסלול.
GMSNavigationDelayCategoryHeavy 1 – כבד.
GMSNavigationDelayCategoryMedium 2 – בינונית.
GMSNavigationDelayCategoryLight 3 – אור.

קבלת עדכונים על מהירות מופרזת

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

Swift

// Listener to handle speeding events. func navigator( _ navigator:
GMSNavigator, didUpdateSpeedingPercentage percentageAboveLimit: CGFloat ) {
print("Speed is \(percentageAboveLimit) above the limit.") }

Objective-C

// Listener to handle speeding events. - (void)navigator:(GMSNavigator
*)navigator didUpdateSpeedingPercentage:(CGFloat)percentageAboveLimit {
NSLog(@"Speed is %f percent above the limit.", percentageAboveLimit); }

שינוי של מצב התאורה המוצע

כדי לקבל עדכונים על שינויים משוערים בתאורה, צריך ליצור שיטה לטיפול באירוע didChangeSuggestedLightingMode.

Swift

// Define a listener for suggested changes to lighting mode. func navigator(_
navigator: GMSNavigator, didChangeSuggestedLightingMode lightingMode:
GMSNavigationLightingMode) { print("Suggested lighting mode has changed:
\(String(describing: lightingMode))")

 // Make the suggested change. mapView.lightingMode = lightingMode }

Objective-C

// Define a listener for suggested changes to lighting mode.
-(void)navigator:(GMSNavigator *)navigator didChangeSuggestedLightingMode:
(GMSNavigationLightingMode)lightingMode { NSLog(@"Suggested lighting mode has
changed: %ld", (long)lightingMode);

 // Make the suggested change. _mapView.lightingMode = lightingMode; }