浏览路线

本指南介绍了如何使用 Navigation SDK for iOS 在应用内绘制前往单个目的地的路线。

概览

  1. 按照设置项目部分中的说明 ,将 Navigation SDK 集成到您的应用中。
  2. 配置 GMSMapView
  3. 提示用户接受相关条款及条件,并授权位置信息服务和后台通知。
  4. 创建一个包含一个或多个目的地的数组。
  5. 定义 GMSNavigator 以控制精细导航。

查看代码

提示用户进行必要的授权

在使用 Navigation SDK 之前,用户必须同意相关条款及条件,并授权使用位置信息服务(导航需要此服务)。如果您的应用将在后台运行,则还必须提示用户授权导航提醒通知。本部分介绍了如何显示所需的授权提示。

授权位置信息服务

Navigation SDK 使用位置信息服务,这需要用户授权。如需启用位置信息服务并显示授权对话框,请按以下步骤操作:

  1. NSLocationWhenInUseUsageDescriptionNSLocationAlwaysAndWhenInUseUsage 键添加到 Info.plist
  2. 对于该值,请简要说明您的应用需要位置信息服务的原因。例如:“此应用需要使用位置信息服务的权限,以便进行精细导航。”

  3. 如需显示授权对话框,请调用位置管理器实例的 requestAlwaysAuthorization() 方法。

Swift

self.locationManager.requestAlwaysAuthorization()

Objective-C

[_locationManager requestAlwaysAuthorization];

请参阅 Apple 关于位置信息服务授权的完整文档

授权后台导航提醒通知

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

创建路线并开始导航

如需绘制路线,请使用一个或多个要访问的目的地 (GMSNavigationWaypoint) 数组调用导航器的 setDestinations() 方法。如果计算成功,路线将显示在地图上。如需开始沿路线导航,请在回调中将 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
  }
}

Objective-C

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

如需了解地点 ID,请参阅地点 ID

多停靠点场景

您最多可以配置 25 个途经点。

setDestinations 方法不支持多停靠点行程。使用 continueToNextDestinationWithCompletion() 将航点推进到行程的下一段。

continueToNextDestinationWithCompletion()

设置出行方式

出行方式决定了将提取哪种类型的路线,以及如何确定用户的路线。您可以为路线设置四种出行方式之一:驾车、骑车、步行和出租车。在驾车和出租车模式下,用户的路线基于行驶方向;在骑车和步行模式下,路线由设备面向的方向(在横屏模式下,面向设备顶部)表示。

设置地图视图的 travelMode 属性,如以下示例所示:

Swift

self.mapView.travelMode = .cycling

Objective-C

_mapView.travelMode = GMSNavigationTravelModeCycling;

设置要避开的道路

使用 avoidsHighwaysavoidsTolls BOOL 属性来避开路线上的高速公路和/或收费公路。

Swift

self.mapView.navigator?.avoidsTolls = true

Objective-C

_mapView.navigator.avoidsTolls = YES;

PlaceID 查找工具

您可以使用 PlaceID 查找工具 查找要用于路线目的地的地点 ID。使用 GMSNavigationWaypointplaceID 添加目的地。

浮动文本

您可以在应用中的任何位置添加浮动文本,只要不遮盖 Google 署名即可。Navigation SDK 不支持将文本锚定到地图上的纬度/经度或标签。如需了解详情, 请参阅 信息窗口