پیمایش مسیر

این راهنما را دنبال کنید تا بااستفاده از Navigation SDK for iOS، مسیری را در برنامه‌تان به یک مقصد واحد ترسیم کنید.

نمای کلی

  1. همان‌طور که در بخش راه‌اندازی پروژه شرح داده شده است، Navigation SDK را در برنامه‌تان ادغام کنید.
  2. GMSMapView را پیکربندی کنید.
  3. از کاربر بخواهید شرایط خدمات را بپذیرد و خدمات مکان و اعلان‌های پس‌زمینه را مجاز کند.
  4. آرایه‌ای حاوی یک یا چند مقصد ایجاد کنید.
  5. GMSNavigator را برای کنترل ناوبری گام‌به‌گام تعریف کنید.

    • بااستفاده از setDestinations مقصد اضافه کنید.
    • برای شروع ناوبری، isGuidanceActive را روی true تنظیم کنید.
    • از simulateLocationsAlongExistingRoute برای شبیه‌سازی پیشرفت خودرو درطول مسیر، برای آزمایش، اشکال‌زدایی، و نمایش برنامه‌تان استفاده کنید.

دیدن کد

از کاربر بخواهید مجوزهای لازم را ارائه دهد

قبل‌از استفاده از Navigation SDK، کاربر باید با شرایط خدمات موافقت کند و اجازه استفاده از خدمات مکان را بدهد، که برای ناوبری لازم است. اگر برنامه‌تان در پس‌زمینه اجرا می‌شود، باید از کاربر بخواهد اعلان‌های هشدار راهنمایی را مجاز کند. این بخش نشان می‌دهد چگونه پیام‌واره‌های مجوز لازم را نمایش دهید.

مجاز کردن خدمات مکان

کیت توسعه نرم‌افزار ناوبری از خدمات مکان استفاده می‌کند که به مجوز کاربر نیاز دارد. برای فعال کردن خدمات مکان و نمایش کادر گفتگوی صدور مجوز، این مراحل را دنبال کنید:

  1. قابلیت‌های مکان و پس‌زمینه را در Xcode فعال کنید:

    1. هدف خود را در Xcode باز کنید و برگه Signing & Capabilities را انتخاب کنید. برای جزئیات، راهنمای Apple درباره افزودن قابلیت‌ها به برنامه را ببینید.
    2. قابلیت‌های مکان (همیشه) و مکان (هنگام استفاده) را اضافه کنید. در فیلد نوشتاری هرکدام، توضیح کوتاهی درباره اینکه چرا برنامه‌تان به خدمات مکان نیاز دارد اضافه کنید (برای مثال: «این برنامه برای ناوبری گام‌به‌گام به اجازه استفاده از خدمات مکان نیاز دارد»).
    3. قابلیت حالت‌های پس‌زمینه را اضافه کنید، سپس چارگوش انتخاب به‌روزرسانی‌های مکان را انتخاب کنید. بدون این قابلیت، برنامه هنگام شروع ناوبری ازکار می‌افتد. برای جزئیات، راهنمای Apple را درباره مدیریت به‌روزرسانی‌های مکان در پس‌زمینه ببینید.
  2. برای نمایش کادر گفتگوی صدور مجوز، requestAlwaysAuthorization() روش نمونه مدیر مکان را فراخوانی کنید.

Swift

self.locationManager.requestAlwaysAuthorization()

آبجکتیو-سی

[_locationManager requestAlwaysAuthorization];

اسناد کامل Apple را برای مجوز خدمات مکان ببینید.

مجاز کردن اعلان‌های هشدار برای راهنمایی در پس‌زمینه

کیت توسعه نرم‌افزار ناوبری برای ارائه اعلان‌های هشدار در زمانی که برنامه در پس‌زمینه اجرا می‌شود، به اجازه کاربر نیاز دارد. کد زیر را اضافه کنید تا از کاربر برای نمایش این اعلان‌ها اجازه خواسته شود:

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

آبجکتیو-سی

// 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");
     }
   }];

مجاز کردن حسگرهای حرکتی

در نسخه اصلی آتی، «کیت توسعه نرم‌افزار پیمایش» برای iOS داده‌های مکان اصلی را با حسگرهای حرکتی دستگاه (CMAltimeter) ترکیب می‌کند تا ارتفاع مسیر را محاسبه کند. وقتی SDK به ارتفاع‌سنج دسترسی پیدا می‌کند، iOS به‌طور خودکار از این رشته برای درخواست اجازه از کاربر استفاده می‌کند.

افزودن این کلید درحال‌حاضر تأثیری بر رفتار فعلی ندارد اما از ازکارافتادن مقداردهی اولیه هنگام ارتقای کیت توسعه نرم‌افزار در آینده جلوگیری می‌کند.

برای آماده شدن برای ارتقاهای آتی کیت توسعه نرم‌افزار، مجوزهای حسگر حرکتی را به‌صورت زیر پیکربندی کنید:

  1. هدف خود را در Xcode باز کنید و به برگه اطلاعات بروید، یا فایل 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.
    }
  }

آبجکتیو-سی

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

آبجکتیو-سی

- (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;
                             }];
}

برای آشنایی با «شناسه‌های مکان»، به شناسه‌های مکان مراجعه کنید.

سناریوهای چندایستگاهی

می‌توانید حداکثر ۲۵ نقطه‌مسیر پیکربندی کنید.

روش setDestinations از سفرهای چندایستگاهی پشتیبانی نمی‌کند. از continueToNextDestinationWithCompletion() برای پیش بردن نقطه‌مسیر به بخش بعدی سفر استفاده کنید.

تنظیم حالت سفر

حالت سفر هم نوع مسیر برای واکشی و هم نحوه تعیین مسیر کاربر را تعریف می‌کند. می‌توانید یکی از چهار حالت سفر را برای مسیر تنظیم کنید: رانندگی، دوچرخه‌سواری، پیاده‌روی، و تاکسی. در حالت رانندگی و تاکسی، مسیر کاربر براساس جهت سفر است؛ در حالت دوچرخه‌سواری و پیاده‌روی، مسیر با جهتی که دستگاه به‌سمت آن است (به‌سمت بالای دستگاه در حالت افقی) نشان داده می‌شود.

ویژگی travelMode نمای نقشه را همان‌طور که در مثال زیر نشان داده شده است تنظیم کنید:

Swift

self.mapView.travelMode = .cycling

آبجکتیو-سی

_mapView.travelMode = GMSNavigationTravelModeCycling;

تنظیم جاده‌هایی که باید از آن‌ها اجتناب شود

از ویژگی‌های avoidsHighways و avoidsTolls BOOL برای اجتناب از بزرگراه‌ها، جاده‌های عوارضی، یا هر دو درطول مسیر استفاده کنید.

Swift

self.mapView.navigator?.avoidsTolls = true

آبجکتیو-سی

_mapView.navigator.avoidsTolls = YES;

تنظیم میزان صدای راهنمای صوتی

برای تنظیم میزان صدای راهنمای صوتی، ویژگی volumeLevel را در ناوبر روی کم، عادی، یا زیاد تنظیم کنید. ناوبر از آخرین سطح صدای ذخیره‌شده استفاده می‌کند، یا به‌طور پیش‌فرض روی سطح عادی تنظیم می‌شود.

Swift

self.mapView.navigator?.volumeLevel = .low

آبجکتیو-سی

_mapView.navigator.volumeLevel = GMSNavigationVolumeLevelLow;

یابنده شناسه مکان

می‌توانید از PlaceID Finder برای پیدا کردن شناسه مکان‌ها برای استفاده در مقصد مسیرها استفاده کنید. افزودن مقصد از placeID با GMSNavigationWaypoint.

نوشتار شناور

می‌توانید نوشتار شناور را در هرجایی از برنامه‌تان اضافه کنید، به‌شرطی که ارجاع Google پوشانده نشود. Navigation SDK از لنگر انداختن نوشتار به مختصات خاص (عرض جغرافیایی، طول جغرافیایی) روی نقشه یا به برچسب پشتیبانی نمی‌کند. برای اطلاعات بیشتر، پنجره‌های اطلاعات را ببینید.