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

Làm theo hướng dẫn này để vẽ biểu đồ tuyến đường trong ứng dụng của bạn tới một điểm đến duy nhất, bằng cách sử dụng SDK điều hướng cho iOS.

Tổng quan

  1. Tích hợp SDK Điều hướng vào ứng dụng như mô tả trong phần Thiết lập dự án của bạ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, cũng như cho phép các 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 để điều khiển tính năng chỉ đường từng chặng.

Xem mã

Nhắc người dùng thực hiện các hoạt động uỷ quyền cần thiết

Trước khi sử dụng SDK Điều hướng, người dùng phải đồng ý với các điều khoản và điều kiện cũng như cho phép sử dụng dịch vụ vị trí. Đây là điều kiện 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 hướng dẫn. Phần này trình bày cách hiển thị các lời nhắc uỷ quyền bắt buộc.

Ủy quyền dịch vụ vị trí

SDK Điều hướng sử dụng dịch vụ vị trí và dịch vụ này cần có sự cho phép của người dùng. Để bật dịch vụ vị trí và hiển thị hộp thoại uỷ quyền, hãy làm theo các bước sau:

  1. Thêm khoá NSLocationAlwaysUsageDescription vào Info.plist.
  2. Đối với giá trị này, hãy thêm nội dung giải thích ngắn gọn về lý do ứng dụng của bạn yêu cầu 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 uỷ quyền, hãy gọi requestAlwaysAuthorization() của thực thể trình quản lý vị trí.

Swift

self.locationManager.requestAlwaysAuthorization()

Objective-C

[_locationManager requestAlwaysAuthorization];

Cho phép thông báo về cảnh báo để xem hướng dẫn ở chế độ nền

SDK Điều hướng cần quyền người dùng để đưa ra thông báo cảnh báo khi ứng dụng đang chạy ở chế độ nền. Thêm mã sau đây để nhắc người dùng cấp quyền hiển thị các 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 để hiện hộp thoại điều khoản và điều kiện, cũng như bật tính năng đ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 các dịch vụ vị trí và thông báo cảnh báo hướng dẫn (như đã trình bày trước đó).

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

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

Để vẽ biểu đồ một tuyến đường, hãy gọi phương thức setDestinations() của Trình điều hướng bằng một mảng chứa một hoặc nhiều đích đến (GMSNavigationWaypoint) để truy cập. Nếu được 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 với điểm đến đầu tiên, đặt isGuidanceActive thành true trong lệnh gọi lại.

Ví dụ sau cho thấy:

  • Đang tạo một tuyến đường mới với 2 điểm đến.
  • Đang bắt đầu hướng dẫn.
  • Bật thông báo hướng dẫn ở chế độ nền.
  • Mô phỏng việc đi lại dọc theo tuyến đường (không bắt buộc).
  • Đặt chế độ máy ảnh 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 Mã địa điểm.

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

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

Đặt thuộc tính travelMode của chế độ xem bản đồ, như trong ví dụ sau:

Swift

self.mapView.travelMode = .cycling

Objective-C

_mapView.travelMode = GMSNavigationTravelModeCycling;

Thiết lập đường cần tránh

Hãy sử dụng các thuộc tính avoidsHighwaysavoidsTolls BOOL để tránh đường cao tốc và/hoặc đường có 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 mã địa điểm

Bạn có thể sử dụng Trình tìm mã địa điểm để tìm mã địa điểm cần sử dụng cho các điểm đến trong tuyến đường.

Văn bản nổi

Bạn có thể thêm văn bản nổi ở bất kỳ đâu trong ứng dụng của mình, miễn là thuộc tính của Google chưa được đề cập. SDK Điều hướng không hỗ trợ liên kết văn bản với vĩ độ/kinh độ trên bản đồ hoặc với một nhãn. Để biết thêm thông tin, hãy xem bài viết Cửa sổ thông tin.