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

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

نظرة عامة

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

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

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

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

قبل استخدام حزمة 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 companyName = "Ride Sharing Co."
GMSNavigationServices.showTermsAndConditionsDialogIfNeeded(
  withCompanyName: companyName) { 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

NSString *companyName = @"Ride Sharing Co.";
[GMSNavigationServices
  showTermsAndConditionsDialogIfNeededWithCompanyName:companyName
  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

نص عائم

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