建立自訂指引

本頁說明在自訂導覽體驗中建立自訂指引時採取的高階步驟。

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

  • 首先,您必須單獨建立導覽工作階段,並透過工作階段取得導覽器執行個體,而不是呼叫檢視控制器。
  • 您可以設定事件監聽器,以回應及管理導覽事件。
  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`];