本頁說明在自訂導覽體驗中建立自訂指引時採取的高階步驟。
這項程序與導覽路徑中所述的程序不同,如下所示:
- 首先,您必須單獨建立導覽工作階段,並透過工作階段取得導覽器執行個體,而不是呼叫檢視控制器。
- 您可以設定事件監聽器,以回應及管理導覽事件。
- 使用
GMSNavigationService.createNavigationSession
建立導覽工作階段,然後使用setDestination
呼叫開始導航。如果 Google 導航體驗透過導覽地圖檢視畫面叫用導覽器,GMSNavigationServices
會控制並從 UI 執行個體「獨立」接收來自導覽工作階段的事件串流。這表示它可以在沒有 UI 的情況下執行,或傳遞至「任何」UI 式體驗。使用這個方法時,導覽工作階段會持續在應用程式中執行,直到最後一個參照移除為止。 - 建立道路封閉的定位服務供應商。如果您希望應用程式持續監控位置,例如顯示路徑沿途有藍點的導航檢視畫面時,請使用位置提供者。
- 透過實作
GMSNavigatorListener
通訊協定,設定事件監聽器以取得詳細即時路線指引。然後視需要將該資訊轉換為自訂導航體驗所需的資料。例如:- 實作純文字欄位,用於簡單的路線投放畫面。
- 為自己的 UI 設計及填入欄位。
- 設定導覽模擬工具。這對開發和測試來說是必要的。
建立獨立導覽工作階段
下列示範的程式碼片段顯示獨立從檢視控制器建立的導覽。接著,程式碼會新增總覽圖,以顯示目前道路封閉的位置。
// 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`];