Điều hướng một tuyến đường

Hãy làm theo hướng dẫn này để vẽ một tuyến đường trong ứng dụng của bạn đến một điểm đến duy nhất bằng Navigation SDK cho iOS.

Tổng quan

  1. Tích hợp Navigation SDK vào ứng dụng của bạn, như mô tả trong phần Thiết lập dự án.
  2. Định cấu hình GMSMapView.
  3. Nhắc người dùng chấp nhận các điều khoản và điều kiện, đồng thời cho phép dịch vụ vị trí và thông báo ở chế độ nền.
  4. Tạo một mảng chứa một hoặc nhiều đích đến.
  5. Xác định GMSNavigator để kiểm soát chế độ chỉ đường từng chặng.

    • Thêm đích đến bằng cách sử dụng setDestinations.
    • Đặt isGuidanceActive thành true để bắt đầu chế độ chỉ đường.
    • Sử dụng simulateLocationsAlongExistingRoute để mô phỏng tiến trình của xe dọc theo tuyến đường, cho mục đích kiểm thử, gỡ lỗi và minh hoạ ứng dụng của bạn.

Xem mã

Nhắc người dùng cấp các quyền uỷ quyền cần thiết

Trước khi sử dụng Navigation SDK, người dùng phải đồng ý với các điều khoản và điều kiện, đồng thời cho phép sử dụng dịch vụ vị trí (bắt buộc để điều hướng). Nếu chạy ở chế độ nền, ứng dụng của bạn cũng phải nhắc người dùng cho phép thông báo cảnh báo chỉ dẫn. Phần này cho biết cách hiển thị các lời nhắc uỷ quyền bắt buộc.

Cho phép dịch vụ vị trí

Navigation SDK sử dụng dịch vụ vị trí và yêu cầu người dùng uỷ quyền. Để bật dịch vụ vị trí và hiển thị hộp thoại uỷ quyền, hãy thực hiện các bước sau:

  1. Thêm khoá NSLocationAlwaysUsageDescription vào Info.plist.
  2. Đối với giá trị, hãy thêm một lời giải thích ngắn gọn về lý do ứng dụng của bạn cần dịch vụ vị trí. Ví dụ: "Ứng dụng này cần có quyền sử dụng dịch vụ vị trí để chỉ đường từng chặng."

  3. Để hiển thị hộp thoại cấp quyền, hãy gọi requestAlwaysAuthorization() của phiên bản trình quản lý vị trí.

Swift

self.locationManager.requestAlwaysAuthorization()

Objective-C

[_locationManager requestAlwaysAuthorization];

Cho phép thông báo cảnh báo để nhận hướng dẫn trong nền

Navigation SDK cần có sự cho phép của người dùng để cung cấp thông báo cảnh báo khi ứng dụng đang chạy ở chế độ nền. Thêm mã sau để nhắc người dùng cấp quyền hiển thị những thông báo này:

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

Chấp nhận các điều khoản và điều kiện

Sử dụng mã sau đây để hiện hộp thoại điều khoản và điều kiện, đồng thời cho phép điều hướng khi người dùng chấp nhận các điều khoản. Xin lưu ý rằng ví dụ này bao gồm mã cho dịch vụ vị trí và thông báo cảnh báo hướng dẫn (đã trình bày trước đó).

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

Tạo tuyến đường và bắt đầu hướng dẫn

Để vẽ một tuyến đường, hãy gọi phương thức setDestinations() của Navigator bằng một mảng chứa một hoặc nhiều đích đến (GMSNavigationWaypoint) cần ghé thăm. Nếu tính toán thành công, tuyến đường sẽ xuất hiện trên bản đồ. Để bắt đầu hướng dẫn dọc theo tuyến đường, bắt đầu từ đích đến đầu tiên, hãy đặt isGuidanceActive thành true trong lệnh gọi lại.

Ví dụ sau đây cho thấy:

  • Tạo một tuyến đường mới có 2 điểm đến.
  • Bắt đầu hướng dẫn.
  • Bật thông báo hướng dẫn trong nền.
  • Mô phỏng hành trình dọc theo tuyến đường (không bắt buộc).
  • Đặt chế độ camera thành "theo dõi" (không bắt buộc).

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

Để tìm hiểu về mã địa điểm, vui lòng tham khảo bài viết Mã địa điểm.

Đặt phương tiện đi lại

Chế độ di chuyển xác định loại tuyến đường sẽ được tìm nạp và cách xác định lộ trình của người dùng. Bạn có thể đặt một trong bốn chế độ di chuyển cho một tuyến đường: lái xe, đạp xe, đi bộ và đi taxi. Ở chế độ lái xe và đi taxi, tuyến đường của người dùng dựa trên hướng di chuyển; ở chế độ đạp xe và đi bộ, tuyến đường được biểu thị bằng hướng mà thiết bị đang hướng tới (về phía đầu thiết bị ở chế độ ngang).

Đặt thuộc tính travelMode của khung hiển thị bản đồ, như trong ví dụ sau:

Swift

self.mapView.travelMode = .cycling

Objective-C

_mapView.travelMode = GMSNavigationTravelModeCycling;

Đặt những con đường cần tránh

Sử dụng các thuộc tính avoidsHighwaysavoidsTolls BOOL để tránh đường cao tốc và/hoặc đường thu phí dọc theo một tuyến đường.

Swift

self.mapView.navigator?.avoidsTolls = true

Objective-C

_mapView.navigator.avoidsTolls = YES;

Công cụ tìm PlaceID

Bạn có thể sử dụng Công cụ tìm PlaceID để tìm mã địa điểm cần dùng cho đích đến của tuyến đường. Thêm điểm đến từ placeIDGMSNavigationWaypoint.

Văn bản nổi

Bạn có thể thêm văn bản nổi ở bất kỳ vị trí nào trong ứng dụng, miễn là thông tin ghi nhận quyền sở hữu của Google không bị che khuất. Navigation SDK không hỗ trợ việc cố định văn bản vào một vĩ độ/kinh độ trên bản đồ hoặc vào một nhãn. Để biết thêm thông tin, hãy xem bài viết Cửa sổ thông tin.