本頁說明建立自訂導航體驗時,建立自訂導引的大致步驟。
這項程序與導航路線一文所述程序不同,差異如下:
- 您首先要獨立建立導覽工作階段,並透過該工作階段取得導覽器執行個體,而不是呼叫檢視畫面控制器。
- 您設定了事件監聽器,用於回應及管理導覽事件。
使用
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`];