本页面介绍了您在打造自定义导航体验过程中的自定义导航时遵循的简要步骤。
该过程与路线导航中描述的过程不同,具体如下所述:
- 首先,独立建立导航会话,并通过会话(而不是调用视图控制器)获取导航器实例。
- 您可以设置事件监听器来响应和管理导航事件。
- 使用
GMSNavigationService.createNavigationSession
创建导航会话,并通过setDestination
调用开始导航。如果 Google 导航体验通过导航地图视图调用导航器,GMSNavigationServices
会独立于界面实例控制和接收来自导航会话的事件流。这意味着它既可以在没有界面的情况下运行,也可以传递给任何基于界面的体验。使用此方法,导航会话会继续在您的应用中运行,直到从应用中移除最后一个引用。 - 建立道路拦截位置信息提供程序。如果您希望应用持续监控位置信息(例如,在路线沿途显示带有蓝点的导航视图时),请使用位置信息提供程序。
- 通过实现
GMSNavigatorListener
协议,设置监听器以获取详细的精细导航。然后,将相应信息转换为提供自定义导航体验所需的任何信息。例如:- 实现纯文本字段,用于路线的简单抓屏。
- 针对您自己的界面设计和填充字段。
- 设置导航模拟器。这对于开发和测试而言是必要的。
创建独立的导航会话
该演示中的以下代码段展示了独立于视图控制器建立的导航。然后,该代码会添加一个总览图,该图配置为显示当前道路截取的位置。
// 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`];