گوش دادن به رویدادهای پیمایش

از این راهنما استفاده کنید تا برنامه‌تان بتواند به انواع رویدادهایی که با پیمایش کاربر در مسیر تغییر می‌کنند گوش دهد و پاسخ دهد. این راهنما تعریف مسیر را پوشش نمی‌دهد، فقط به رویدادهای موجود در مسیر پاسخ می‌دهد.

نمای کلی

کیت توسعه نرم‌افزار ناوبری برای iOS شنوندگانی را دراختیارتان قرار می‌دهد که با مکان کاربر و شرایط مسیر و داده‌های مهم زمان و مسافت مرتبط هستند. در کنترل‌کننده نمای نقشه، برنامه شما باید پروتکل‌های این شنوندگان را اتخاذ کند: GMSRoadSnappedLocationProviderListener و GMSNavigatorListener.

این فهرست روش‌های شنونده دردسترس برای رویدادهای پیمایش را نشان می‌دهد:

دیدن کد

اعلام انطباق با پروتکل‌های الزامی

قبل‌از پیاده‌سازی روش‌های پیمایش، کنترل‌کننده نما باید پروتکل‌های زیر را اتخاذ کند:

Swift

class ViewController:
  UIViewController,
  GMSNavigatorListener,
  GMSRoadSnappedLocationProviderListener
{
}

آبجکتیو-سی

@interface ViewController () <GMSNavigatorListener, GMSRoadSnappedLocationProviderListener>
@end

پس‌از اتخاذ پروتکل‌های ناوبری، شنوندگان را روی کنترل‌کننده نما تنظیم کنید. برای مثال، می‌توانید کد زیر را به روش viewDidLoad() اضافه کنید.

Swift

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

آبجکتیو-سی

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

دریافت یا توقف به‌روزرسانی‌های مکان

به‌روزرسانی‌های مکان برای نشان دادن پیشرفت کاربر روی نقشه لازم است.

نمونه location ویژگی‌های زیر را نشان می‌دهد:

خصوصیت مکان شرح
ارتفاع ارتفاع کنونی.
coordinate.latitude مختصات عرض جغرافیایی کنونی منطبق با جاده.
coordinate.longitude مختصات طول جغرافیایی کنونی منطبق‌شده با جاده.
دوره آموزشی جهت فعلی به درجه.
سرعت سرعت کنونی.
مُهر زمان تاریخ/زمان خواندن فعلی.

برای دریافت به‌روزرسانی‌های مداوم مکان، mapView.roadSnappedLocationProvider.startUpdatingLocation را فراخوانی کنید و از GMSRoadSnappedLocationProviderListener برای مدیریت رویداد didUpdateLocation استفاده کنید.

مثال زیر فراخوانی startUpdatingLocation را نشان می‌دهد:

Swift

mapView.roadSnappedLocationProvider.startUpdatingLocation()

آبجکتیو-سی

[_mapView.roadSnappedLocationProvider startUpdatingLocation];

کد زیر یک GMSRoadSnappedLocationProviderListener ایجاد می‌کند که رویداد didUpdateLocation را مدیریت می‌کند.

Swift

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

آبجکتیو-سی

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

برای دریافت به‌روزرسانی‌های مکان وقتی برنامه در پس‌زمینه است، allowsBackgroundLocationUpdates را روی true تنظیم کنید:

Swift

mapView.roadSnappedLocationProvider.allowsBackgroundLocationUpdates = true

آبجکتیو-سی

 _mapView.roadSnappedLocationProvider.allowsBackgroundLocationUpdates = YES;

درحال شناسایی رویدادهای ورود

برنامه شما از رویداد didArriveAtWaypoint برای تشخیص رسیدن به مقصد استفاده می‌کند. می‌توانید با فراخوانی continueToNextDestinationWithCompletion() و سپس فعال کردن مجدد راهنمایی، راهنمایی را ازسر بگیرید و به نقطه‌مسیر بعدی بروید. برنامه شما باید راهنمایی را پس‌از فراخوانی continueToNextDestinationWithCompletion() دوباره فعال کند.

پس‌از اینکه برنامه continueToNextDestinationWithCompletion را فراخوانی کرد، ناوبر دیگر داده‌ای درباره مقصد قبلی ندارد. اگر می‌خواهید اطلاعات مربوط به یک بخش مسیر را تجزیه‌وتحلیل کنید، باید این اطلاعات را قبل‌از فراخوانی continueToNextDestinationWithCompletion() از ناوبر بازیابی کنید.

نمونه کد زیر روشی را برای مدیریت رویداد didArriveAtWaypoint نشان می‌دهد:

Swift

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

آبجکتیو-سی

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

دریافت به‌روزرسانی‌های تغییر مسیر

برای دریافت اعلان هرگاه مسیر تغییر کرد، روشی برای مدیریت رویداد navigatorDidChangeRoute ایجاد کنید. بااستفاده از ویژگی‌های routeLegs و currentRouteLeg مربوط به GMSNavigator می‌توانید به مسیر جدید دسترسی پیدا کنید.

Swift

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

آبجکتیو-سی

- (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)")
}

آبجکتیو-سی

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

برای تنظیم حداقل تغییر در زمان تخمینی تا مقصد بعدی، ویژگی timeUpdateThreshold را روی GMSNavigator تنظیم کنید. مقدار به ثانیه مشخص شده است. اگر این ویژگی تنظیم نشده باشد، سرویس‌ها از مقدار پیش‌فرض یک ثانیه استفاده می‌کنند.

Swift

navigator?.timeUpdateThreshold = 10

آبجکتیو-سی

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.")
}

آبجکتیو-سی

- (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

آبجکتیو-سی

navigator.distanceUpdateThreshold = 100;

دریافت به‌روزرسانی‌های ترافیک

برای دریافت به‌روزرسانی‌های مداوم جریان ترافیک برای باقی مسیر، روشی برای مدیریت رویداد didUpdateDelayCategory ایجاد کنید. فراخوانی delayCategoryToNextDestination، GMSNavigationDelayCategory را برمی‌گرداند که مقداری از ۰ تا ۳ ارائه می‌دهد. به‌روزرسانی‌های دسته براساس موقعیت فعلی کاربر برنامه است. اگر داده‌های ترافیک دردسترس نباشد، GMSNavigationDelayCategory مقدار ۰ را برمی‌گرداند. اعداد ۱ تا ۳ نشان‌دهنده افزایش جریان از سبک به سنگین است.

Swift

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

آبجکتیو-سی

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

خصوصیت GMSNavigationDelayCategory سطوح تأخیر زیر را نشان می‌دهد:

دسته تأخیر شرح
GMSNavigationDelayCategoryNoData 0 - غیرقابل دسترس، بدون داده برای ترافیک یا :
مسیر.
GMSNavigationDelayCategoryHeavy ۱ - سنگین.
GMSNavigationDelayCategoryMedium ‫۲ - متوسط.
GMSNavigationDelayCategoryLight ۳ - سبک.

دریافت به‌روزرسانی‌های سرعت غیرمجاز

برای دریافت به‌روزرسانی‌ها وقتی راننده از حد مجاز سرعت فراتر می‌رود، روشی برای مدیریت رویداد didUpdateSpeedingPercentage ایجاد کنید.

Swift

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

آبجکتیو-سی

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

درحال تغییر حالت نورپردازی پیشنهادی

GMSNavigator حالت نورپردازی پیشنهادی را براساس زمان روز و مکان دستگاه محاسبه می‌کند و متد شنونده didChangeSuggestedLightingMode را فقط زمانی فراخوانی می‌کند که حالت پیشنهادی تغییر کند (مثلاً هنگام طلوع یا غروب آفتاب). برای اطمینان از اینکه نقشه با حالت روشنایی مناسب هنگام راه‌اندازی برنامه توسط کاربر شروع می‌شود، mapView.lightingMode را به suggestedLightingMode ناوبر درطول مقداردهی اولیه تنظیم کنید و didChangeSuggestedLightingMode را برای مدیریت تغییرات بعدی پیاده‌سازی کنید.

مثال زیر نحوه تنظیم حالت نورپردازی اولیه و گوش دادن به تغییرات پیشنهادی حالت نورپردازی را نشان می‌دهد:

Swift

// Set the initial lighting mode on launch or setup.
mapView.lightingMode = mapView.navigator?.suggestedLightingMode ?? .normal

// 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
}

آبجکتیو-سی

// Set the initial lighting mode on launch or setup.
_mapView.lightingMode = _mapView.navigator.suggestedLightingMode;

// 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;
}

برای اطلاعات بیشتر درباره پیکربندی حالت نورپردازی خودکار و دستی، به پیکربندی حالت‌های عادی و کم‌نور مراجعه کنید.