什麼是自訂導覽?

自訂導覽體驗是指,從只將導航引導為背景程序完全消失的應用程式,到將高度客製化指南導向特定畫面 (與執行導覽器裝置不同) 的應用程式,都是自訂的導覽體驗。

什麼是自訂導覽體驗?

  • 開始導航—建立導航工作階段。與 Google 導航體驗一樣,自訂導覽體驗仍需建立導覽執行個體及設定目的地。不過,如果使用自訂導覽體驗,請先使用 GMSNavigationServices 建立導覽工作階段。導覽工作階段是一種輸出狀態的非 UI 物件,可透過檢視控制器或無 UI 控制器運作。

    查看示範:瀏覽版 SDK 內含一個可執行的示範,您可以參考此範例,瞭解在標準導航功能從即時路線指引切換至導航體驗 (其中只顯示裝置位置沿著道路折線移動)。

  • 主動導航 (由您提供)。以下是 Google 提供的導覽體驗與自訂導覽體驗的另一個主要差異。您無須將指引傳送給 Navigation SDK 的內建事件管理員,而是透過 GMSNavigatorListener 啟用即時路線動態饋給並實作事件處理常式。如此一來,您的體驗就能回應「監聽導覽事件」中所述的事件。

  • 結束導航 (由您自行提供)。和 Google 導航體驗一樣,自訂導覽也規定您必須以最適合應用程式使用體驗的方式終止導覽。

下表說明部分自訂導覽情境。

情境示例

高階步驟

您需要為小型裝置 (例如雙輪車輛) 提供純文字的駕駛指引。

建立導航器,並將即時路線指引設定為小螢幕裝置的資料動態饋給,同時駕駛人會在駕駛的手機上執行即時語音指示。請參閱「啟用即時路線資料動態饋給」。

使用您應用程式的駕駛人都希望能在大部分的旅程中取得總覽地圖,而且只針對城市街道提供即時路線指引。

應用程式應讓駕駛人視需求進入及離開 Google 導航體驗,不必更改目的地和行程模式的導覽器設定。

行動交通服務客戶:駕駛人經常行經的既熟悉路線,完全不需指引,但需要確保車輛管理系統能管理配送或行程。

設定導覽器。設定目的地並取得位置更新通知。將 Driver SDK 整合至應用程式。詳情請參閱「隨選乘車與外送服務」或「Last Mile Fleet Solution」的驅動程式 SDK 入門說明。

建立自訂指引

本節說明建立自訂指南的高階步驟。

這項程序與瀏覽路徑中所述的程序不同,如下所示:

  • 首先要單獨建立導覽工作階段,並透過工作階段取得導覽器執行個體,而非呼叫檢視控制器。
  • 您可以設定事件監聽器來回應及管理導航事件。

  1. 使用 GMSNavigationService.createNavigationSession 建立導覽工作階段,並透過 setDestination 呼叫開始導航。Google 導覽體驗透過導覽地圖檢視畫面叫用導覽器時,GMSNavigationServices 可控制及接收來自 UI 執行個體的導覽工作階段事件串流。這表示它可以在沒有 UI 的情況下執行,或傳遞至「任何」以 UI 為基礎的體驗。使用這個方法,導覽工作階段會繼續在應用程式中執行,直到將最後一個參照從中移除為止。
  2. 打造道路施工的定位服務供應商。如果您希望應用程式持續監控位置,例如顯示路線沿途的藍點,請使用位置提供者。
  3. 透過實作 GMSNavigatorListener 通訊協定來設定事件監聽器以取得詳細的即時路線指引。然後將這些資訊轉換為自訂導覽體驗所需的任何項目。例如:
    1. 實作純文字欄位,用於簡易的方向螢幕轉換。
    2. 為自己的 UI 設計及填入欄位。
  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`];