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

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

نظرة عامة

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

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

طلب التفويضات اللازمة من المستخدم

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

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

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

  1. أضِف مفتاح NSLocationAlwaysUsageDescription إلى Info.plist.
  2. بالنسبة إلى القيمة، أضِف شرحًا موجزًا لسبب طلب التطبيق للموقع الجغرافي. على سبيل المثال: "يحتاج هذا التطبيق إلى إذن لاستخدام خدمات الموقع الجغرافي من أجل اتّجاهات مفصّلة".

  3. لعرض مربّع حوار التفويض، يمكنك طلب requestAlwaysAuthorization() من مثيل مدير الموقع.

Swift

self.locationManager.requestAlwaysAuthorization()

Objective-C

[_locationManager requestAlwaysAuthorization];

السماح بإشعارات التنبيهات للإرشادات في الخلفية

حزمة تطوير البرامج (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");
     }
   }];

قبول الأحكام والشروط

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

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")!)
  destinations.append(GMSNavigationWaypoint.init(placeID:"ChIJJ326ROcSkFQRBfUzOL2DSbo",
                                                 title:"Marina Park")!)

  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"],
    [[GMSNavigationWaypoint alloc] initWithPlaceID:@"ChIJJ326ROcSkFQRBfUzOL2DSbo"
                                             title:@"Marina Park"]];

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

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

ضبط وضع السفر

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

ضبط 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;

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

يمكنك استخدام PlaceID Finder للعثور على أرقام تعريف أماكن لاستخدامها مع وجهات المسارات. إضافة وجهة من placeID باستخدام GMSNavigationWaypoint

نص عائم

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