التنقل في مسار

اتّبِع هذا الدليل لرسم مسار داخل تطبيقك إلى وجهة واحدة باستخدام حزمة Navigation SDK لنظام التشغيل iOS.

نظرة عامة

  1. يمكنك دمج حزمة Navigation SDK في تطبيقك كما هو موضّح في قسم إعداد مشروعك.
  2. ضبط GMSMapView
  3. اطلب من المستخدم قبول الأحكام والشروط والسماح بخدمات الموقع الجغرافي والإشعارات في الخلفية.
  4. أنشئ مصفوفة تحتوي على وجهة واحدة أو أكثر.
  5. حدِّد GMSNavigator للتحكّم في ميزة التنقّل باتّجاهات مفصّلة.

    • أضِف وجهات باستخدام setDestinations.
    • اضبط isGuidanceActive على true لبدء التنقّل.
    • استخدِم simulateLocationsAlongExistingRoute لمحاكاة تقدّم المركبة على طول المسار، وذلك لأغراض الاختبار وتصحيح الأخطاء وتوضيح طريقة عمل تطبيقك.

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

مطالبة المستخدم بمنح الأذونات اللازمة

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

تفويض خدمات الموقع الجغرافي

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

  1. فعِّل إمكانية الوصول إلى الموقع الجغرافي والتشغيل في الخلفية في Xcode:

    1. افتح هدفك في Xcode وانقر على علامة التبويب التوقيع والإمكانات (Signing & Capabilities). للحصول على التفاصيل، يُرجى الاطّلاع على دليل Apple حول إضافة إمكانات إلى تطبيقك.
    2. أضِف إذنَي الوصول إلى الموقع الجغرافي (دائمًا) والموقع الجغرافي (أثناء الاستخدام). في حقل النص الخاص بكل إذن، أضِف شرحًا موجزًا عن سبب حاجة تطبيقك إلى خدمات الموقع الجغرافي (مثلاً: "يحتاج هذا التطبيق إلى إذن لاستخدام خدمات الموقع الجغرافي من أجل توفير ميزة التنقّل خطوة بخطوة").
    3. أضِف إمكانية أوضاع التشغيل في الخلفية، ثم ضَع علامة في مربّع الاختيار تحديثات الموقع الجغرافي. وبدون هذه الإمكانية، يتعطّل التطبيق عند بدء التنقّل. لمعرفة التفاصيل، يُرجى الاطّلاع على دليل Apple حول التعامل مع تحديثات الموقع الجغرافي في الخلفية.
  2. لعرض مربّع حوار التفويض، استدعِ طريقة requestAlwaysAuthorization() لمثيل أداة إدارة الموقع الجغرافي.

Swift

self.locationManager.requestAlwaysAuthorization()

Objective-C

[_locationManager requestAlwaysAuthorization];

الاطّلاع على مستندات Apple الكاملة بشأن منح الإذن باستخدام خدمة الموقع الجغرافي

منح الإذن بتلقّي إشعارات التنبيه للحصول على إرشادات في الخلفية

تحتاج حزمة تطوير البرامج (SDK) الخاصة بخدمة "التنقّل" إلى إذن المستخدم لتقديم إشعارات التنبيهات عندما يكون التطبيق يعمل في الخلفية. أضِف الرمز التالي لطلب إذن المستخدم بعرض هذه الإشعارات:

Swift

UNUserNotificationCenter.current().requestAuthorization(options: [.alert]) {
  granted, error in
    // Handle denied authorization to display notifications.
    if !granted || error != nil {
      print("User rejected request to display notifications.")
    }
}

Objective-C

// Request authorization for alert notifications.
UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
UNAuthorizationOptions options = UNAuthorizationOptionAlert;
[center requestAuthorizationWithOptions:options
                      completionHandler:
 ^(
   BOOL granted,
   NSError *_Nullable error) {
     if (!error && granted) {
       NSLog(@"iOS Notification Permission: newly Granted");
     } else {
       NSLog(@"iOS Notification Permission: Failed or Denied");
     }
   }];

تفويض مستشعرات الحركة

في إصدار رئيسي مستقبلي، ستجمع حزمة تطوير البرامج (SDK) الخاصة بخدمة Navigation API لنظام التشغيل iOS بين بيانات الموقع الجغرافي الأساسية وأجهزة استشعار حركة الجهاز (CMAltimeter) لاحتساب الارتفاع عن سطح البحر للمسار. عندما يصل حزمة تطوير البرامج (SDK) إلى مقياس الارتفاع، يستخدم نظام التشغيل iOS تلقائيًا هذه السلسلة لطلب الإذن من المستخدم.

لا يؤثّر إضافة هذا المفتاح الآن في السلوك الحالي، ولكنّه يمنع حدوث أعطال في عملية التهيئة عند ترقية حزمة SDK لاحقًا.

للاستعداد لعمليات ترقية حزمة SDK المستقبلية، اضبط أذونات مستشعر الحركة على النحو التالي:

  1. افتح هدفك في Xcode وانتقِل إلى علامة التبويب معلومات (Info)، أو افتح ملف Info.plist.

  2. أضِف مفتاحًا جديدًا: Privacy - Motion Usage Description (NSMotionUsageDescription).

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

وافِقوا على الأحكام والشروط

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

Swift

  let termsAndConditionsOptions = GMSNavigationTermsAndConditionsOptions(companyName: "Ride Sharing Co.")

  GMSNavigationServices.showTermsAndConditionsDialogIfNeeded(
    with: termsAndConditionsOptions) { termsAccepted in
    if termsAccepted {
      // Enable navigation if the user accepts the terms.
      self.mapView.isNavigationEnabled = true
      self.mapView.settings.compassButton = true

      // Request authorization to use location services.
      self.locationManager.requestAlwaysAuthorization()

      // Request authorization for alert notifications which deliver guidance instructions
      // in the background.
    UNUserNotificationCenter.current().requestAuthorization(options: [.alert]) {
      granted, error in
        // Handle rejection of notification authorization.
        if !granted || error != nil {
          print("Authorization to deliver notifications was rejected.")
        }
      }
    } else {
      // Handle rejection of terms and conditions.
    }
  }

Objective-C

GMSNavigationTermsAndConditionsOptions *termsAndConditionsOptions = [[GMSNavigationTermsAndConditionsOptions alloc] initWithCompanyName:@"Ride Sharing Co."];

[GMSNavigationServices
  showTermsAndConditionsDialogIfNeededWithOptions:termsAndConditionsOptions
  callback:^(BOOL termsAccepted) {
   if (termsAccepted) {
     // Enable navigation if the user accepts the terms.
     _mapView.navigationEnabled = YES;
     _mapView.settings.compassButton = YES;

     // Request authorization to use the current device location.
     [_locationManager requestAlwaysAuthorization];

     // Request authorization for alert notifications which deliver guidance instructions
     // in the background.
     UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
     UNAuthorizationOptions options = UNAuthorizationOptionAlert;
     [center requestAuthorizationWithOptions:options
                           completionHandler:
     ^(
       BOOL granted,
       NSError *_Nullable error) {
         if (!error && granted) {
           NSLog(@"iOS Notification Permission: newly Granted");
         } else {
           NSLog(@"iOS Notification Permission: Failed or Denied");
         }
       }];
   } else {
     // Handle rejection of the terms and conditions.
   }
 }];

إنشاء طريق وبدء الإرشادات

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

يوضّح المثال التالي:

  • إنشاء مسار جديد يتضمّن وجهة واحدة
  • بدء التوجيه
  • تفعيل إشعارات الإرشادات في الخلفية
  • محاكاة السفر على طول المسار (اختياري)
  • ضبط وضع الكاميرا على "تتبُّع" (اختياري)

Swift

func startNav() {
  var destinations = [GMSNavigationWaypoint]()
  destinations.append(GMSNavigationWaypoint.init(placeID: "ChIJnUYTpNASkFQR_gSty5kyoUk",
                                                 title: "PCC Natural Market")!)

  mapView.navigator?.setDestinations(destinations) { routeStatus in
    self.mapView.navigator?.isGuidanceActive = true
    self.mapView.locationSimulator?.simulateLocationsAlongExistingRoute()
    self.mapView.cameraMode = .following
  }
}

Objective-C

- (void)startNav {
  NSArray<GMSNavigationWaypoint *> *destinations =
  @[[[GMSNavigationWaypoint alloc] initWithPlaceID:@"ChIJnUYTpNASkFQR_gSty5kyoUk"
                                             title:@"PCC Natural Market"]];

  [_mapView.navigator setDestinations:destinations
                             callback:^(GMSRouteStatus routeStatus){
                               [_mapView.locationSimulator simulateLocationsAlongExistingRoute];
                               _mapView.navigator.guidanceActive = YES;
                               _mapView.cameraMode = GMSNavigationCameraModeFollowing;
                             }];
}

لمعرفة المزيد عن معرّفات الأماكن، يُرجى الرجوع إلى معرّفات الأماكن.

سيناريوهات تتضمّن عدّة محطات

يمكنك ضبط 25 نقطة طريق كحدّ أقصى.

لا تتيح طريقة setDestinations الرحلات التي تتضمّن محطات توقّف متعددة. استخدِم continueToNextDestinationWithCompletion() للانتقال إلى نقطة الطريق التالية في الرحلة.

تحديد وضع السفر

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

اضبط السمة travelMode لطريقة عرض الخريطة، كما هو موضّح في المثال التالي:

Swift

self.mapView.travelMode = .cycling

Objective-C

_mapView.travelMode = GMSNavigationTravelModeCycling;

ضبط الطرق التي يجب تجنُّبها

استخدِم السمتَين avoidsHighways وavoidsTolls BOOL لتجنُّب الطرق السريعة أو الطرق التي تتطلّب دفع رسوم أو كليهما على طول المسار.

Swift

self.mapView.navigator?.avoidsTolls = true

Objective-C

_mapView.navigator.avoidsTolls = YES;

ضبط مستوى صوت الإرشادات الصوتية

لضبط مستوى صوت الإرشادات الصوتية، اضبط السمة volumeLevel في أداة التصفّح على منخفض أو عادي أو مرتفع. يستخدم المتصفّح مستوى الصوت الأخير الذي تم حفظه، أو يعود إلى المستوى العادي.

Swift

self.mapView.navigator?.volumeLevel = .low

Objective-C

_mapView.navigator.volumeLevel = GMSNavigationVolumeLevelLow;

أداة البحث عن PlaceID

يمكنك استخدام أداة البحث عن معرّف المكان للعثور على معرّفات الأماكن التي تريد استخدامها كوجهات في المسار. أضِف وجهة من placeID باستخدام GMSNavigationWaypoint.

نص عائم

يمكنك إضافة نص عائم في أي مكان في تطبيقك، طالما أنّ بيان المصدر من Google غير مغطّى. لا يتيح Navigation SDK تثبيت النص على إحداثيات معيّنة (خط العرض وخط الطول) على الخريطة أو على تصنيف. لمزيد من المعلومات، يُرجى الاطّلاع على نوافذ المعلومات.