الاستماع إلى أحداث التنقّل

استخدِم هذا الدليل لتمكين تطبيقك من الاستماع إلى مجموعة متنوعة من الأحداث التي تتغيّر أثناء تنقّل المستخدم على طول المسار والاستجابة لها. لا يتناول هذا الدليل تحديد المسار، بل يتناول فقط الاستجابة للأحداث على طول المسار.

نظرة عامة

توفّر لك حزمة تطوير البرامج (SDK) للتنقّل في نظام التشغيل iOS أدوات استماع مرتبطة بالموقع الجغرافي للمستخدم والظروف على طول المسار وبيانات الوقت والمسافة المهمة. في وحدة التحكّم في عرض الخريطة، يحتاج تطبيقك إلى اعتماد البروتوكولات لهؤلاء المستمعين: GMSRoadSnappedLocationProviderListener و GMSNavigatorListener.

تعرض هذه القائمة طرق الاستماع المتاحة لأحداث التنقّل:

الاطّلاع على الرمز

الإعلان عن التوافق مع البروتوكولات المطلوبة

قبل تنفيذ طرق التنقّل، يجب أن تلتزم وحدة التحكّم في العرض بالبروتوكولات التالية:

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 إحداثيات خط الطول الحالي الذي تم تثبيته على الطريق
دورة الاتجاه الحالي بالدرجات
السرعة السرعة الحالية
timestamp تاريخ/وقت القراءة الحالية

لتلقّي إشعارات مستمرة بشأن الموقع الجغرافي، يمكنك استدعاء 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 على "صحيح":

Swift

mapView.roadSnappedLocationProvider.allowsBackgroundLocationUpdates = true

Objective-C

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

Objective-C

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

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

جارٍ تغيير وضع الإضاءة المقترَح

يحتسب 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
}

Objective-C

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

لمزيد من المعلومات حول ضبط وضع الإضاءة التلقائي واليدوي، يُرجى الاطّلاع على ضبط وضعَي الإضاءة العادية والمنخفضة.