建立自訂指引

本頁將概略說明如何建立自訂指引,作為自訂導航體驗的一部分。

這項程序與「導航路線」一文所述的程序不同,如下所述:

  • 您必須先獨立建立導覽工作階段,然後透過工作階段取得導覽器例項,而非呼叫 View Controller。
  • 您可以設定事件監聽器,用於回應及管理導覽事件。
  1. 使用 GMSNavigationService.createNavigationSession 建立導覽工作階段,並透過 setDestination 呼叫開始導覽。如果 Google 導航體驗透過導航地圖檢視畫面叫用導航器,GMSNavigationServices 會從 UI 例項獨立控制並接收導航工作階段的事件串流。這表示它可以在沒有 UI 的情況下執行,也可以傳遞至任何以 UI 為基礎的體驗。使用這種方法時,導覽工作階段會持續在應用程式中執行,直到最後一個參照項目從應用程式中移除為止。
  2. 建立道路對齊位置提供者。如果您希望應用程式持續監控位置,例如在顯示沿路點選藍點的導覽檢視畫面時,請使用位置供應器。
  3. 設定監聽器,以便取得詳細的即時路線指引,方法是實作 GMSNavigatorListener 通訊協定。接著,將這些資訊轉換為自訂導覽體驗所需的任何資訊。例如:
    1. 實作純文字欄位,以便簡單投放方向資訊畫面。
    2. 設計並填入自有 UI 的欄位。
  4. 設定導航模擬工具。這對開發和測試作業至關重要。

建立獨立的導覽工作階段

以下是來自範例的程式碼片段,顯示從 View Controller 獨立建立的導覽。接著,程式碼會新增概覽地圖,並將其設為顯示目前經過路徑的拍攝位置。

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