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

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

סקירה כללית

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

ברשימה הזו מוצגות שיטות ה-listener שזמינות לאירועי ניווט:

הצגת הקוד

הצהרה על עמידה בפרוטוקולים הנדרשים

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

Swift

class ViewController: UIViewController, GMSNavigatorListener,
GMSRoadSnappedLocationProviderListener {

Objective-C

@interface ViewController () <GMSNavigatorListener,
GMSRoadSnappedLocationProviderListener>

@end

אחרי שמטמיעים את פרוטוקולי הניווט, מגדירים את מאזיני הבקרה של התצוגה. לדוגמה, אפשר להוסיף את הקוד הבא לשיטה 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; }