什么是自定义导航?

自定义导航体验可能意味着一切:从完全消除转弯导航并将导航作为后台进程的应用,到将高度自定义的导航投影到独立于运行导航器的设备的屏幕的应用。

什么是自定义导航体验?

  • 开始导航 - 您创建一个导航会话。与 Google 导航体验一样,自定义导航体验仍然涉及创建导航实例和设置目的地。不过,对于自定义导航体验,您可以先使用 GMSNavigationServices 建立导航会话,从而实现此目的。导航会话是具有状态的非界面对象,可以使用视图控制器,也可以不使用视图控制器。

    查看演示:Navigation SDK 的下载中包含了一个演示,您可以运行演示来查看该导航体验示例,该示例可在标准导航的精细导航与仅显示设备位置沿道路多段线移动的导航体验之间切换。

  • 主动导航 - 由您提供。下面是 Google 提供的导航体验和自定义导航体验之间的另一个主要区别。您可以通过 GMSNavigatorListener 启用精细导航 Feed 并实现事件处理脚本,而不是将指导移交给 Navigation SDK 的内置事件管理器。这样,您的体验就可以响应监听导航事件中描述的事件。

  • 结束导航(由您提供)。与 Google 导航体验一样,自定义导航还要求您以最适合应用体验的方式终止导航。

下表介绍了一些自定义导航场景。

示例场景

简要步骤

您需要为小型设备(如两轮车辆)提供纯文本驾驶指导。

创建导航器,并将精细导航设置为小屏幕设备的数据 Feed,同时导航器在驾驶员的手机上超出其即时视图之外运行时。请参阅启用精细数据 Feed

使用应用的驾驶人需要查看大部分行程的概览地图,只提供最少量的城市街道精细导航。

您的应用应允许驾驶员根据需要进入和退出 Google 导航体验,而不改变导航器的目的地和行程模式设置。

对于移动服务客户:驾驶人通常会行驶高度熟悉的成熟路线,完全不需要指导,但您需要一种方法来确保车辆管理系统可以管理送货或行程。

设置导航器。设置目的地并获取位置信息更新。将驱动程序 SDK 集成到您的应用中。如需了解详情,请参阅适用于按需行程和交付的驱动程序 SDK 使用入门或最后一公里舰队解决方案

创建自定义指导

本部分概要介绍了创建自定义指南时应遵循的步骤。

此过程与路线导航中所述的过程不同,具体如下

  • 您首先要单独建立导航会话,并通过该会话(而不是通过调用视图控制器)获取导航器实例。
  • 您可以设置事件监听器来响应和管理导航事件。

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