اختيار النظام الأساسي: Android iOS

ضبط المعلومات عن الحوادث في الوقت الفعلي

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

ميزات الإشعارات في الوقت الفعلي بشأن أي عوائق

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

يمكن ضبط هذه الميزات وهي مفعّلة تلقائيًا. تقدّم الأقسام التالية مزيدًا من المعلومات حول الميزات وخيارات الإعداد المتاحة.

وسائل شرح تفاعلية بشأن أي عوائق على طول المسارات

عندما يعرض تطبيق مسارًا، سواء في نظرة عامة على المسار أو أثناء التنقّل النشط، تظهر أي عوائق حالية كتعليقات توضيحية على طول المسار. عند تفعيل طبقة حركة المرور، ستظهر أيضًا على الخريطة الاضطرابات التي تحدث خارج المسار. تتضمّن وسائط الشرح رمزًا يشير إلى نوع الانقطاع.

وسائل الشرح على طول المسارات

يمكنك التحكّم في عرض تحذيرات بشأن الحوادث على طول الطرق باستخدام shouldDisplayPrompts، الذي يتحكّم أيضًا في عرض التنبيهات التلقائية عندما يقترب المستخدم من حادث.

mapView.navigator.shouldDisplayPrompts = true

عرض تفاصيل الانقطاع عندما ينقر المستخدم على وسيلة شرح

يؤدي النقر على وسيلة شرح الانقطاع إلى فتح بطاقة معلومات تتضمّن المزيد من التفاصيل. ينطبق ذلك على التنبيهات أثناء القيادة وخارج المسار، مع العلم أنّ التنبيهات خارج المسار لا تظهر إلا إذا كانت طبقة حركة المرور مفعّلة. تعرض البطاقة نوع المشكلة ووقت آخر إبلاغ عنها، وتتضمّن أحيانًا خيارًا للتصويت على ما إذا كانت المشكلة لا تزال قائمة. يختلف نوع بطاقة المعلومات وخيارات إعداداتها حسب ما إذا كان المستخدم في وضع التنقّل النشط أم لا.

بطاقات معلومات وسيلة الشرح في النظرات العامة على المسار، قبل بدء التنقّل النشط

قبل بدء التنقّل النشط، يمكن للمستخدمين النقر على وسيلة شرح على الخريطة أو نظرة عامة على المسار لفتح بطاقة معلومات. تتطلّب التحذيرات خارج المسار تفعيل طبقة حركة المرور. تقدّم بطاقة المعلومات مزيدًا من التفاصيل حول الانقطاع.

بطاقة معلومات "نظرة عامة"

يمكنك التحكّم في إمكانية النقر على وسائط الشرح الخاصة بالانقطاعات في الملخّصات الخاصة بالمسارات لعرض المزيد من المعلومات باستخدام showsIncidentCards.

mapView.settings.showsIncidentCards = true

بطاقات المعلومات المنبثقة أثناء التنقّل النشط

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

تتوفّر إمكانية التصويت بشأن حالات التعطّل على الطريق وخارجه ضمن نطاق 5 كيلومترات من المستخدم، باستثناء حالات إغلاق الطرق. تعالج Google هذه الأصوات للمساعدة في تحديد ما إذا كان يجب الاستمرار في عرض العرقلة. قد تظهر الأصوات أيضًا على الخريطة لمستخدمي "خرائط Google" وNavigation SDK الآخرين.

بطاقة معلومات التنقّل النشط

يمكنك التحكّم في عرض التحذيرات بشأن الحوادث وإمكانية النقر عليها أثناء التنقّل النشط باستخدام shouldDisplayPrompts، الذي يتحكّم أيضًا في عرض التحذيرات على طول الطرق و عرض التنبيهات التلقائية عندما يقترب المستخدم من حادث.

mapView.navigator.shouldDisplayPrompts = true

تنبيهات مبرمَجة بشأن أي عوائق على الطريق مع إمكانية التصويت أثناء التنقّل

أثناء التنقّل النشط، عندما يقترب المستخدم من عائق على طول الطريق، يظهر طلب يتضمّن معلومات عن العائق وأزرار للتصويت على ما إذا كان العائق لا يزال موجودًا. تعالج Google الأصوات التي يرسلها المستخدمون، وقد تظهر على الخريطة لمستخدمي "خرائط Google" وNavigation SDK الآخرين، كما تُستخدَم لتحديد ما إذا كان يجب مواصلة عرض العرقلة.

بطاقة معلومات التنقّل النشط

يمكنك ضبط طريقة عرض رسائل التنبيه أثناء التنقّل النشط باستخدام shouldDisplayPrompts، الذي يتحكّم أيضًا في عرض التحذيرات على طول المسارات.

mapView.navigator.shouldDisplayPrompts = true

الإبلاغ عن العوائق أثناء التنقّل

أثناء وضع التنقّل النشط، يظهر زر في واجهة مستخدم التنقّل يتيح للمستخدمين الإبلاغ عن أي عوائق جديدة على طول طريقهم. عندما ينقر المستخدم على الزر، تظهر قائمة بأنواع العرقلة المتاحة للإبلاغ عنها. تعالج Google البلاغات التي يرسلها المستخدمون، وقد تظهر على الخريطة لمستخدمي "خرائط Google" وNavigation SDK الآخرين.

زر الإبلاغ قائمة خيارات الإبلاغ

إظهار زر التقارير العادية أو إخفاؤه

يمكنك ضبط مستوى ظهور زر الإبلاغ العادي أثناء التنقّل النشط باستخدام navigationReportIncidentButtonEnabled.

// Enables the incident reporting FAB to show in situations where incident
// reporting is possible.
mapView.settings.navigationReportIncidentButtonEnabled = true

إضافة زر مخصّص للإبلاغ عن المحتوى

بدلاً من زر الإبلاغ عن المشاكل العادي، يمكنك إضافة زر مخصّص للإبلاغ عن المشاكل إلى واجهة مستخدم شريط التنقّل. عندما ينقر المستخدم على الزر المخصّص، يمكنك بدء عرض قائمة خيارات الإبلاغ من خلال استدعاء الطريقة presentReportIncidentsPanel. قبل إضافة زر إبلاغ مخصّص، تأكَّد من أنّ التطبيق في وضع التصفّح النشط وأنّ المستخدم في بلد تم تفعيل ميزة الإبلاغ فيه من خلال طلب reportIncidentsAvailable. إذا لم يكن أيّ من الشرطَين صحيحًا، لن تظهر قائمة الإبلاغ.

  // Check if reporting is available before displaying your button
  let isReportingAvailable = mapview.isIncidentReportingAvailable()
  customReportingIncidentButton.isHidden = !isReportingAvailable
  customReportingIncidentButton.addTarget(self, action: #selector(didTapReportIncidentButton), for: .touchUpInside)
  
  // Trigger the reporting flow if the button is clicked
  func didTapReportIncidentButton() {
          mapView.presentReportIncidentsPanel(self) { [weak self] error in
              guard let self = self else { return }
              if let error = error as NSError? {
                  if error.domain == GMSMapViewPresentReportIncidentPanelErrorDomain {
                      let errorCode = GMSMapViewPresentReportIncidentPanelErrorCode(rawValue: error.code)
                      
                      switch errorCode {
                      case .internal:
                          self.showErrorMessage(
                              title: "Error Presenting Report Incident Panel",
                              message: "An internal error occurred."
                          )
                      case .reportingNotAvailable:
                          self.showErrorMessage(
                              title: "Error Presenting Report Incident Panel",
                              message: "Reporting is not available."
                          )
                      case .none:
                          self.showErrorMessage(
                              title: "Error Presenting Report Incident Panel",
                              message: "An unknown error occurred."
                          )
                      }
                  } else {
                      // Handle other potential errors (e.g., network errors)
                      self.showErrorMessage(
                          title: "Error Presenting Report Incident Panel",
                          message: "An unexpected error occurred: \(error.localizedDescription)"
                      )
                  }
              }
              // If error is nil, the panel was presented successfully. You can add any extra logic here.
          }
     }

العمل مع واجهات مستخدم التنقل المخصصة

إذا كان تنفيذك لحزمة Navigation SDK يتضمّن عناصر مخصّصة في واجهة المستخدم، عليك مراعاة عناصر التعطيل في الوقت الفعلي لتجنُّب التعارضات.

موضع زر الإبلاغ

By default, the disruption reporting button is positioned at the bottom end/trailing corner of the map—on the right side for left-to-right languages and left side for right-to-left languages. إذا كنت بحاجة إلى نقل زر الإبلاغ لإتاحة مساحة لعناصر واجهة المستخدم المخصّصة، استخدِم bottomTrailingButtonsLayoutGuide.

Swift

// Create a new layout guide
let topRightLayoutGuide = UILayoutGuide()
self.view.addLayoutGuide(topRightLayoutGuide)

// Activate constraints using fixed constants here as an example
// assuming the current reporting button is of fixed height
topRightLayoutGuide.topAnchor.constraint(equalTo: _mapView.navigationHeaderLayoutGuide.bottomAnchor, constant: 50).isActive = true
topRightLayoutGuide.trailingAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.trailingAnchor, constant: -14).isActive = true

// Assign the layout guide
_mapView.bottomTrailingButtonsLayoutGuide = topRightLayoutGuide

// Create an alternate layout guide to use when the header and the footer are not full width
let topRightAlternateLayoutGuide = UILayoutGuide()
self.view.addLayoutGuide(topRightAlternateLayoutGuide)

// Activate constraints using fixed constants here as an example
// assuming the current RTD button is of fixed height
topRightAlternateLayoutGuide.topAnchor.constraint(equalTo: _mapView.navigationHeaderLayoutGuide.bottomAnchor, constant: 20).isActive = true
topRightAlternateLayoutGuide.trailingAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.trailingAnchor, constant: -10).isActive = true

// Assign the layout guide
_mapView.bottomTrailingButtonsAlternateLayoutGuide = topRightAlternateLayoutGuide

Objective-C

// Create a new layout guide
UILayoutGuide *topRightLayoutGuide = [[UILayoutGuide alloc] init];
[self.view addLayoutGuide:topRightLayoutGuide];

// Activate constraints using fixed constants here as an example
// assuming the current RTD button is of fixed height
[[topRightLayoutGuide.topAnchor
    constraintEqualToAnchor:_mapView.navigationHeaderLayoutGuide.bottomAnchor
                   constant:50]
    setActive:YES];

[[topRightLayoutGuide.trailingAnchor
    constraintEqualToAnchor:self.view.safeAreaLayoutGuide.trailingAnchor
                   constant:-14]
    setActive:YES];

// Assign the layout guide
_mapView.bottomTrailingButtonsLayoutGuide = topRightLayoutGuide;

// Create an alternate layout guide to use when the header and the footer are not full width
UILayoutGuide *topRightAlternateLayoutGuide = [[UILayoutGuide alloc] init];
[self.view addLayoutGuide:topRightAlternateLayoutGuide];

// Activate constraints using fixed constants here as an example
// assuming the current RTD button is of fixed height
[[topRightAlternateLayoutGuide.topAnchor
    constraintEqualToAnchor:_mapView.navigationHeaderLayoutGuide.bottomAnchor
                   constant:50]
    setActive:YES];

[[topRightAlternateLayoutGuide.trailingAnchor
    constraintEqualToAnchor:self.view.safeAreaLayoutGuide.trailingAnchor
                   constant:-14]
    setActive:YES];

// Assign the layout guide
_mapView.bottomTrailingButtonsAlternateLayoutGuide = topRightAlternateLayoutGuide;

Prompt Visibility API (تجريبية)

تساعدك واجهة برمجة التطبيقات Prompt Visibility API في تجنُّب التعارضات بين عناصر واجهة المستخدم التي أنشأتها حزمة Navigation SDK وعناصر واجهة المستخدم المخصّصة الخاصة بك، وذلك من خلال إضافة أداة معالجة لتلقّي عملية استدعاء قبل ظهور عنصر في واجهة المستخدم تابع لحزمة Navigation SDK مباشرةً وبعد إزالة العنصر. يمكنك تلقّي عمليات ردّ لبعض عناصر التعطّل في الوقت الفعلي، بما في ذلك بطاقات المعلومات والإشعارات وقائمة الإبلاغ عن التعطّل، بالإضافة إلى إشعارات أخرى تنشئها حزمة Navigation SDK.

Swift

// Additional methods added to GMSNavigatorListener
...
func navigatorWillPresentPrompt(_ navigator: GMSNavigator) {
  // Hide any sort of custom UI element.
}

func navigatorDidDismissPrompt(_ navigator: GMSNavigator) {
  // Show any sort of custom UI element.
}
...

Objective-C

// Additional methods added to GMSNavigatorListener
...
- (void)navigatorWillPresentPrompt:(GMSNavigator *)navigator {
  // Hide any sort of custom UI element.
}

- (void)navigatorDidDismissPrompt:(GMSNavigator *)navigator {
  // Show any sort of custom UI element.
}
...