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

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

סקירה

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

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

להצגת הקוד

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

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

Swift

class ViewController: UIViewController, GMSNavigatorListener,
GMSRoadSnappedLocationProviderListener {

Objective-C

@interface ViewController () <GMSNavigatorListener,
GMSRoadSnappedLocationProviderListener>

@end

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