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

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

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

ميزات الحوادث في الوقت الفعلي

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

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

تحذيرات تفاعلية حول الحوادث على طول الطريق

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

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

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

mapView.navigator.shouldDisplayPrompts = true

عرض تفاصيل الحادث عندما ينقر المستخدم على تحذير

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

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

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

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

يمكنك التحكّم في قدرة المستخدمين على النقر على تحذيرات الحوادث في النظرات العامة على المسار لعرض مزيد من المعلومات باستخدام showsIncidentCards.

mapView.settings.showsIncidentCards = true

بطاقات معلومات التحذيرات أثناء التنقّل النشط

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

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

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

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

mapView.navigator.shouldDisplayPrompts = true

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

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

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

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

mapView.navigator.shouldDisplayPrompts = true

الإبلاغ عن الحوادث أثناء التنقّل النشط

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

زر الإبلاغ قائمة الإبلاغ

إظهار زر الإبلاغ العادي أو إخفاؤه

يمكنك ضبط ظهور زر الإبلاغ العادي أثناء التنقّل النشط باستخدام 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.
          }
     }

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

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

تحديد موضع زر الإبلاغ

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

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