创建自定义指导

本页介绍了您在创建自定义指导时需要遵循的简要步骤,这是自定义导航体验的一部分。

此流程与规划路线中所述的流程不同,具体如下

  • 您首先独立建立导航会话,并通过该会话获取导航器实例,而不是通过调用视图控制器来获取。
  • 您可以设置一个事件监听器来响应和管理导航事件。
  1. 使用 GMSNavigationService.createNavigationSession 创建导航会话,并通过 setDestination 调用开始导航。Google 导航体验通过导航地图视图调用导航器,而 GMSNavigationServices 从导航会话独立于界面实例控制并接收事件流。这意味着,它可以不使用界面运行,也可以传递给任何基于界面的体验。采用这种方法,导航会话会在应用中持续运行,直到从应用中移除最后一个引用。
  2. 建立贴合道路的位置信息提供程序。如果您希望应用能够持续监控位置信息,例如在沿路线显示带有蓝点的导航视图时,请使用位置信息提供程序。
  3. 通过实现 GMSNavigatorListener 协议,为详细的逐向导航设置监听器。然后,将该信息转换为自定义导航体验所需的任何内容。例如:
    1. 实现纯文本字段,以便简单地投屏路线。
    2. 设计并填充您自己的界面字段。
  4. 设置导航模拟器。这是开发和测试所必需的。

创建独立的导航会话

以下代码段来自演示,展示了独立于视图控制器的导航。然后,该代码会添加一个概览地图,该地图配置为显示当前贴合道路的位置。

// Create the navigation session.

 _navigationSession = [GMSNavigationServices createNavigationSession];
 GMSRoadSnappedLocationProvider *roadSnappedLocationProvider =
     _navigationSession.roadSnappedLocationProvider;
 [roadSnappedLocationProvider startUpdatingLocation];
 GMSNavigator *navigator = _navigationSession.navigator;
 [navigator addListener:self];
 navigator.voiceGuidance = GMSNavigationVoiceGuidanceSilent;
 navigator.sendsBackgroundNotifications = NO;
 _navigationSession.started = YES;
​​ [navigator setDestinations:@[ destination ]
                   callback:^(GMSRouteStatus routeStatus) {
                      // …handle changes in route status.
                    }];

 // Add an overview map.
 _mapView = [[GMSMapView alloc] initWithFrame:CGRectZero];
 [self.mainStackView addArrangedSubview:_mapView];
 [self.mainStackView setNeedsLayout];
 _mapView.settings.compassButton = YES;
 _mapView.delegate = self;
 _mapView.myLocationEnabled = YES;
 _mapView.roadSnappedMyLocationSource = roadSnappedLocationProvider;

将导航从自定义体验传递到 Google 体验

此代码段展示了如何让用户从自定义导航体验进入 Google 导航体验。此代码段还展示了应用在共享地图时如何进行此转换。

`UIButton *button = [UIButton buttonWithType:UIButtonTypePlain`];

[`button addTarget:self action:@selector(didTapEnterGoogleNavigationButton:)
forControlState:[_directionsButton addTarget:self`];

`…`

[`_mapView enableNavigationWithSession:_navigationSession`];