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

ضبط الانقطاعات في الوقت الفعلي

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

ميزات الإبلاغ عن المشاكل في الوقت الفعلي

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

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

وسائل شرح تفاعلية عن حالات تعطّل الخدمة على طول المسارات

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

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

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

mapView.navigator.shouldDisplayPrompts = true

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

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

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

عندما ينقر مستخدم على وسيلة شرح في نظرة عامة على مسار قبل بدء التنقّل النشط، تظهر بطاقة معلومات تتضمّن المزيد من المعلومات حول الحدث المُعرقِل.

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

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

mapView.settings.showsIncidentCards = true

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

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

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

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

mapView.navigator.shouldDisplayPrompts = true

تنبيهات آلية بشأن الأعطال مع إمكانية التصويت أثناء التنقّل

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

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

يمكنك ضبط طريقة عرض طلبات التنبيه أثناء التنقّل النشط باستخدام 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 يتضمّن عناصر واجهة مستخدم مخصّصة، عليك مراعاة عناصر الانقطاع في الوقت الفعلي لتجنُّب حدوث تعارضات.

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

يتم تلقائيًا وضع زر الإبلاغ عن المشاكل في أسفل الزاوية الأخيرة من الخريطة، أي على الجانب الأيسر للّغات التي تُكتب من اليمين إلى اليسار وعلى الجانب الأيمن للّغات التي تُكتب من اليسار إلى اليمين. إذا كنت بحاجة إلى نقل زر الإبلاغ لإتاحة مساحة لعناصر واجهة المستخدم المخصّصة، استخدِم 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.
}
...